Приоритеты источников
Пакетный менеджер apt позволяет управлять приоритетами источников пакетов. Допустим, есть несколько источников: main, unstable, experimental. И есть задача установить пару пакетов из unstable, но не делать нестабильной всю систему после следующего apt upgrade
.
То гда можно задать приоритеты для пакетов из разных репозиториев.
Настроить приоритеты можно:
- в файле внутри
/etc/apt/preferences.d/
- в файле
/etc/apt/preferences
Можно указать имена затрагиваемых пакетов, их версии, репозитории и значения приоритетов.
Для apt заданы несколько значений приоритетов по умолчанию:
- каждый установленный пакет — 100,
- каждый неустановленный пакет — 500,
- если пакет является частью запрошенного релиза — 990.
Для последнего случая пакет указывается через опцию -t
или конфигурационную директиву apt::Default-Release
.
Таблица приоритетов
Приоритет | Когда пакет может быть установлен |
---|---|
< 0 | Ни при каких условиях. |
1..99 | Тольк о если не установлена другая версия этого пакета. |
100..499 | Только если более свежей версии пакета нет ни среди установленных пакетов, ни среди доступных в репозиториях. |
500..989 | Только если более свежей версии пакета нет ни среди установленных пакетов, ни среди доступных для этого дистрибутива. |
990..1000 | Только если не установлена более свежая версия этого пакета. |
> 1000 | Всегда, даже если это означает даунгрейд с более свежей версии. |
Правила установки пакетов
apt выбирает версию пакета согласно правилам:
- более высокий приоритет;
- если два пакета имеют один и тот же приоритет, apt установит более новый;
- если два пакета с одинаковым номером версии имеют одинаковый приоритет, но разное содержимое, apt выберет содержимое, отличающееся от установленного сейчас.
Последнее правило было введено, чтобы разрешить установку обновлений, у которых не увеличился номер версии, что обычно является желательным поведением. Более старая версия имеет номер меньший номер.
Случаи установки более старой версии:
- приоритет старшей версии выше 1000
- даунгрейд явно запрошен пользователем Установка и удаление
Анализ записей приоритетов
apt анализирует /etc/apt/preferences
и /etc/apt/preferences.d/
в следующем порядке:
- Наиболее конкретные записи, например, указывающие на пакет.
- Более общие, например, все пакеты определённого дистрибутива. Если существует несколько общих записей, то используется первая найденная.
Записи могут содержать такие критерии как имя пакета и его источник.
Каждый пакет идентифицируется по информации, предоставленной в файле InRelease
, который apt скачивает вместе с файлом Packages
.
Например, для официальных репозиториев SelectOS в источнике будет указано значение «SelectOS», а у других репозиториев могут быть указаны имена других людей или организаций. Также указывается название дистрибутива (selectos; в сторонних репозиториях могут встречаться stable, testing, experimental и т.д.) и номер версии.
Приоритет экспериментальных репозиториев
Если в sources.list
добавлен источник experimental, пакеты из него вряд ли будут устанавливаться, потому что по умолчанию их приоритет равен 1.
Этот особый случай введён для того, чтобы пользователи не могли установить экспериментальные пакеты по ошибке.
Эти пакеты должны устанавливаться отдельной командой с учетом рисков в зоне ответственности пользователя:
apt install пакет/experimental
Дать пакетам из экспериментальных репозиториев обычный приоритет 500 возможно, но не рекомендуется. Это можно сделать с помощью следующей записи в /etc/apt/preferences
:
Package: *
Pin: release a=experimental
Pin-Priority: 500
Пример установки приоритета репозитория
Допустим, нужно устанавливать пакеты только из дистрибутива selectos, а версии из любых других дистрибутивов от SelectOS не должны устанавливаться, если не запрошены явно.
Для этого можно добавить в /etc/apt/preferences
следующие записи:
Package: *
Pin: release a=selectos
Pin-Priority: 900
Package: *
Pin: release o=SelectOS
Pin-Priority: -10
Здесь a=selectos
определяет выбранный тип дистрибутива, а o=SelectOS
ограничивает дей ствие записи репозиторием, для которого поле origin
равно «SelectOS».
Пример закрепления версии
Допустим, некоторые локальные программы сервере зависят от Perl версии 5.28, и важно, чтобы апгрейды не установили другую версию. Пример записи:
Package: perl
Pin: version 5.28*
Pin-Priority: 1001
Посмотреть информацию о приоритетах
Команда apt-cache policy
покажет приоритеты по умолчанию, назначенные каждому источнику пакетов.
Также можно выполнить apt-cache policy пакет
: она покажет приоритеты по умолчанию для каждой доступной версии пакета.
Справочная документация по файлам /etc/apt/preferences
и /etc/apt/preferences.d/
доступна в руководстве: man apt_preferences
.
Для файла /etc/apt/preferences
нет официального синтаксиса комментариев, но текстовые примечания можно оформлять как одно или несколько полей Explanation
в начале каждой записи:
Explanation: The package xserver-xorg-video-intel provided
Explanation: in experimental can be used safely
Package: xserver-xorg-video-intel
Pin: release a=experimental
Pin-Priority: 500
Примеры вычисления версии для установки
Исходные данные 1:
- установлен пакет версии 1 из дистрибутива stable
- версии 2 и 3 этого же пакета доступны в testing и unstable соответственно
П риоритеты:
- установленная версия 1 имеет приоритет 100
- версия в stable (та же самая версия 1) имеет приоритет 990, потому что она часть целевого релиза
- пакеты в testing и unstable имеют приоритет 500 — это приоритет по умолчанию для неустановленных версий.
Итог: будет выбрана версия 1 с приоритетом 990. Пакет остаётся в stable.
Исходные данные 2:
- установлен пакет версии 2 из testing
- версия 1 доступна в stable
- версия 3 доступна в unstable
Приоритеты:
- версия 1 имеет приоритет 990
- версии 2 и 3 имеют приоритеты 500
Итог: выбрана версия 3. Версия 1 (приоритет 990 — это меньше 1000) отбрасывается, так как её номер ниже номера установленной версии. Из версий 2 и 3 apt выбирает более свежую версию — версию из unstable.
Если нужно избежать автоматического обновления из testing до версий из unstable, нужно назначить пакетам из unstable приоритет ниже 500 (например, 490).
Пример записи в /etc/apt/preferences
:
Package: *
Pin: release a=unstable
Pin-Priority: 490