APT в ALT Linux/Советы по использованию: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
 
(не показано 59 промежуточных версий 14 участников)
Строка 1: Строка 1:
== Сводка по обновлению ==
Поставьте пакет {{pkg|apt-printchanges}} и перед обновлением пакета будет выводиться его changelog.
== Использование proxy ==
== Использование proxy ==


Строка 6: Строка 9:
  Acquire::http::Proxy "http://[user[:pass]@]host[:port]/";
  Acquire::http::Proxy "http://[user[:pass]@]host[:port]/";


либо выставить переменную окружения <tt>http_proxy</tt>.
либо выставить переменную окружения <tt>http_proxy</tt>:
 
export http_proxy='http://user:passwd@host:port/'
 
{{Note|Проблема git.altlinux.org и Squid.
При подключении [[Карманы|репозитория-кармана]] Squid не определяет, что произошли изменения, и не даёт скачать обновлённый индекс. Для борьбы с этим можно отключить использование прокси для git.altlinux.org, для чего добавить в apt.conf
Acquire::http::Proxy::git.altlinux.org "DIRECT";
Альтернативным вариантом является использование возможности задать ограничение на кэширование некоторых объектов в Squid. Для этого в <tt>/etc/squid/squid.conf</tt> можно добавить что-то вроде
<pre>acl REPO url_regex (pkglist|release)$
no_cache deny REPO</pre>
В данном примере отключается кэширование индексов в любых источниках, что может быть даже интереснее.
}}


=== FTP-прокси ===
=== FTP-прокси ===
Строка 14: Строка 28:


либо выставить переменную окружения <tt>ftp_proxy</tt>.
либо выставить переменную окружения <tt>ftp_proxy</tt>.
=== RSYNC-прокси ===
<tt>/etc/apt/apt.conf</tt>:
Acquire::rsync::proxy="[user[:pass]@]host[:port]";
Acquire::rsync::proxy::hostname="none";
либо выставить переменную окружения <tt>RSYNC_PROXY</tt>.
* При использовании репозиториев на разных хостах возможно задание proxy для всех хостов и для каждого в отдельности.
* Значение для конкретного хоста перекрывает глобальное значение.
* Значение "none" указывает, что необходимо использовать прямое соединение.
'''Пример:'''
Acquire::rsync::proxy="192.168.1.1:3128";
Acquire::rsync::proxy::mirror.localdomain="none";
Будет использоваться http-proxy "192.168.1.1:3128" для всех хостов, кроме mirror.localdomain, для которого будет использоваться прямое соединение.


=== HTTP-прокси для проксирования FTP-запросов ===
=== HTTP-прокси для проксирования FTP-запросов ===


Не рекомендуется из-за низкой эффективности и не поддерживается настройками в конфигурационном файле. В случае крайней необходимости - определите переменную окружения <tt>ftp_proxy</tt> в HTTP URL.
Не рекомендуется из-за низкой эффективности и не поддерживается настройками в конфигурационном файле. В случае крайней необходимости - определите переменную окружения <tt>ftp_proxy</tt> в HTTP URL.
===См. так же===
*[[Alterator-sysconfig/proxy|Альтератор - Модуль "Прокси-сервер"]]
== Использование HTTPS ==
Для использования транспорта https следует установить пакет {{pkg|apt-https}} (доступен с [[p9]]):
# apt-get install apt-https


== Поиск пакетов, использующих данную библиотеку ==
== Поиск пакетов, использующих данную библиотеку ==


  apt-cache showpkg libuuid.so.1
  apt-cache showpkg libuuid.so.1
<!--


== Установка всех пакетов, найденных через apt-cache ==
== Установка всех пакетов, найденных через apt-cache ==


  apt-get install `apt-cache search <package name>|grep <package name>`
  apt-get install `apt-cache search <package name>|grep <package name>`
