APT в ALT Linux/Советы по использованию: различия между версиями
м (→Обновление системы "вниз": уточнение по (не)комментируемости /etc/apt/preferences) |
|||
(не показаны 54 промежуточные версии 9 участников) | |||
Строка 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-прокси === | ||
Строка 37: | Строка 51: | ||
Не рекомендуется из-за низкой эффективности и не поддерживается настройками в конфигурационном файле. В случае крайней необходимости - определите переменную окружения <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}} | |||
== Удаление «ненужного» и «не в текущем репо» == | |||
Описано по мотивам [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 === | === apt-cache list-nodeps === | ||
Строка 83: | Строка 104: | ||
Эти библиотеки, вероятно, стоит снести: | Эти библиотеки, вероятно, стоит снести: | ||
$ apt-cache list-nodeps |grep '^lib[^-]*$' |xargs sudo rpm -e | $ apt-cache list-nodeps |grep '^lib[^-]*$' |grep -v libreoffice |xargs -r sudo rpm -e | ||
Аналогично можно поступить с неиспользуемыми модулями (<tt>^python-</tt>, <tt>^perl-</tt>, ...), если не устанавливали что-либо самостоятельно с целью получения дополнительной функциональности. | |||
{{Attention|C <tt>^lib</tt> могут начинаться не только названия пакетов с библиотеками: пример с libreoffice представлен в команде.}} | |||
{{Attention|Пакет, напоминающий библиотеку по названию и содержимому, может оказаться плагином. Удаление плагинов может привести к отключению каких-то функций у использующих их приложений. Обычно, функциональность можно восстановить, просто установив плагин снова.}} | |||
=== apt-get autoremove === | |||
apt-get autoremove удаляет все автоматически установленные зависимости (пакеты), которые больше не нужны, а утилита apt-mark может обозначить пакет как установленный вручную/aвтоматически | |||
Классический пример - после удаления виртуального пакета KDE, который помечен в дистрибутиве как установленный вручную. autoremove удалит пакеты от которых он зависел , за исключением тех, которые нужны другим пакетам, которые имеют метку, что они тоже установлены вручную. | |||
=== epm autoremove === | |||
{{Note | Если посмотреть код epm, то можно увидеть, что он ищет и удаляет "ненужные" пакеты, помечает важные пакеты, и только потом вызывает {{cmd |apt-get autoremove}}. Так что, проще и болеее надёжно использовать именно {{cmd |epm autoremove}} }} | |||
$ 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 == | ||
Строка 94: | Строка 136: | ||
} | } | ||
работает в 4.0, в 4.1, начиная с некоторого времени, что-то сломалось и после установки пакетов выдает ошибки типа такого | работает в 4.0, в 4.1, начиная с некоторого времени, что-то сломалось (появились файлтриггеры?) и после установки пакетов выдает ошибки типа такого | ||
Done. | Done. | ||
Строка 101: | Строка 143: | ||
E: Problem executing scripts RPM::Post-Invoke 'mount -o remount,ro /usr' | E: Problem executing scripts RPM::Post-Invoke 'mount -o remount,ro /usr' | ||
E: Sub-process returned an error code | 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}}}} | {{Category navigation|title=APT|category=APT|sortkey={{SUBPAGENAME}}}} | ||
[[Категория:Использование Epm]] | |||
[[Категория:Прокси]] |
Текущая версия от 09:17, 10 июня 2024
Сводка по обновлению
Поставьте пакет 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/'
При подключении репозитория-кармана 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
Обновление системы «вниз»
Внимание! Такое обновление может привести к непредсказуемым последствиям, ибо майнтейнеры пакетов не проверяют работу обновления в таких условиях.
Удаление «ненужного» и «не в текущем репо»
Описано по мотивам письма 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"`
Аналогично, удаление apt-conf-*, приведёт к удалению apt, хотя это можно будет исправить доустановкой через rpm. Можно, предварительно, установить нужный apt-conf, например
apt-get install apt-conf-branch
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-, ...), если не устанавливали что-либо самостоятельно с целью получения дополнительной функциональности.
apt-get autoremove
apt-get autoremove удаляет все автоматически установленные зависимости (пакеты), которые больше не нужны, а утилита apt-mark может обозначить пакет как установленный вручную/aвтоматически
Классический пример - после удаления виртуального пакета KDE, который помечен в дистрибутиве как установленный вручную. autoremove удалит пакеты от которых он зависел , за исключением тех, которые нужны другим пакетам, которые имеют метку, что они тоже установлены вручную.
epm autoremove
$ 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, в результате чего происходит нарушение целостности системы: появляются неудовлетворенные зависимости. Например, переименование пакета MySQL-shared, содержащего динамически загружаемые библиотеки для работы с СУБД MySQL, в libMySQL, отражая общую тенденцию к наименованию библиотек в дистрибутиве, не приводит к тому, что установка обновленной версии libMySQL требует удаления старой версии MySQL-shared. Для разрешения этой проблемы существует режим обновления в масштабе дистрибутива — apt-get dist-upgrade.
Команда заблокирована по умолчанию, начиная с apt 0.5.15lorg2-alt67: altbug #30867.