Подробный гайд по APT: настройка репозиториев, работа с версиями пакетов, pinning

Подробный гайд по APT: настройка репозиториев, работа с версиями пакетов, pinning, downgrade и безопасное подключение сторонних источников в Debian и Ubuntu.

2026.08.16                  


Подробный гайд по APT: настройка репозиториев, работа с версиями пакетов, pinningПодробный гайд по APT: настройка репозиториев, работа с версиями пакетов, pinning Гайд по APT: как устроены репозитории, как APT выбирает версии пакетов, как работает pinning, как безопасно добавлять сторонние репозитории, фиксировать версии, делать downgrade и не сломать систему.


1. Как APT принимает решения

APT состоит из нескольких уровней:

  1. dpkg — база уже установленных пакетов.
  2. APT — решает зависимости, скачивает пакеты, выбирает версии.
  3. sources.list / sources.list.d — откуда брать пакеты.
  4. Release-метаданные — информация о репозитории: Origin, Label, Suite, Codename, компонент, архитектура.
  5. 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

Важные правила:

  1. APT выбирает версию с наивысшим приоритетом.
  2. Если приоритеты одинаковые, выбирается более новая версия.
  3. 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

Правильный путь:

  1. Получить ключ от владельца репозитория.
  2. Положить его в /etc/apt/keyrings/.
  3. Указать в источнике signed-by=....
  4. Обновить 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-файл устарел;
  • репозиторий заброшен.

Действия:

  1. Проверить официальный сайт репозитория.
  2. Обновить ключ.
  3. Если репозиторий заброшен — удалить его.
  4. Не использовать 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. Главные практические правила

  1. Всегда проверяйте apt-cache policy.
  2. Не используйте trusted=yes без необходимости.
  3. Используйте signed-by для сторонних репозиториев.
  4. Сторонние репозитории держите на низком приоритете.
  5. Backports лучше не делать приоритетными по умолчанию.
  6. Security-обновления должны иметь высокий приоритет.
  7. Package: * — потенциально опасное правило.
  8. Перед downgrade и сложным pinning делайте симуляцию.
  9. Для отдельных новых версий приложений часто безопаснее контейнер или изолированная среда, чем смешивание stable/testing.
  10. Любые изменения в /etc/apt/preferences.d/ лучше вводить постепенно и проверять по одному.

Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.


Статью подготовил: Аверко Денис Сергеевич @Nymexis г. Омск (специалист по ЗИ)

Комментарии

Загрузка...
Если комментарии не загружаются, можете попробовать отключить блокировщик рекламы для этого сайта