печать

Пакетный менеджер Debian — APT

Штука сия весьма и весьма мощна и удобна. На мой взгляд единственный менеджер пакетов, который реально работает. Вспоминаю свои попытки апгрейда дистрибутива на следующую версию на rpm-основанных дистрах как страшный сон...
Итак, APT. Не буду заниматься его детальным описанием, ибо это сделано уже много раз и многими почтенными людьми, напишу только некоторые хитрости и грабли, кои не сразу найдешь и будешь долго биться и мучиться.

Релиз по умолчанию
Вроде штука простая, но далеко не все прочтут man до конца и внимательно. Согласно man конфигурится сия фича очень просто — параметром APT::DefaultRelease в apt.conf или в файлике в /etc/apt/apt.conf.d как сделал я. Тонкость заключается в том, что параметр этот не может принимать значения названий релизов, вроде etch или lenny. А может он принимать значения stable, unstable и номера версий. Посему дабы основную систему оставить на stable, при этом не лишив себя возможности установки пакетов из других веток, прописываем в /etc/apt/sources.list все нужные нам ветки в источниках, и создаем файлик /etc/apt/apt.conf.d/defaultrelease следующего содержимого:
APT::DefaultRelease "stable";
На lenny, проапгрейженом с etch, почему то формат опции другой, нужен дефис. Вот правильный вид для lenny:
APT::Default-Release "stable";
Так что стоит всегда проверять применилась ли данная опция, благо запустить apt-get с ключиком -s дабы посмотреть что он собирается сделать несложно. Думаю что номера версий релизов погибче должны быть, но их я не знаю и ничего сказать не могу.

Установка пакетов не из основной ветки
Иногда нужно установить какой либо пакет из другой ветки дистрибутива. К примеру это очень нужно в связи с необходимостью постоянно обновлять версию мессенджера в гонке за изменяемым AOLом протоколом. Опять же согласно man все очень просто: apt-get -t unstable и всего делов. И это работает, НО! Все ограничения, что обозначены в предыдущем пункте, применимы и в этом случае. Попробуйте, к примеру, установить pidgin из lenny — ничего не получится, apt нажалуется на отсутствие такового релиза для пакета pidgin. Хорошим подспорьем тут является команда apt-show-versions. По умолчанию она не ставится, поэтому ее нужно доставить, благо это очень просто:
apt-get install apt-show-versions
Далее, при наличии нескольких веток в sources.list получаем примерно такой вывод:
baron@marusya:$ apt-show-versions -a cups
cups 1.3.8-1lenny4.1 install ok installed
cups 1.3.8-1lenny4.1 lenny    ftp2.de.debian.org
cups 1.3.9-15        unstable ftp2.de.debian.org
cups/lenny uptodate 1.3.8-1lenny4.1
baron@marusya:$ 
Видно что есть две доступные версии пакета. Установлен пакет из релиза по умолчанию, в данном случае lenny, он же stable на момент написания.
А вот пакет, установленный из другой ветки:
baron@marusya:$ apt-show-versions -a pidgin
pidgin 2.5.5-1 install ok installed
pidgin 2.4.3-4 lenny    ftp2.de.debian.org
pidgin 2.5.5-1 unstable ftp2.de.debian.org
pidgin/unstable uptodate 2.5.5-1
baron@marusya:$ 

Как всегда при установке чего то нестандартного возможны проблемы. Поэтому наилучший вариант, конечно, это сборка пакета из исходных текстов.

Механизм выбора пакета для установки
APT использует немудровый механизм для выбора версии пакета для установки. Это неплохо описано на странице man apt_preferences. Но покуда я уже начал расскажу вкратце об этом механизме и как им можно управлять.
APT использует так называемые приоритеты версий пакетов. Каждое состояние пакета имеет свой "вес". Пример из man:
  • Приоритет 100 присваивается установленному пакету.
  • Приоритет 500 имеют пакеты, не установленные и не принадлежащие основной ветке.
  • Приоритет 990 имеют пакеты, не установленные и принадлежащие основной ветке.
  • Даунгрейд возможен только для пакетов с приоритетом выше 1000.
Попробую пояснить.
Система с DefaultRelease "stable". В ней установлен некий пакет, назовем его package. Мы даем APT задание этот пакет установить
apt-get install package
Получается вот что. Если пакет есть в ветке unstable, он получает приоритет 0, и так как у нас уже есть установленный такой пакет, то приоритет установленного пакета 100, что больше, значит пакет не будет установлен. Если есть обновление этого пакета в ветке stable, то оно получает приоритет 990, что явно больше 100 — APT стягивает и устанавливает обновленную версию. А вот если этот пакет НЕ установлен, то при наличии его в ветке unstable он получает приоритет 500, что заставляет APT установить его из ветки unstable. Примерно такая математика.
Вот на этой математике и строится принцип preferences. Файлик этот кладется в /etc/apt. Содержимое его примерно таково:
Package: *
Pin: release a=unstable
Pin-Priority: 50

Сия конструкция говорит что пакеты из ветки unstable получают приоритет 50. Детали можно прочитать в man apt_preferences

Создано: baron последнее изменение: Tuesday 14 July 2009 [13:24:49 UTC] автор baron