это очевидно некорректное использование вывода apt-cache search с учётом его формата! -- mike@
Тогда так:
epm search --short <search string> | epm install
-->
== Обновление системы «вниз» ==
Внимание! Такое обновление может привести к непредсказуемым последствиям, ибо майнтейнеры пакетов не проверяют работу обновления в таких условиях.
{{main|Downgrade}}
== apt-scripts: «ненужное» и «не в текущем репо» ==
Описано по мотивам [http://lists.altlinux.org/pipermail/sisyphus/2006-June/302208.html письма at@]; для начала '''потребуется''' установить пакет {{pkg|apt-scripts}}.
=== apt-cache list-extras ===
Показывает пакеты, которые отсутствуют в репозитории (совпадение по имени пакета, кроме специальных случаев типа Allow-Duplicated, в которых версия также учитывается).
Непустой вывод означает, что перечисленных пакетов больше нет в репозитории. Следовательно, эти пакеты, скорее всего, устарели или перестали собираться (и поэтому, быть может, стоит их снести). Предварительно следует обновиться до текущего состояния репозитория, так как не исключено, что их заменили какие-то новые пакеты.
apt-get remove `apt-cache list-extras | grep -v "^kernel-\(image\|modules\)\|^apt-conf\|^altlinux-release\|^branding-altlinux"`
{{Attention|Обычное обновление не обновляет автоматически ядро, потому команда, с высокой степенью вероятности, выдаст в списке установленные ядра с модулями. Их удаление приведёт к невозможности загрузки системы. В примере этот момент учтён посредством "grep -v ...".<br><br>Аналогично, удаление apt-conf-*, приведёт к удалению apt, хотя это можно будет исправить доустановкой через rpm. Можно, предварительно, установить нужный apt-conf, например <source lang="Bash">apt-get install apt-conf-branch</source> Так же следует аккуратно относиться к пакетам вида altlinux-release-*, от которых зависит пакет basesystem}}
{{Attention|Если Вы увидите предупреждение "To continue type in the phrase 'Yes, do as I say!'" вместо обычного (Y/n), то остановитесь и внимательно посмотрите, что именно предлагается к удалению. Эта фраза означает попытку удаления критически важного c точки зрения {{pkg|apt}} пакета. Как правило, такие пакеты можно только менять на какие-то другие (хотя это же предупреждение будет и при замене).}}
=== apt-cache list-nodeps ===
Показывает пакеты, от которых не зависят какие-либо другие пакеты, установленные в системе. То есть эти пакеты «никому не нужны» и их можно удалить с помощью {{cmd|rpm -e}}.


== Обновление системы "вниз" ==
Среди этого списка можно обнаружить неиспользуемые библиотеки, примерно так:


Внимание! Такое обновление может привести к непредсказуемым последствиям, ибо майнтайнеры пакетов не проверяют работу обновления в таких условиях.
$ apt-cache list-nodeps |grep '^lib[^-]*$'
libgtk+mdk
libmysqlclient10
[...]


Обновление "вниз" с Sisyphus до Server 4.0:
Эти библиотеки, вероятно, стоит снести:


<tt>/etc/apt/preferences</tt>:
$ apt-cache list-nodeps |grep '^lib[^-]*$' |grep -v libreoffice |xargs -r sudo rpm -e
Package: *
Pin: release l=Server
Pin-Priority: 1001


И последующий <tt>apt-get dist-upgrade</tt>.
Аналогично можно поступить с неиспользуемыми модулями (<tt>^python-</tt>, <tt>^perl-</tt>, ...), если не устанавливали что-либо самостоятельно с целью получения дополнительной функциональности.


Полная информация о предпочтениях (preferences) APT: <tt>apt_preferences(5)</tt>
{{Attention|C <tt>^lib</tt> могут начинаться не только названия пакетов с библиотеками: пример с libreoffice представлен в команде.}}
{{Attention|Пакет, напоминающий библиотеку по названию и содержимому, может оказаться плагином. Удаление плагинов может привести к отключению каких-то функций у использующих их приложений. Обычно, функциональность можно восстановить, просто установив плагин снова.}}
 
Проще всего использовать
$ epm autoremove
который делает всё вышеперечисленное с учётом вышеперечисленных замечаний.
 
== apt-scripts: удаление дубликатов пакетов ==
Иногда в процессе обновления может произойти что-то непредвиденное (отключение питания например). В подобной ситуации, как правило, в базе rpm остаются двойные пакеты. В {{pkg|apt-scripts}} {{since|0.1.4-alt1}} реализована команда dedup для упрощения борьбы с такими последствиями (https://lists.altlinux.org/pipermail/sisyphus/2019-June/367974.html). Установите {{pkg|apt-scripts}}, если пакет ещё не установлен, и запустите команду:
# apt-get dedup


== APT совместно с /usr, смонтированным в режиме read only ==
== APT совместно с /usr, смонтированным в режиме read only ==


(не проверено)
{{path|/etc/apt/apt.conf}}:
 
/etc/apt/apt.conf:
  RPM
  RPM
  {
  {
Строка 52: Строка 126:
   Post-Invoke {"mount -o remount,ro /usr";};
   Post-Invoke {"mount -o remount,ro /usr";};
  }
  }
работает в 4.0, в 4.1, начиная с некоторого времени, что-то сломалось (появились файлтриггеры?) и после установки пакетов выдает ошибки типа такого
Done.
mount: /usr is busy
E: Sub-process mount -o remount,ro /usr returned an error code (32)
E: Problem executing scripts RPM::Post-Invoke 'mount -o remount,ro /usr'
E: Sub-process returned an error code
== Hold пакета (Заблокировать версию пакета) ==
Иногда требуется предотвратить обновление какого-то пакета, например, {{pkg|nxclient}}. Чтобы решить эту проблему, создаём файл {{path|90-apt-hold.conf}} (название особенного значения не имеет, но должно заканчиваться на .conf) в каталоге {{path|/etc/apt/apt.conf.d/}}:
# echo 'RPM::Hold { nxclient; };' >> /etc/apt/apt.conf.d/90-apt-hold.conf
Холд установлен. Также можно посмотреть почитать [http://apt-rpm.org/tricks.shtml ссылка неактуальна][http://web.archive.org/web/20190608101610/http://apt-rpm.org/tricks.shtml статья в архиве]. Имя пакета может быть задано в виде регулярного выражения и, соответственно, может иметь более сложный вид, чем в примере.
Файл может иметь и многострочный формат, примером может быть соответствующая секция в {{path|/etc/apt/apt.conf}}.
Hold не работает, если обновляется какой-то другой пакет, имеющий зависимость на пакет, указанный в этой секции. Например, это не сработает для библиотек, либо вместе с библиотекой надо указывать все остальные пакеты, которым она нужна.
Если Вы пользуетесь {{pkg|synaptic}} или {{pkg|aptitude}}, там тоже есть возможность соответствующей настройки.
{{pkg|synaptic}}: <tt>Пакет - Заблокировать версию</tt>; {{pkg|aptitude}}: {{cmd|aptitude hold nxclient}}.
== Установка виртуального пакета без вопросов о конкретном варианте ==
Порой apt спотыкается о наличие нескольких вариантов реальных пакетов, предоставляющих один и тот же затребованный виртуальный; если понимаете, что делаете (бишь хотите ровно старший), можно воспользоваться [https://bugzilla.altlinux.org/show_bug.cgi?id=22572#c14 подсказкой] {{man|zerg}}:
apt-get -o APT::Install::VirtualVersion=true -o APT::Install::Virtual=true install gcc
== Удаление группы пакетов ==
Заготовка команды с фильтром для удаления группы пакетов, поставленных apt или rpm, но не aptitude:
# apt-get remove $(awk '/^'''May 25 17:34'''/ {on=1} {if (on) { print substr($6,1,match($6,"-[[:digit:]]")-1) }}' /var/log/user/info)
Команда для удаления -devel пакетов. По зависимостям может удалить некоторые обычные пакеты, от них зависящие. Например компиляторы (так же см {{altbug|35600}}); аналогично можно удалять -debuginfo пакеты:
# apt-get remove `rpm -qa --qf '%{NAME}\n' | grep -- "-devel$"`
Команда, полностью аналогичная предыдущей, но параметр --qf от rpm заменён на вызов sed:
# apt-get remove `rpm -qa | sed "s/-[^-]\+-[^-]\+$//"| grep -- "-devel$"`
== apt-get upgrade ==
Несмотря на то, что команда upgrade существует, использовать её следует осторожно, либо не использовать вовсе. Цитата из «ALT Linux Master 2.0. Руководство системного администратора»:
{{Attention|Для обновления всех установленных пакетов используется команда apt-get upgrade. Она позволяет обновить те и только те установленные пакеты, для которых в репозитариях, перечисленных в /etc/apt/sources.list, имеются новые версии; при этом из системы не будут удалены никакие другие пакеты. Этот способ полезен при работе со стабильными пакетами приложений, относительно которых известно, что они при смене версии изменяются несущественно.<br><br>
Иногда, однако, происходит изменение в именовании пакетов или изменение их зависимостей. Такие ситуации не обрабатываются командой apt-get upgrade, в результате чего происходит нарушение целостности системы: появляются неудовлетворенные зависимости. Например, переименование пакета MySQL-shared, содержащего динамически загружаемые библиотеки для работы с СУБД MySQL, в libMySQL, отражая общую тенденцию к наименованию библиотек в дистрибутиве, не приводит к тому, что установка обновленной версии libMySQL требует удаления старой версии MySQL-shared. Для разрешения этой проблемы существует режим обновления в масштабе дистрибутива — apt-get dist-upgrade.}}
Команда заблокирована по умолчанию, начиная с apt 0.5.15lorg2-alt67: <s>{{altbug|30867}}</s>.
{{Category navigation|title=APT|category=APT|sortkey={{SUBPAGENAME}}}}
[[Категория:Использование Epm]]
[[Категория:Прокси]]

Текущая версия от 08:46, 26 октября 2023

Сводка по обновлению

Поставьте пакет apt-printchanges и перед обновлением пакета будет выводиться его changelog.

Использование proxy

HTTP-прокси

/etc/apt/apt.conf:

Acquire::http::Proxy "http://[user[:pass]@]host[:port]/";

либо выставить переменную окружения http_proxy:

export http_proxy='http://user:passwd@host:port/'
Примечание: Проблема git.altlinux.org и Squid.

При подключении репозитория-кармана Squid не определяет, что произошли изменения, и не даёт скачать обновлённый индекс. Для борьбы с этим можно отключить использование прокси для git.altlinux.org, для чего добавить в apt.conf

Acquire::http::Proxy::git.altlinux.org "DIRECT";

Альтернативным вариантом является использование возможности задать ограничение на кэширование некоторых объектов в Squid. Для этого в /etc/squid/squid.conf можно добавить что-то вроде

acl REPO url_regex (pkglist|release)$
no_cache deny REPO

В данном примере отключается кэширование индексов в любых источниках, что может быть даже интереснее.


FTP-прокси

/etc/apt/apt.conf:

Acquire::ftp::Proxy "ftp://[user[:pass]@]host[:port]/";

либо выставить переменную окружения ftp_proxy.

RSYNC-прокси

/etc/apt/apt.conf:

Acquire::rsync::proxy="[user[:pass]@]host[:port]";
Acquire::rsync::proxy::hostname="none";

либо выставить переменную окружения RSYNC_PROXY.

  • При использовании репозиториев на разных хостах возможно задание proxy для всех хостов и для каждого в отдельности.
  • Значение для конкретного хоста перекрывает глобальное значение.
  • Значение "none" указывает, что необходимо использовать прямое соединение.

Пример:

Acquire::rsync::proxy="192.168.1.1:3128";
Acquire::rsync::proxy::mirror.localdomain="none";

Будет использоваться http-proxy "192.168.1.1:3128" для всех хостов, кроме mirror.localdomain, для которого будет использоваться прямое соединение.

HTTP-прокси для проксирования FTP-запросов

Не рекомендуется из-за низкой эффективности и не поддерживается настройками в конфигурационном файле. В случае крайней необходимости - определите переменную окружения ftp_proxy в HTTP URL.

См. так же

Использование HTTPS

Для использования транспорта https следует установить пакет apt-https (доступен с p9):

# apt-get install apt-https

Поиск пакетов, использующих данную библиотеку

apt-cache showpkg libuuid.so.1

Обновление системы «вниз»

Внимание! Такое обновление может привести к непредсказуемым последствиям, ибо майнтейнеры пакетов не проверяют работу обновления в таких условиях.

Основная статья: Downgrade


apt-scripts: «ненужное» и «не в текущем репо»

Описано по мотивам письма at@; для начала потребуется установить пакет apt-scripts.

apt-cache list-extras

Показывает пакеты, которые отсутствуют в репозитории (совпадение по имени пакета, кроме специальных случаев типа Allow-Duplicated, в которых версия также учитывается).

Непустой вывод означает, что перечисленных пакетов больше нет в репозитории. Следовательно, эти пакеты, скорее всего, устарели или перестали собираться (и поэтому, быть может, стоит их снести). Предварительно следует обновиться до текущего состояния репозитория, так как не исключено, что их заменили какие-то новые пакеты.

apt-get remove `apt-cache list-extras | grep -v "^kernel-\(image\|modules\)\|^apt-conf\|^altlinux-release\|^branding-altlinux"`
Внимание! Обычное обновление не обновляет автоматически ядро, потому команда, с высокой степенью вероятности, выдаст в списке установленные ядра с модулями. Их удаление приведёт к невозможности загрузки системы. В примере этот момент учтён посредством "grep -v ...".

Аналогично, удаление apt-conf-*, приведёт к удалению apt, хотя это можно будет исправить доустановкой через rpm. Можно, предварительно, установить нужный apt-conf, например
apt-get install apt-conf-branch
Так же следует аккуратно относиться к пакетам вида altlinux-release-*, от которых зависит пакет basesystem
Внимание! Если Вы увидите предупреждение "To continue type in the phrase 'Yes, do as I say!'" вместо обычного (Y/n), то остановитесь и внимательно посмотрите, что именно предлагается к удалению. Эта фраза означает попытку удаления критически важного c точки зрения apt пакета. Как правило, такие пакеты можно только менять на какие-то другие (хотя это же предупреждение будет и при замене).


apt-cache list-nodeps

Показывает пакеты, от которых не зависят какие-либо другие пакеты, установленные в системе. То есть эти пакеты «никому не нужны» и их можно удалить с помощью rpm -e.

Среди этого списка можно обнаружить неиспользуемые библиотеки, примерно так:

$ apt-cache list-nodeps |grep '^lib[^-]*$'
libgtk+mdk
libmysqlclient10
[...]

Эти библиотеки, вероятно, стоит снести:

$ apt-cache list-nodeps |grep '^lib[^-]*$' |grep -v libreoffice |xargs -r sudo rpm -e

Аналогично можно поступить с неиспользуемыми модулями (^python-, ^perl-, ...), если не устанавливали что-либо самостоятельно с целью получения дополнительной функциональности.

Внимание! C ^lib могут начинаться не только названия пакетов с библиотеками: пример с libreoffice представлен в команде.
Внимание! Пакет, напоминающий библиотеку по названию и содержимому, может оказаться плагином. Удаление плагинов может привести к отключению каких-то функций у использующих их приложений. Обычно, функциональность можно восстановить, просто установив плагин снова.


Проще всего использовать

$ epm autoremove

который делает всё вышеперечисленное с учётом вышеперечисленных замечаний.

apt-scripts: удаление дубликатов пакетов

Иногда в процессе обновления может произойти что-то непредвиденное (отключение питания например). В подобной ситуации, как правило, в базе rpm остаются двойные пакеты. В apt-scripts  с версии 0.1.4-alt1  реализована команда dedup для упрощения борьбы с такими последствиями (https://lists.altlinux.org/pipermail/sisyphus/2019-June/367974.html). Установите apt-scripts, если пакет ещё не установлен, и запустите команду:

# apt-get dedup

APT совместно с /usr, смонтированным в режиме read only

/etc/apt/apt.conf:

RPM
{
  Pre-Invoke {"mount -o remount,rw /usr";};
  Post-Invoke {"mount -o remount,ro /usr";};
}

работает в 4.0, в 4.1, начиная с некоторого времени, что-то сломалось (появились файлтриггеры?) и после установки пакетов выдает ошибки типа такого

Done.
mount: /usr is busy
E: Sub-process mount -o remount,ro /usr returned an error code (32)
E: Problem executing scripts RPM::Post-Invoke 'mount -o remount,ro /usr'
E: Sub-process returned an error code

Hold пакета (Заблокировать версию пакета)

Иногда требуется предотвратить обновление какого-то пакета, например, nxclient. Чтобы решить эту проблему, создаём файл 90-apt-hold.conf (название особенного значения не имеет, но должно заканчиваться на .conf) в каталоге /etc/apt/apt.conf.d/:

# echo 'RPM::Hold { nxclient; };' >> /etc/apt/apt.conf.d/90-apt-hold.conf

Холд установлен. Также можно посмотреть почитать ссылка неактуальнастатья в архиве. Имя пакета может быть задано в виде регулярного выражения и, соответственно, может иметь более сложный вид, чем в примере.

Файл может иметь и многострочный формат, примером может быть соответствующая секция в /etc/apt/apt.conf.

Hold не работает, если обновляется какой-то другой пакет, имеющий зависимость на пакет, указанный в этой секции. Например, это не сработает для библиотек, либо вместе с библиотекой надо указывать все остальные пакеты, которым она нужна.

Если Вы пользуетесь synaptic или aptitude, там тоже есть возможность соответствующей настройки. synaptic: Пакет - Заблокировать версию; aptitude: aptitude hold nxclient.

Установка виртуального пакета без вопросов о конкретном варианте

Порой apt спотыкается о наличие нескольких вариантов реальных пакетов, предоставляющих один и тот же затребованный виртуальный; если понимаете, что делаете (бишь хотите ровно старший), можно воспользоваться подсказкой zerg@:

apt-get -o APT::Install::VirtualVersion=true -o APT::Install::Virtual=true install gcc

Удаление группы пакетов

Заготовка команды с фильтром для удаления группы пакетов, поставленных apt или rpm, но не aptitude:

# apt-get remove $(awk '/^May 25 17:34/ {on=1} {if (on) { print substr($6,1,match($6,"-digit:")-1) }}' /var/log/user/info)

Команда для удаления -devel пакетов. По зависимостям может удалить некоторые обычные пакеты, от них зависящие. Например компиляторы (так же см altbug #35600); аналогично можно удалять -debuginfo пакеты:

# apt-get remove `rpm -qa --qf '%{NAME}\n' | grep -- "-devel$"`

Команда, полностью аналогичная предыдущей, но параметр --qf от rpm заменён на вызов sed:

# apt-get remove `rpm -qa | sed "s/-[^-]\+-[^-]\+$//"| grep -- "-devel$"`

apt-get upgrade

Несмотря на то, что команда upgrade существует, использовать её следует осторожно, либо не использовать вовсе. Цитата из «ALT Linux Master 2.0. Руководство системного администратора»:

Внимание! Для обновления всех установленных пакетов используется команда apt-get upgrade. Она позволяет обновить те и только те установленные пакеты, для которых в репозитариях, перечисленных в /etc/apt/sources.list, имеются новые версии; при этом из системы не будут удалены никакие другие пакеты. Этот способ полезен при работе со стабильными пакетами приложений, относительно которых известно, что они при смене версии изменяются несущественно.

Иногда, однако, происходит изменение в именовании пакетов или изменение их зависимостей. Такие ситуации не обрабатываются командой apt-get upgrade, в результате чего происходит нарушение целостности системы: появляются неудовлетворенные зависимости. Например, переименование пакета MySQL-shared, содержащего динамически загружаемые библиотеки для работы с СУБД MySQL, в libMySQL, отражая общую тенденцию к наименованию библиотек в дистрибутиве, не приводит к тому, что установка обновленной версии libMySQL требует удаления старой версии MySQL-shared. Для разрешения этой проблемы существует режим обновления в масштабе дистрибутива — apt-get dist-upgrade.

Команда заблокирована по умолчанию, начиная с apt 0.5.15lorg2-alt67: altbug #30867.