Перейти к основному содержимому
Приоритеты источников

Приоритеты источников

Пакетный менеджер 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 выберет содержимое, отличающееся от установленного сейчас.

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

Случаи установки более старой версии:

Анализ записей приоритетов

к сведению

apt анализирует /etc/apt/preferences и /etc/apt/preferences.d/ в следующем порядке:

  1. Наиболее конкретные записи, например, указывающие на пакет.
  2. Более общие, например, все пакеты определённого дистрибутива. Если существует несколько общих записей, то используется первая найденная.

Записи могут содержать такие критерии как имя пакета и его источник. Каждый пакет идентифицируется по информации, предоставленной в файле 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