Подробный гайд по APT: настройка репозиториев, работа с версиями пакетов, pinning
Гайд по APT: как устроены репозитории, как APT выбирает версии пакетов, как работает pinning, как безопасно добавлять сторонние репозитории, фиксировать версии, делать downgrade и не сломать систему.
1. Как APT принимает решения
APT состоит из нескольких уровней:
- dpkg — база уже установленных пакетов.
- APT — решает зависимости, скачивает пакеты, выбирает версии.
- sources.list / sources.list.d — откуда брать пакеты.
- Release-метаданные — информация о репозитории: Origin, Label, Suite, Codename, компонент, архитектура.
- preferences / preferences.d — правила pinning, то есть приоритеты версий и репозиториев.
Основные файлы:
/etc/apt/sources.list
/etc/apt/sources.list.d/*.list
/etc/apt/sources.list.d/*.sources
/etc/apt/apt.conf
/etc/apt/apt.conf.d/
/etc/apt/preferences
/etc/apt/preferences.d/*.pref
/etc/apt/keyrings/
/etc/apt/trusted.gpg
/etc/apt/trusted.gpg.d/
Современная практика:
- репозитории лучше держать в
/etc/apt/sources.list.d/; - ключи лучше хранить в
/etc/apt/keyrings/; - для сторонних репозиториев использовать
signed-by=/etc/apt/keyrings/...; - не использовать устаревший
apt-key, если можно этого избежать.
2. Формат репозиториев APT
2.1. Классический one-line формат
Файлы:
/etc/apt/sources.list
/etc/apt/sources.list.d/*.list
Пример:
deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
Разбор:
deb <URI> <suite> <components>
deb— бинарные пакеты.deb-src— исходные пакеты.<URI>— адрес репозитория.<suite>— выпуск или канал:bookworm,stable,bookworm-updates,bookworm-security,bookworm-backportsи т.д.<components>— компоненты:main,contrib,non-free,non-free-firmwareи др.
С опциями:
deb [arch=amd64 signed-by=/etc/apt/keyrings/example.gpg] https://repo.example.com/debian bookworm main
Полезные опции в квадратных скобках:
arch=amd64,i386
signed-by=/etc/apt/keyrings/example.gpg
trusted=yes
check-valid-until=no
by-hash=yes
lang=none
Важно:
trusted=yes— отключает проверку подписи. Использовать только в изолированных тестовых средах.signed-by=...— современный правильный способ указать ключ конкретного репозитория.
2.2. Новый deb822 формат
Файлы:
/etc/apt/sources.list.d/*.sources
Пример:
Types: deb
URIs: https://repo.example.com/debian
Suites: bookworm
Components: main
Signed-By: /etc/apt/keyrings/example.gpg
Более полный пример:
Types: deb deb-src
URIs: https://repo.example.com/debian
Suites: bookworm bookworm-updates
Components: main contrib
Architectures: amd64 i386
Signed-By: /etc/apt/keyrings/example.gpg
Check-Valid-Until: yes
Формат deb822 удобнее, когда нужно несколько suites, компонентов или архитектур.
3. Примеры sources.list для Debian и Ubuntu
3.1. Debian 12 bookworm
Примерный набор:
deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware
deb http://deb.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb http://deb.debian.org/debian bookworm-backports main contrib non-free non-free-firmware
Назначение:
bookworm— основной стабильный выпуск.bookworm-updates— важные обновления, не попавшие в initial release.bookworm-security— обновления безопасности.bookworm-backports— более новые версии некоторых программ, собранные для стабильного выпуска.
3.2. Ubuntu 22.04 jammy
Пример:
deb http://archive.ubuntu.com/ubuntu jammy main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu jammy-updates main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu jammy-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu jammy-backports main restricted universe multiverse
Компоненты Ubuntu:
main— поддерживаемый свободный софт.restricted— драйверы и проприетарные модули, важные для работы.universe— сообществом поддерживаемый свободный софт.multiverse— несвободный софт.
4. Безопасное добавление стороннего репозитория
Современный подход: ключ хранится отдельно, репозиторий ссылается на него через signed-by.
Пример:
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://repo.example.com/pubkey.asc \
| sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg
sudo chmod 0644 /etc/apt/keyrings/example.gpg
Добавляем репозиторий в deb822 формате:
cat <<'EOF' | sudo tee /etc/apt/sources.list.d/example.sources
Types: deb
URIs: https://repo.example.com/debian
Suites: bookworm
Components: main
Signed-By: /etc/apt/keyrings/example.gpg
EOF
Обновляем metadata:
sudo apt update
Если репозиторий старый и ключ нужно добавить вручную, лучше все равно использовать отдельный keyring:
/etc/apt/keyrings/example.gpg
Не рекомендуется:
sudo apt-key add key.asc
apt-key устарел и делает ключ доверенным для всей системы.
5. Release-метаданные: что можно использовать в pinning
Каждый репозиторий имеет файл Release или InRelease.
В нем есть поля:
Origin: Debian
Label: Debian
Suite: stable
Codename: bookworm
Version: 12.11
Architectures: amd64 i386
Components: main contrib non-free non-free-firmware
APT видит эти поля и использует их в pinning.
Посмотреть известные репозитории и их атрибуты:
apt-cache policy
Пример строки:
500 http://deb.debian.org/debian bookworm/main amd64 Packages
release v=12.11,o=Debian,a=stable,n=bookworm,l=Debian,c=main,b=amd64
Значения:
v=12.11 Version
o=Debian Origin
a=stable Archive/Suite
n=bookworm Codename
l=Debian Label
c=main Component
b=amd64 Architecture
Эти атрибуты используются в Pin: release ....
Примеры:
Pin: release a=stable
Pin: release n=bookworm
Pin: release o=Debian
Pin: release l=Debian
Pin: release c=main
Pin: release a=stable-security
Pin: release a=stable-backports
Всегда проверяйте реальные значения через:
apt-cache policy
Потому что bookworm, stable, stable-security, bookworm-security и т.п. могут отображаться по-разному в зависимости от дистрибутива и репозитория.
6. Как APT выбирает версию пакета
Для каждого пакета APT видит несколько версий:
- установленная версия;
- версии из подключенных репозиториев;
- версии, закрепленные pinning-правилами. У каждой версии есть приоритет.
Типовые приоритеты:
| Priority | Что обычно означает |
|---|---|
< 0 |
версия не рассматривается, фактически запрещена |
1 |
очень низкий приоритет, например experimental/NotAutomatic |
100 |
обычно установленная версия; также часто low-priority архивы |
200 |
условный низкий приоритет, часто используют для backports |
500 |
обычный приоритет репозитория |
900/990 |
целевой выпуск, target release |
1001+ |
разрешает понижение версии, downgrade |
Важные правила:
- APT выбирает версию с наивысшим приоритетом.
- Если приоритеты одинаковые, выбирается более новая версия.
- APT обычно не делает downgrade автоматически.
4. Downgrade возможен, если:
- явно указан
--allow-downgrades; - версия имеет pin priority выше 1000;
- выполняется явная установка конкретной версии.
Посмотреть кандидатную версию:
apt-cache policy package-name
Пример:
package-name:
Installed: 1.2.3-1
Candidate: 1.2.4-1
Version table:
1.3.0-1~bpo12+1 100
100 http://deb.debian.org/debian bookworm-backports/main amd64 Packages
*** 1.2.4-1 500
500 http://deb.debian.org/debian bookworm/main amd64 Packages
100 /var/lib/dpkg/status
1.2.3-1 500
500 http://deb.debian.org/debian bookworm/main amd64 Packages
Здесь:
Installed— текущая установленная версия.Candidate— версия, которую APT готов установить.- числа слева — приоритеты версий.
/var/lib/dpkg/status— локальная установленная версия.
7. Target release: -t и APT::Default-Release
Target release — это выпуск, который APT считает предпочтительным.
Временно:
sudo apt install -t bookworm-backports package-name
или:
sudo apt-get -t bookworm-backports install package-name
Постоянно через конфигурацию:
/etc/apt/apt.conf.d/99defaultrelease
Содержимое:
APT::Default-Release "stable";
или:
APT::Default-Release "bookworm";
или для Ubuntu:
APT::Default-Release "jammy";
Но здесь важно понимать:
APT::Default-Releaseделает целевой выпуск приоритетным.- Обычно target release получает приоритет около 990.
- Если у вас несколько архивов, например
stable,stable-updates,stable-security,backports, лучше явно задать pinning, чтобы случайно не заблокировать обновления безопасности.
Особенно осторожно:
Если задать только:
APT::Default-Release "stable";
то репозиторий stable-security может не считаться тем же target release. Поэтому лучше дополнительно pin-нить security/updates.
8. Pinning: файлы и синтаксис
Файлы pinning:
/etc/apt/preferences
/etc/apt/preferences.d/*.pref
Рекомендуется использовать каталог:
/etc/apt/preferences.d/
И давать файлам понятные имена:
/etc/apt/preferences.d/10-stable.pref
/etc/apt/preferences.d/20-security.pref
/etc/apt/preferences.d/30-backports.pref
/etc/apt/preferences.d/40-vendor.pref
Формат записи:
Package: имя-пакета
Pin: условие
Pin-Priority: приоритет
Пример:
Package: nginx
Pin: version 1.22.1-2
Pin-Priority: 1001
Можно добавлять комментарии через # или Explanation::
Explanation: Keep backports low priority by default
Package: *
Pin: release a=stable-backports
Pin-Priority: 100
Записи разделяются пустой строкой.
9. Основные виды Pin
9.1. Pin по release
Самый частый вариант.
Pin: release a=stable
Атрибуты:
a=archive/suite
n=codename
o=origin
l=label
v=version
c=component
b=architecture
Примеры:
Pin: release a=stable
Pin: release n=bookworm
Pin: release o=Debian
Pin: release l=Debian
Pin: release a=stable-security
Pin: release a=stable-backports
Pin: release c=main
Pin: release c=non-free
Можно комбинировать:
Pin: release o=Debian,a=stable
или:
Pin: release o=Debian,n=bookworm,c=main
9.2. Pin по версии пакета
Pin: version 1.2.3-1
Можно использовать шаблоны:
Pin: version 1.2.*
Пример:
Package: nginx
Pin: version 1.22.*
Pin-Priority: 1001
Важно:
- если нужна точная версия, указывайте точную строку версии;
- если используете wildcard, APT выберет самую новую подходящую версию среди совпадений;
- если версия содержит epoch, его нужно указывать.
Пример версии с epoch:
1:2.36-1ubuntu8.6
Pin:
Package: example
Pin: version 1:2.36-*
Pin-Priority: 1001
9.3. Pin по origin
Существует также Pin: origin, но он менее однозначен и зависит от реализации/версии APT. Иногда он сопоставляет источник репозитория, иногда используется в специфических сценариях.
Для предсказуемого pinning лучше использовать:
Pin: release o=...
Pin: release l=...
Pin: release a=...
Pin: release n=...
А не голый Pin: origin, если вы не уверены, что именно он матчит в вашей системе.
Проверка всегда одна:
apt-cache policy
apt-cache policy package-name
10. Приоритеты pinning
10.1. Отрицательный приоритет
Pin-Priority: -1
или:
Pin-Priority: -10
Фактически запрещает установку версий из этого источника/условия.
Пример:
Package: *
Pin: release a=unstable
Pin-Priority: -10
Это значит: не использовать пакеты из unstable, если только нет более специфичного правила.
10.2. Низкий приоритет
Pin-Priority: 100
или:
Pin-Priority: 200
Часто используется для backports или сторонних репозиториев, чтобы они не участвовали в обычном обновлении.
Пример:
Package: *
Pin: release a=stable-backports
Pin-Priority: 100
Тогда backports не будут устанавливаться автоматически при обычном apt upgrade.
10.3. Обычный приоритет
Pin-Priority: 500
Типовой приоритет обычного репозитория.
10.4. Высокий приоритет
Pin-Priority: 900
или:
Pin-Priority: 990
Используется для целевого выпуска или пакетов, которые должны быть предпочтены.
10.5. Приоритет выше 1000
Pin-Priority: 1001
Разрешает downgrade.
Пример:
Package: example
Pin: version 1.2.3-1
Pin-Priority: 1001
Если установлена более новая версия, APT сможет понизить ее до 1.2.3-1.
Важно:
1000обычно недостаточно для автоматического downgrade;- используйте
1001и выше осознанно;
- в production лучше сначала делать симуляцию:
sudo apt-get -s install example
или:
sudo apt-get -s dist-upgrade
11. Практические сценарии pinning
Ниже примеры.
Перед применением лучше сделать backup:
sudo cp -a /etc/apt /root/etc/apt.backup-$(date +%F)
11.1. Debian stable + security + updates + backports
Задача:
- основной источник — stable;
- обновления безопасности имеют высокий приоритет;
- backports не устанавливаются автоматически.
Пример:
# /etc/apt/preferences.d/10-stable.pref
Package: *
Pin: release a=stable
Pin-Priority: 900
Package: *
Pin: release a=stable-updates
Pin-Priority: 900
Package: *
Pin: release a=stable-security
Pin-Priority: 1000
Package: *
Pin: release a=stable-backports
Pin-Priority: 100
Если apt-cache policy показывает другие значения a=, адаптируйте.
Например, для Debian в выводе может быть:
a=stable
a=stable-updates
a=stable-security
a=stable-backports
После изменений:
sudo apt update
apt-cache policy
11.2. Backports по умолчанию выключены, но доступны вручную
Файл:
# /etc/apt/preferences.d/20-backports.pref
Explanation: Backports are not preferred by default
Package: *
Pin: release a=stable-backports
Pin-Priority: 100
Обновить metadata:
sudo apt update
Установить пакет из backports можно так:
sudo apt install -t bookworm-backports package-name
или:
sudo apt install package-name/bookworm-backports
Если нужно, чтобы конкретный пакет всегда брался из backports:
# /etc/apt/preferences.d/21-backports-zfs.pref
Package: zfsutils-linux
Pin: release a=stable-backports
Pin-Priority: 990
Если у пакета есть зависимости, которые тоже должны быть из backports, возможно понадобится:
- перечислить их отдельно;
- использовать
-t bookworm-backports; - проверить зависимости через
apt-cache depends; - выполнить симуляцию установки.
Пример:
sudo apt-get -s -t bookworm-backports install zfsutils-linux
11.3. Зафиксировать конкретную версию пакета
Сначала смотрим доступные версии:
apt-cache madison package-name
или:
apt list -a package-name
или:
apt-cache policy package-name
Пример pinning:
# /etc/apt/preferences.d/30-package-version.pref
Package: package-name
Pin: version 1.2.3-1
Pin-Priority: 1001
Затем:
sudo apt update
sudo apt-get -s install package-name
Если нужно реально установить/понизить:
sudo apt install package-name=1.2.3-1
Если APT сопротивляется:
sudo apt install --allow-downgrades package-name=1.2.3-1
11.4. Запретить пакету обновляться
Есть два механизма:
Hold через apt-mark
sudo apt-mark hold package-name
Проверить:
apt-mark showhold
Снять:
sudo apt-mark unhold package-name
Hold хорошо защищает от обычных обновлений. Но если нужно жестко зафиксировать версию в политике APT, лучше добавить pinning.
Pinning
Package: package-name
Pin: version 1.2.3-1
Pin-Priority: 1001
Разница:
apt-mark holdзапрещает обычному APT менять пакет;- pinning определяет, какая версия считается кандидатом. В важных системах можно использовать оба варианта.
11.5. Установить пакет из testing, но не тащить всю систему в testing
Опасный сценарий. Лучше использовать только для отдельных пакетов и после тщательной проверки.
Пример:
# /etc/apt/preferences.d/40-testing.pref
Explanation: Do not use testing/unstable by default
Package: *
Pin: release a=testing
Pin-Priority: -10
Package: *
Pin: release a=unstable
Pin-Priority: -10
Explanation: But allow mytool from testing
Package: mytool
Pin: release a=testing
Pin-Priority: 990
Проблема:
mytool может потребовать зависимости из testing.
Тогда нужно либо:
- явно pin-нить зависимости;
- использовать
-t testingдля установки; - использовать контейнер/VM;
- внимательно читать
apt-get -s install mytool.
Пример симуляции:
sudo apt-get -s -t testing install mytool
11.6. Сторонний vendor-репозиторий: использовать только один пакет
Задача:
- репозиторий vendor подключен;
- по умолчанию он не должен побеждать системные пакеты;
- из него должен ставиться только конкретный пакет.
Пример:
# /etc/apt/preferences.d/50-vendor.pref
Explanation: Vendor repository low priority by default
Package: *
Pin: release o=ExampleVendor
Pin-Priority: 50
Explanation: But example-agent should come from vendor
Package: example-agent
Pin: release o=ExampleVendor
Pin-Priority: 990
Если o=ExampleVendor не совпадает, смотрите точное значение через:
apt-cache policy
Там может быть, например:
o=Example Vendor
или:
l=Example Vendor Repository
Тогда используйте:
Pin: release l=Example Vendor Repository
11.7. Полностью запретить репозиторий или компонент
Например, запретить non-free:
Package: *
Pin: release c=non-free
Pin-Priority: -1
Запретить конкретный vendor:
Package: *
Pin: release o=BadVendor
Pin-Priority: -1
Запретить конкретный пакет из всех источников:
Package: bad-package
Pin: release *
Pin-Priority: -1
Но на практике часто проще и надежнее просто не включать нежелательный репозиторий или удалить его.
11.8. Предпочитать локальное зеркало
Если у вас есть локальный mirror с корректным Release, можно pin-нить его по атрибутам release.
Например, если в Release:
Origin: LocalMirror
Label: LocalMirror
Тогда:
Package: *
Pin: release o=LocalMirror
Pin-Priority: 700
Если локальный mirror не имеет Release-файла, pinning может быть менее удобным.
В таком случае лучше сгенерировать metadata:
cd /srv/mirror
apt-ftparchive packages . > Packages
gzip -k Packages
apt-ftparchive release . > Release
Или использовать более специализированные инструменты:
reprepro
aptly
pulp
12. Работа с версиями пакетов
12.1. Посмотреть все доступные версии
apt-cache madison package-name
apt list -a package-name
apt-cache policy package-name
apt-cache show package-name
apt-cache showpkg package-name
12.2. Установить конкретную версию
sudo apt install package-name=1.2.3-1
Если нужно понизить версию:
sudo apt install --allow-downgrades package-name=1.2.3-1
Если нужно переустановить:
sudo apt install --reinstall package-name=1.2.3-1
12.3. Установить пакет из конкретного выпуска
sudo apt install package-name/bookworm-backports
или:
sudo apt install -t bookworm-backports package-name
Разница:
package-name/suite— явно просит версию из указанного suite;-t suite— временно делает suite целевым выпуском для команды.
12.4. Сравнение версий
Версии в Debian/Ubuntu сравниваются не как обычные строки.
Есть epoch:
1:2.36-1
Где:
1 epoch
2.36 upstream version
1 debian revision
Epoch имеет наивысший приоритет.
Пример:
1:1.0 > 2.0
Проверка версии:
dpkg --compare-versions 1.2.3 lt 1.2.4 && echo "older"
Примеры:
dpkg --compare-versions 1.0~rc1 lt 1.0 && echo "rc is older"
dpkg --compare-versions 1.0-1 lt 1.0-2 && echo "revision older"
dpkg --compare-versions 1:1.0 gt 2.0 && echo "epoch wins"
13. Обновление системы
13.1. Базовые команды
sudo apt update
Список обновляемых пакетов:
apt list --upgradable
Обычное обновление:
sudo apt upgrade
Полное обновление, которое может удалять/устанавливать пакеты ради зависимостей:
sudo apt full-upgrade
Старый аналог:
sudo apt-get dist-upgrade
13.2. Симуляция
Перед реальными действиями:
sudo apt-get -s upgrade
sudo apt-get -s full-upgrade
sudo apt-get -s install package-name
Это очень полезная привычка при любом нетривиальном pinning.
13.3. Проверка зависимостей
sudo apt-get check
Если есть сломанные зависимости:
sudo apt-get -f install
Но будьте внимательны: -f install может предложить удалить или заменить пакеты. Сначала читайте вывод.
14. Диагностика pinning
14.1. Проверить общую политику
apt-cache policy
Покажет:
- подключенные репозитории;
- их приоритеты;
- release-атрибуты;
- глобальные pinned packages.
14.2. Проверить конкретный пакет
apt-cache policy package-name
Смотрим:
Installed;Candidate;- таблицу версий;
- приоритеты;
- репозитории.
14.3. Pin не работает
Частые причины:
1. Неверный атрибут release
Вы написали:
Pin: release a=bookworm-security
а APT видит:
a=stable-security
Проверьте:
apt-cache policy
2. Файл не читается
APT в preferences.d обычно ожидает файлы с расширением .pref и нормальными именами.
Плохие варианты:
my prefs
my@prefs
my_prefs.txt
prefs.conf
Лучше:
10-backports.pref
20-vendor.pref
3. Другой pin перекрывает правило
Проверьте все файлы:
grep -R "Package: package-name" /etc/apt/preferences /etc/apt/preferences.d
или шире:
grep -R "Pin:" /etc/apt/preferences /etc/apt/preferences.d
4. Пакет удержан hold
apt-mark showhold
Если пакет в hold:
sudo apt-mark unhold package-name
5. Версии нет в подключенных репозиториях
Проверьте:
apt-cache madison package-name
или:
apt list -a package-name
6. Не обновлен кэш APT
После изменения sources:
sudo apt update
После изменения preferences apt update обычно не обязателен, но полезен для проверки:
apt-cache policy package-name
15. Типичные ошибки apt update
15.1. NO_PUBKEY
Пример ошибки:
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0123456789ABCDEF
Правильный путь:
- Получить ключ от владельца репозитория.
- Положить его в
/etc/apt/keyrings/. - Указать в источнике
signed-by=.... - Обновить APT.
Пример:
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://repo.example.com/key.asc \
| sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg
sudo chmod 0644 /etc/apt/keyrings/example.gpg
В source-файле:
Signed-By: /etc/apt/keyrings/example.gpg
или в one-line формате:
deb [signed-by=/etc/apt/keyrings/example.gpg] https://repo.example.com/debian bookworm main
15.2. BADSIG / EXPKEYSIG
Причины:
- ключ изменен;
- ключ отозван;
- mirror поврежден;
- Release-файл устарел;
- репозиторий заброшен.
Действия:
- Проверить официальный сайт репозитория.
- Обновить ключ.
- Если репозиторий заброшен — удалить его.
- Не использовать
trusted=yesбез крайней необходимости.
15.3. Release file changed
Иногда после смены дистрибутива APT ругается, что изменились поля Release. Например, после перехода testing -> stable.
Можно использовать:
sudo apt-get update --allow-releaseinfo-change
Но сначала убедитесь, что вы действительно понимаете, куда мигрирует система.
15.4. Репозиторий игнорируется
Проверьте:
- файл должен быть в
/etc/apt/sources.list.d/; - для one-line формата расширение
.list; - для deb822 формата расширение
.sources; - синтаксис корректен;
- нет дублей;
- архитектура подходит;
- suite существует;
- ключ указан правильно.
Можно временно проверить один файл:
sudo apt-get update \
-o Dir::Etc::SourceList=/etc/apt/sources.list.d/example.list \
-o Dir::Etc::SourceParts=/dev/null
16. Безопасность
16.1. Никогда не делайте глобальный trust без нужды
Плохо:
deb [trusted=yes] https://example.com/repo ./
Это отключает проверку подписи. Допустимо только в изолированной тестовой среде.
16.2. Используйте signed-by
Хорошо:
deb [signed-by=/etc/apt/keyrings/example.gpg] https://example.com/repo bookworm main
или:
Signed-By: /etc/apt/keyrings/example.gpg
16.3. Минимизируйте количество репозиториев
Каждый лишний репозиторий:
- расширяет attack surface;
- может подсунуть более новую версию;
- может сломать зависимости;
- усложняет обновления.
16.4. Сторонние репозитории держите на низком приоритете
Например:
Package: *
Pin: release o=ThirdPartyVendor
Pin-Priority: 100
И повышайте приоритет только для нужных пакетов.
16.5. Проверяйте, что будет установлено
Перед установкой:
apt-get -s install package-name
Перед обновлением:
apt-get -s upgrade
Перед полным обновлением:
apt-get -s full-upgrade
17. APT, pinning и unattended-upgrades
Если используется автоматическое обновление, pinning может повлиять на то, какие пакеты будут обновляться.
Особенно важно:
- не занизить случайно security-репозиторий;
- не заблокировать обновления ядра;
- не зафиксировать уязвимую версию;
- не создать конфликт между stable и backports.
Проверить поведение unattended-upgrades можно в dry-run режиме, например:
sudo unattended-upgrade -d --dry-run
Название опций может немного отличаться в зависимости от версии.
18. Пример безопасной конфигурации для Debian stable
Допустим, мы хотим:
- stable как основу;
- security с высоким приоритетом;
- updates с обычным высоким приоритетом;
- backports только вручную.
sources.list.d:
/etc/apt/sources.list.d/debian.sources
Types: deb
URIs: http://deb.debian.org/debian
Suites: bookworm bookworm-updates
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
URIs: http://deb.debian.org/debian-security
Suites: bookworm-security
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
URIs: http://deb.debian.org/debian
Suites: bookworm-backports
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
preferences:
# /etc/apt/preferences.d/10-debian-stable.pref
Explanation: Stable base
Package: *
Pin: release a=stable
Pin-Priority: 900
Explanation: Stable updates
Package: *
Pin: release a=stable-updates
Pin-Priority: 900
Explanation: Security should be preferred
Package: *
Pin: release a=stable-security
Pin-Priority: 1000
Explanation: Backports only manually
Package: *
Pin: release a=stable-backports
Pin-Priority: 100
Далее:
sudo apt update
apt-cache policy
Установка из backports:
sudo apt install -t bookworm-backports package-name
или:
sudo apt install package-name/bookworm-backports
19. Пример фиксации версии и защиты от обновления
Допустим, нужно держать example версии 2.4.5-1.
Сначала смотрим доступные версии:
apt-cache madison example
Создаем pin:
# /etc/apt/preferences.d/30-example.pref
Explanation: Freeze example at 2.4.5-1
Package: example
Pin: version 2.4.5-1
Pin-Priority: 1001
Дополнительно можно поставить hold:
sudo apt-mark hold example
Проверка:
apt-cache policy example
apt-mark showhold
Если позже нужно разрешить обновление:
sudo apt-mark unhold example
sudo rm /etc/apt/preferences.d/30-example.pref
sudo apt update
20. Пример downgrade
Допустим, установлена версия:
example 3.0.0-1
Нужна:
example 2.4.5-1
Вариант 1 — разовая установка:
sudo apt install --allow-downgrades example=2.4.5-1
Вариант 2 — постоянный pin:
# /etc/apt/preferences.d/30-example.pref
Package: example
Pin: version 2.4.5-1
Pin-Priority: 1001
Затем:
sudo apt update
sudo apt-get -s install example
sudo apt install example
Если downgrade тянет за собой зависимости, внимательно читайте вывод.
Иногда нужно явно указать несколько пакетов:
sudo apt install --allow-downgrades \
example=2.4.5-1 \
libexample0=2.4.5-1
21. Частые ошибки при использовании pinning
21.1. Pinning всех пакетов без необходимости
Правило:
Package: *
очень мощное. Оно влияет на всю систему. Используйте его только когда понимаете, зачем.
21.2. Использование стабильного alias вместо codename
Например:
Pin: release a=stable
stable однажды станет другим выпуском. После выхода новой стабильной версии поведение может измениться.
Если нужна фиксация на конкретном выпуске, лучше:
Pin: release n=bookworm
Но нужно учитывать, что n=bookworm может совпадать сразу для нескольких архивов: stable, updates, security, backports. Поэтому часто лучше комбинировать атрибуты.
21.3. Pinning по неправильному полю
Например, вы пишете:
Pin: release o=Debian
а репозиторий на самом деле имеет:
o=Debian Backports
или:
l=Debian Security
Проверяйте через:
apt-cache policy
21.4. Низкий приоритет security
Очень опасная ошибка. Если security-обновления имеют приоритет ниже, чем stable, система может не ставить исправления безопасности. Security-репозиторий должен быть как минимум не ниже основного, а часто выше.
21.5. Смешивание stable/testing/unstable
Это называется иногда "FrankenDebian".
Если вы ставите много пакетов из testing/unstable на stable, это может привести к:
- поломке зависимостей;
- невозможности нормального обновления;
- конфликтам библиотек;
- неожиданному удалению пакетов при
full-upgrade.
Для отдельных задач лучше:
- контейнер;
- VM;
- flatpak/snap/AppImage;
- сборка в chroot;
- отдельный namespace;
- Python venv, Node nvm и т.п.
22. Полезные команды
22.1. Политика APT
apt-cache policy
apt-cache policy package-name
22.2. Версии пакета
apt-cache madison package-name
apt list -a package-name
apt-cache show package-name
apt-cache showpkg package-name
22.3. Зависимости
apt-cache depends package-name
apt-cache rdepends package-name
apt-cache show package-name | grep Depends
22.4. Симуляция
sudo apt-get -s install package-name
sudo apt-get -s upgrade
sudo apt-get -s full-upgrade
22.5. Hold
sudo apt-mark hold package-name
sudo apt-mark unhold package-name
apt-mark showhold
22.6. Установка конкретной версии
sudo apt install package-name=1.2.3-1
sudo apt install --allow-downgrades package-name=1.2.3-1
sudo apt install --reinstall package-name=1.2.3-1
22.7. Установка из конкретного выпуска
sudo apt install package-name/bookworm-backports
sudo apt install -t bookworm-backports package-name
22.8. Проверка установленного пакета
dpkg -l package-name
dpkg -s package-name
dpkg-query -W -f='${Package} ${Version} ${Status}\n' package-name
22.9. Конфигурация APT
Посмотреть эффективную конфигурацию:
apt-config dump
Найти конкретную опцию:
apt-config dump | grep Default-Release
23. Рекомендуемый порядок действий при настройке pinning
1. Сделать backup:
sudo cp -a /etc/apt /root/etc/apt.backup-$(date +%F)
2. Посмотреть текущую политику:
apt-cache policy
3. Проверить конкретный пакет:
apt-cache policy package-name
4. Добавить репозиторий, если нужен:
sudo apt update
5. Создать файл preferences:
sudo nano /etc/apt/preferences.d/99-custom.pref
6. Снова проверить политику:
apt-cache policy package-name
7. Выполнить симуляцию:
sudo apt-get -s install package-name
или:
sudo apt-get -s full-upgrade
8. Применить изменение.
9. Проверить результат:
dpkg -l package-name
apt-cache policy package-name
24. Минимальная шпаргалка
# Посмотреть политику
apt-cache policy
# Посмотреть политику по пакету
apt-cache policy package-name
# Все версии пакета
apt-cache madison package-name
apt list -a package-name
# Установить конкретную версию
sudo apt install package-name=1.2.3-1
# Downgrade
sudo apt install --allow-downgrades package-name=1.2.3-1
# Установить из backports
sudo apt install package-name/bookworm-backports
sudo apt install -t bookworm-backports package-name
# Заморозить пакет
sudo apt-mark hold package-name
# Снять заморозку
sudo apt-mark unhold package-name
# Симуляция установки
sudo apt-get -s install package-name
# Симуляция обновления
sudo apt-get -s upgrade
sudo apt-get -s full-upgrade
# Обновить metadata
sudo apt update
25. Главные практические правила
- Всегда проверяйте
apt-cache policy. - Не используйте
trusted=yesбез необходимости. - Используйте
signed-byдля сторонних репозиториев. - Сторонние репозитории держите на низком приоритете.
- Backports лучше не делать приоритетными по умолчанию.
- Security-обновления должны иметь высокий приоритет.
Package: *— потенциально опасное правило.- Перед downgrade и сложным pinning делайте симуляцию.
- Для отдельных новых версий приложений часто безопаснее контейнер или изолированная среда, чем смешивание stable/testing.
- Любые изменения в
/etc/apt/preferences.d/лучше вводить постепенно и проверять по одному.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.