Как блокировать обновления пакетов и ядра в Debian, Ubuntu и Linux Mint

APT – это, пожалуй, самый полезный инструмент для пользователя Debian. Вы можете установить, обновить и удалить любое программное обеспечение из вашей системы Linux с помощью одной команды. Но иногда вам необходим полный контроль над тем, какой пакет вы хотите установить или обновить, а какой заблокировать от автоматического обновления. Почему вы хотите это сделать? Иногда вы обнаруживаете, что обновленная версия пакета содержит ошибки. Вы не хотите, чтобы этот пакет обновился в следующий раз, когда вы запустите sudo apt upgrade. А обновлять каждый пакет по отдельности очень хлопотно.

В этом руководстве мы рассмотрим, как заблокировать установку или обновление определенных пакетов и как заблокировать установку определенных версий пакетов или ядер.

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

Здесь мы рассмотрим два метода. Первый метод блокирует все установки и обновления для определенного пакета. Второй метод предлагает более детальный контроль, позволяя вам блокировать только определенные версии пакета.

Необходимые условия

  • Сервер с ОС Ubuntu или Debian. Для этого руководства использовалась Ubuntu 22.04, но приведенные здесь команды будут работать и с другими операционными системами на базе Debian. На десктопной версии будет работать все также как и с серверной.
  • Пользователь с привилегиями sudo.

Блокировка пакета от обновления используя apt-mark

Чтобы заблокировать пакет от установки, обновления или удаления, мы можем использовать команду apt-mark.

Если вы хотите заблокировать пакет, например, htop от обновления или удаления, используйте следующую команду.

sudo apt-mark hold htop

Вы должны увидеть следующий результат.

htop hold on htop

Заблокированный пакет останется в той же версии, даже если вы обновите систему.

Чтобы снять блокировку пакета, выполните следующую команду.

sudo apt-mark unhold htop

Вы должны увидеть следующий результат.

Canceled hold on htop

Важная оговорка: хотя пакет не будет автоматически обновлен при использовании команды apt upgrade или при обновлении системы графическую оболочку, вы все равно сможете удалить пакет вручную: apt remove <package>.

Этот метод только блокирует пакет от автоматического обновления.

Более сложный, но гибкий метод

Этот метод предполагает редактирование файла /etc/apt/preferences, где вы можете точно указать, какая версия какого пакета из какого репозитория будет установлена.

Каждый пакет получает числовой приоритет, на основании которого APT решает, устанавливать пакет или нет, и если да, то из какого репозитория он должен его взять.

Например, давайте проверим некоторые подробности о пакете nginx. Выполните следующую команду.

apt-cache policy nginx

Вы должны увидеть похожий вывод.

nginx:
Installed: (none)
Candidate: 1.22.1-1
jammy
Version table:
1.22.1-1
jammy 500
500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
1.22.0-1
jammy 500
500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
1.20.2-1
jammy 500
500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
1.18.0-6ubuntu14.3 500
500 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
500 http://us.archive.ubuntu.com/ubuntu jammy-security/main amd64 Packages
1.18.0-6ubuntu14 500
500 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 Packages

Вы увидите, что есть два репозитория, из которых устанавливается nginx. Первый – это репозиторий Ubuntu, а второй – репозиторий nginx.
Вы можете увидеть число 500 напротив доступных репозиториев. Это число определяет приоритет установки и обновления пакета. Поскольку оно одинаково для всех репозиториев, вероятность того, что nginx придет из любого репозитория, одинакова. Как же система решит, какой пакет выбрать? Она выберет самую высокую версию. В данном случае это 1.22.1. Для Ubuntu полный номер версии будет 1.22.1-1
jammy.

Если вы не хотите обновляться до версии 1.22.1 и хотите заблокировать ее, то вам нужно отредактировать файл /etc/apt/preferences.

Откройте файл в редакторе nano.

sudo nano /etc/apt/preferences

Эта команда также поможет вам создать файл, если он не существовал в системе ранее.

Вставьте следующий код в файл.

Пакет: nginx
Pin: версия 1.22.1-1
jammy
Pin-Priority: -1

Установка приоритета меньше 0 означает, что пакет не будет установлен. Если вы хотите, чтобы пакет всегда устанавливался, установите его приоритет на 1000 или выше.

Давайте еще раз проверим пакет.

apt-cache policy nginx

Вы увидите следующий результат.

nginx:
Installed: (none)
Candidate: 1.22.0-1
jammy
Version table:
1.22.1-1
jammy -1
500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
1.22.0-1
jammy 500
500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
1.20.2-1
jammy 500
500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
1.18.0-6ubuntu14.3 500
500 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
500 http://us.archive.ubuntu.com/ubuntu jammy-security/main amd64 Packages
1.18.0-6ubuntu14 500
500 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 Packages
. Заметили разницу? Версия релиза Candidate снизилась с 1.22.1 до 1.22.0. Это означает, что следующая более высокая версия, которую теперь установит система, будет 1.22.0. Вы также заметите -1 напротив последней версии, что означает, что система должна пропустить эту версию.

Как пропустить только одну версию?

Вы можете добавить несколько записей для одного и того же пакета в файл. Например, добавьте следующий код в файл.

Package: nginx
Pin: version 1.22.1-1
jammy
Pin-Priority: -1
Package: nginx
Pin: version 1.20.2-1
jammy
Pin-Priority: 1000

Здесь мы говорим системе пропустить версию 1.22.1, но всегда устанавливать версию 1.20.2.

Проверяем снова с помощью команды apt-cache policy.

nginx:
Installed: (none)
Candidate: 1.20.2-1
jammy
Version table:
1.22.1-1
jammy -1
500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
1.22.0-1
jammy 500
500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
1.20.2-1
jammy 1000
500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
1.18.0-6ubuntu14.3 500
500 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
500 http://us.archive.ubuntu.com/ubuntu jammy-security/main amd64 Packages
1.18.0-6ubuntu14 500
500 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 Packages

Версия, которая будет установлена, теперь 1.20.2 вместо 1.22.0.

Изменение предпочитаемого репозитория

Рассмотрим еще один случай. Что если мы хотим заблокировать установку Nginx из своего репозитория и выбрать вместо него репозиторий Ubuntu? Одним из способов будет удаление репозитория Nginx, но вы можете снова использовать файл предпочтений для выбора репозитория.

Введите следующий код в файл.

Package: nginx
Pin: release o=nginx
Pin-Priority: -1

Ключевое слово release просто указывает на следующую более высокую версию. o=nginx указывает на происхождение пакета. Здесь это nginx. Это означает, что система не должна устанавливать пакет nginx из своего репозитория. Другой способ добиться того же результата – использовать следующий код.

Package: nginx
Pin: release o=jammy
Pin-Priority: 1000

На этот раз мы установили приоритет 1000 для пакета из репозитория Ubuntu (jammy). Это гарантирует, что Nginx всегда будет устанавливаться из репозитория Ubuntu, а не откуда-либо еще.

Не только вы можете указать происхождение пакета, но вы также можете добавить архив, компонент, метку и архитектуру пакета, которые система должна выбрать, используя следующие ключевые слова в разделе Pin.

  • c — Component
  • a — Archive
  • o — Origin
  • l — Label
  • n — Architecture

Комментарии (0)