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)