Translation(s): Русский - English - Italiano - 简体中文


Эта статья пытается объяснить, как использовать предпочтения APT (Preferences). На данный момент, здесь изложено только закрепление (pinning).

Pinning

Перед тем как выбрать 'pinning' вы можете проверить бэкпортирован ли нужный вам пакет для используемой вами версии дистрибутива.

<!> При использовании apt-pinning вам необходимо обеспечить совместимость пакетов самостоятельно, так как Debian не гарантирует это. Заметьте, что функция apt-pinning полностью опциональна и Debian и не поощряет ее использование без тщательного рассмотрения.

Pinning позволяет вам иметь некоторые пакеты из другой ветки (stable, testing, unstable) без необходимости обновления всей системы. Тем не менее, пакеты из "старших" дистрибутивов тянут за собой также и библиотеки, что может привести к тому, что вы ваша система будет иметь недостатки стабильного (устаревшее программное обеспечение) и недостатки нестабильного/тестируемого (поддержка безопасности не настолько хороша как в стабильном, ошибки) без преимуществ одного из них.

На самом базовом уровне, функция pinning состоит из двух файлов, /etc/apt/sources.list и /etc/apt/preferences.

Дополнительную роль играет целевой выпуск, который может быть указан в файле apt.conf (или в /etc/apt/conf.d/... и посредством командной строки apt.

/etc/apt/sources.list

 #### testing  #########
 deb http://ftp.us.debian.org/debian testing main contrib non-free

 #### unstable #########
 deb http://ftp.us.debian.org/debian unstable main contrib non-free

В этом примере, мы используем testing или unstable. Вы можете, конечно же, изменить это на stable.

/etc/apt/preferences

В файле 'preferences' находятся настройки pinning. Ниже приведен пример:

 Package: *
 Pin: release a=testing
 Pin-Priority: 900

 Package: *
 Pin: release a=unstable
 Pin-Priority: 800

Значение Package по умолчанию любое, что указано звездочкой. Pin задает версию выпуска (testing и unstable). Pin-Priority задает уровень приоритета. 'apt-get' по умолчанию позволяет "пакетам с более высокой версией быть более приоритетными". Приведенные выше параметры перестраивают этот приоритет, так образом, пакеты из testing имеют более высокий приоритет.

Вы должны также обратиться к man-странице apt_preferences(5).

Установка из unstable

Давайте предположим, что у нас есть testing и мы хотим попробовать установить графическую оболочку enlightenment из unstable. Здесь даны два способа установки:

 # apt-get install enlightenment/unstable
 # apt-get -t unstable install enlightenment

Первый не будет пытаться обновить все пакеты в систему, так что если конкретные зависимости не совпадают, установка выполнена не будет. Второй метод будет пытаться установить/обновить любые зависимости. Конечно же, в приведенном выше примере 'apt-get' спросит вас перед продолжением.

Примечания от Joshua Rodman

Лично я нашел общую конфигурацию Testing pin с более высоким приоритетом и Unstable pin с более низким приоритетом проблематичной. Время от времени, тестируемые пакеты будут зависеть от других пакетов, которые не являются в настоящее время тестируемыми (вероятно, это приведет к небольшому сбою в testing), что заставит их автоматически подхватываться из нестабильной ветки. В период тестирования до стабилизации выпуска Woody мне пришлось установить конечном итоге более чем 100 нестабильных пакетов, даже не осознавая этого.

В результате, я использую более консервативный "только если я так говорю" подход к смешанному дистрибутиву с вот таким Pin-файлом:

  Package: *
  Pin: release a=testing
  Pin-Priority: 900

  Package: *
  Pin: release o=Debian
  Pin-Priority: -10

Таким образом, все пакеты Debian по умолчанию получают приоритет -10, в тоо время как тестируемые получают 900 точек бонуса. Это вызывается:

из apt_preferences(5)

  500 < P <=990 :
       версия устанавливается, в случае отсутствия доступной, 
       принадлежащей целевому выпуску или если установленная версия 
       более актуальна
  [...]
  P < 0 :
        предоствращает установку версии

Заметьте, что приоритет выше 1000 позволит понижение независимо даже от версии приоритетного пакета. Это означает, что Вы можете использовать приоритет 1001 для стабильного источника, если Вы хотите откатить пакеты до стабильных версий, которые Вы установили (скажем, из testing) на систему. Не рекомендуется если количество изменений не минимально

Установка пакетов с помощью apt-get install packagename/unstable и apt-get install -t unstable packagename все ещё работает, но нестабильные пакеты будут установлены только этими командами.

Примечания от ZugSchlus

Disclaimer

Эта страница была написана ZugSchlus, который даже отдаленно не схватывает концепцию закрепления пакетов. Так что, пожалуйста, считайте слова "вероятно", "должно быть проверено" и подобные формулировки буквальными, и документируйте свои результаты (может они будут чем-то вроде "эта страница верна", или "эта страница неверна", опционально "эта страница неверна, потому что") здесь.

Описание процесса выбора пакета

ToDo: должно быть проверено

Примеры файла /etc/apt/preferences

Пример 1

 Package: *
 Pin: release o=Debian,a=testing
 Pin-Priority: 900

 Package: *
 Pin: release o=Debian,a=unstable
 Pin-Priority: 300

 Package: *
 Pin: release o=Debian
 Pin-Priority: -1

Отсутствует: Документация о том, что этот файл настроек делает.

ZugSchlus пытается объяснить:

Проблема: Данное закрепление ведет себя по-другому, в зависимости от того, какой целевой выпуск установлен, в других частях конфигурации apt. Следовательно, этот пример в действительности не может быть зарегистрирован, без добавления дополнительной информации. У незакрепленного пакета, являющегося частью целевого выпуска, приоритет по умолчанию 990, в то время как у других незакрепленных пакетов приоритет по умолчанию 500.

Пример 2

Цель: На системе, основанной на нестабильной ветке, вытащить dpatch из экспериментальной.

Возможное (и не совсем правильное) решение:

Example 3

From Mihamina rakotomandimby

Suppose you have a personnal repository where you have a personnal version of Postfix. You want Apt to prefer you version over official ones.

You may set preferences by Origin

Package: *
Pin: origin www.rktmb.org
Pin-Priority: 610

Package: *
Pin: origin ftp.fr.debian.org
Pin-Priority: 600

Debugging

apt-cache policy package gives information about the selection process. Unfortunately, it is not widely known what the output means. The following is a try to interpret:

 $ apt-cache policy exim4-daemon-light
 exim4-daemon-light
  Installed: 4.50-1
  Candidate: 4.50-1
  Package Pin: (not found)
  Version Table:
      4.50-4 555
        500 http://mirror sid/main Packages
  *** 4.50-1 555
        100 /var/lib/dpkg/status
      4.44-2 555
        500 http://mirror sarge/main Packages

The priority of each version/location is the number at the left of it. In this case, 500, 100, and 500. The number on the right of the version number displays the actual pin priority being placed on the package.

Notes from Ryan B.

If you're wondering what the options are for release file preferences, based on this link: http://www.debian.org/doc/manuals/repository-howto/repository-howto

we find:

Archive: archive

Component: component

Origin: Your Company

Label: Your Company Debian repository

Architecture: architecture

Thus, the line: "Pin: release a=testing" would find archive values in the release file named "testing".

Notes from GeorgiosZarkadas

I found that using a higher than 500 value to pin testing/unstable resulted in apt-get upgrade wanting to upgrade all packages with a newer version to testing/unstable even while I had stable pinned with a higher value than testing/unstable.

After, querying the outcome of apt-cache policy <some-package> for a number of the packages that apt-get upgrade considered that they should be upgraded, I concluded that if there are multiple versions with candidates pinned to 500 or higher, then pinning is considered after the version number. Thus the highest version with the highest pin weight among the candidates of that (and only that) version is selected.

For example (having stable pinned to 700, testing to 650 and unstable to 600):

root@freedom:/etc/apt# apt-cache policy deborphan
deborphan:
  Εγκατεστημένα: 1.7.28.3+squeeze1
  Υποψήφιο:      1.7.28.5
  Πίνακας Έκδοσης:
     1.7.28.5 0
        650 http://ftp.gr.debian.org/debian/ wheezy/main amd64 Packages
        600 http://ftp.gr.debian.org/debian/ sid/main amd64 Packages
 *** 1.7.28.3+squeeze1 0
        500 http://ftp.gr.debian.org/debian/ squeeze-proposed-updates/main amd64 Packages
        100 /var/lib/dpkg/status
     1.7.28.3 0
        500 cdrom://[Debian GNU/Linux 6.0.1a _Squeeze_ - Official amd64 DVD Binary-1 20110322-16:05]/ squeeze/main amd64 Packages
        700 http://ftp.gr.debian.org/debian/ squeeze/main amd64 Packages

Since my aim for using multiple sources and pinning was to be able to occasionally install a package from testing or unstable and not upgrade all my packages, pinning testing / unstable to values equal or greater than 500 is clearly an insuitable method for the stated cause.

However, I found that using a value less than 500 for testing/unstable has the desired effect. For example (removed stable pin and set testing to 450 and unstable to 400):

root@freedom:/etc/apt# apt-cache policy deborphan
deborphan:
  Εγκατεστημένα: 1.7.28.3+squeeze1
  Υποψήφιο:      1.7.28.3+squeeze1
  Πίνακας Έκδοσης:
     1.7.28.5 0
        450 http://ftp.gr.debian.org/debian/ wheezy/main amd64 Packages
        400 http://ftp.gr.debian.org/debian/ sid/main amd64 Packages
 *** 1.7.28.3+squeeze1 0
        500 http://ftp.gr.debian.org/debian/ squeeze-proposed-updates/main amd64 Packages
        100 /var/lib/dpkg/status
     1.7.28.3 0
        500 cdrom://[Debian GNU/Linux 6.0.1a _Squeeze_ - Official amd64 DVD Binary-1 20110322-16:05]/ squeeze/main amd64 Packages
        500 http://ftp.gr.debian.org/debian/ squeeze/main amd64 Packages

Notes from Dmitriy Matrosov

I think, that Georgios Zarkadas's conclusion (from previous notes) about "pinning considered by apt after version number":

I concluded that if there are multiple versions with candidates pinned to 500 or higher, then pinning is considered '''after''' the version number.

is wrong. Let's look once again at example he posted:

root@freedom:/etc/apt# apt-cache policy deborphan
deborphan:
  Εγκατεστημένα: 1.7.28.3+squeeze1
  Υποψήφιο:      1.7.28.5
  Πίνακας Έκδοσης:
     1.7.28.5 0
        650 http://ftp.gr.debian.org/debian/ wheezy/main amd64 Packages
        600 http://ftp.gr.debian.org/debian/ sid/main amd64 Packages
 *** 1.7.28.3+squeeze1 0
        500 http://ftp.gr.debian.org/debian/ squeeze-proposed-updates/main amd64 Packages
        100 /var/lib/dpkg/status
     1.7.28.3 0
        500 cdrom://[Debian GNU/Linux 6.0.1a _Squeeze_ - Official amd64 DVD Binary-1 20110322-16:05]/ squeeze/main amd64 Packages
        700 http://ftp.gr.debian.org/debian/ squeeze/main amd64 Packages

First, apt tries to upgrade from stable (squeeze/main) since stable has highest priority (700), but it sees, that installed package is newer:

sgf@shilvana:~$ dpkg --compare-versions 1.7.28.3 lt '1.7.28.3+squeeze1' ; echo $?
0

and priority 700 is not enough to downgrade. So, it looks further for candidate version. And now apt tries to upgrade from testing (wheezy/main) and sees, that version from testing is newer:

sgf@shilvana:~$ dpkg --compare-versions '1.7.28.3+squeeze1' lt 1.7.28.5 ; echo $?
0

And hence, this version (from testing) become a candidate.

So, in order to upgrade from stable (as Georgios Zarkadas wants), he must have this package at version <= than one found in stable.

References