- Как заблокировать обновления пакетов и ядра в Debian/Ubuntu
- Предпосылки
- Способ 1 (метка-метка)
- Способ 2 (/etc/apt/preferences)
- Пропустить одну версию, но разрешить другую
- Изменить настройки репозитория
- Блокировка определенных обновлений ядра
- Способ 1 (метка-метка)
- Способ 2 (/etc/apt/apt.conf.d/50unattended-upgrades)
- Способ 3 (дпкг)
- Способ 4 (/etc/apt/preferences)
- Заключение
- Запрет на обновление пакета в Debian/Ubuntu
Как заблокировать обновления пакетов и ядра в Debian/Ubuntu
APT, вероятно, самый полезный инструмент для пользователя Linux. Вы можете установить, обновить и удалить любое программное обеспечение/пакет из вашей системы Linux с помощью одной команды. Но иногда вам нужен детальный контроль над тем, какой пакет вы хотите установить или обновить, а какой пакет заблокировать от автоматического обновления. Почему вы хотите это сделать? Иногда вы обнаруживаете, что обновленная версия пакетов содержит ошибки. Вы не хотите, чтобы этот пакет обновлялся при следующем запуске sudo apt upgrade . И обновлять каждый пакет по отдельности очень сложно.
В этом руководстве рассказывается, как заблокировать установку или обновление определенных пакетов, а также как заблокировать установку определенных версий пакетов или ядер.
Примечание. Через некоторое время легко забыть, какие пакеты у вас были, даже если их версии без ошибок вышли. Так что будьте начеку, так как длительное хранение пакетов может привести к проблемам с безопасностью.
Здесь мы обсудим два метода. Первый метод заблокирует все установки и обновления для определенного пакета. Второй метод предлагает более детальный контроль, позволяя вам блокировать определенные версии пакета.
Предпосылки
- Сервер с ОС Ubuntu или Debian. В этом руководстве использовалась Ubuntu 22.04, но приведенные здесь команды также должны нормально работать с другими операционными системами на основе Debian и более ранними выпусками.
- Пользователь без полномочий root с привилегиями sudo.
Способ 1 (метка-метка)
Чтобы заблокировать установку, обновление или удаление пакета, мы можем использовать команду apt-mark .
Если вы хотите запретить установку, обновление или удаление пакета, например htop , используйте следующую команду.
Вы должны увидеть следующий вывод.
Заблокированный пакет останется в той же версии, даже если вы обновите свою систему. Это особенно полезно для сдерживания графических драйверов.
Чтобы снять блокировку пакета, введите следующую команду.
Вы должны увидеть следующий вывод.
При этом есть важная оговорка. Хотя пакет не будет автоматически обновляться при использовании команды sudo apt upgrade или при обновлении системы, вы все равно можете удалить пакет вручную. sudo apt remove
по-прежнему будет работать с удерживаемыми пакетами.
Этот метод только блокирует их автоматическое изменение. Хранение их на удержании сохранит их текущие версии, несмотря ни на что, если вы не решите удалить их вручную.
Способ 2 (/etc/apt/preferences)
Этот метод включает в себя редактирование файла /etc/apt/preferences , где вы можете точно указать, какая версия какого пакета из какого репозитория установлена.
Каждый пакет получает числовой приоритет, в зависимости от того, какой APT решает, устанавливать пакет или нет, и если да, то из какого репозитория он должен его забрать.
Например, давайте проверим некоторые подробности о пакете 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, а второй — репозиторий nginxs.
Вы можете увидеть 500, написанных против всех репозиториев. Это число указывает приоритет пакетов. Поскольку он одинаков для всех репозиториев, шансы на то, что nginx появится в любом из репозиториев, одинаковы. Так как же система решит, какой пакет выбрать? Он выберет самую высокую версию, которая есть. В данном случае это 1.22.1. Для Ubuntu полный номер версии становится 1.22.1-1~jammy.
Если вы не хотите обновляться до версии 1.22.1 и хотите заблокировать ее, вам нужно отредактировать файл /etc/apt/preferences .
Откройте файл в редакторе nano.
$ sudo nano /etc/apt/preferences
Эта команда также поможет вам создать файл, если он ранее не существовал в системе.
Вставьте следующий код в файл.
Package: nginx Pin: version 1.22.1-1~jammy Pin-Priority: -1
Установка приоритета ниже 0 означает, что пакет не будет установлен. Если вы хотите, чтобы пакет устанавливался всегда, установите для него приоритет 1000 или выше.
Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.
Давайте еще раз проверим посылку.
Вы увидите следующий вывод.
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
Заметили разницу? Версия выпуска-кандидата снижена с 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
Ключевое слово релиз просто указывает следующую более высокую версию. o=nginx относится к происхождению пакета. Вот это нгинкс. Это означает, что система не должна устанавливать пакет nginx из своего репозитория. Другой способ добиться того же результата — использовать следующий код.
Package: nginx Pin: release o=jammy Pin-Priority: 1000
На этот раз мы установили приоритет 1000 для пакета репозитория Ubuntu ( jammy ). Это гарантирует, что Nginx всегда будет устанавливаться из репозитория Ubuntu, а не откуда-либо еще.
Вы можете не только указать происхождение пакета, но также можете добавить архив, компонент, метку и архитектуру пакета, которые система должна выбрать, используя следующие ключевые слова в разделе Pin.
- c -> Компонент
- a -> Архив
- o -> Происхождение
- l -> Метка
- n -> Архитектура
Блокировка определенных обновлений ядра
Давайте посмотрим, как мы можем заблокировать определенные обновления ядра. Перечислите все пакеты, связанные с ядром в вашей системе.
$ dpkg -l "*$(uname -r)*" | grep kernel | awk ''
Вы увидите аналогичный вывод.
linux-headers-5.15.0-33-generic linux-image-5.15.0-33-generic linux-modules-5.15.0-33-generic linux-modules-extra-5.15.0-33-generic
Следующие методы нужно будет повторить для всех полученных здесь пакетов.
Способ 1 (метка-метка)
Во-первых, давайте проверим, какая версия ядра активна. Для этого выполните следующую команду.
Вы должны увидеть аналогичный вывод.
Чтобы предотвратить дальнейшее обновление ядра, мы можем просто использовать команду apt-mark .
$ sudo apt-mark hold linux-image-$(uname -r)
Вы должны увидеть аналогичный вывод.
linux-image-5.15.0-53-generic set on hold.
Вы можете использовать тот же метод для блокировки заголовков ядра, заблокировав пакет linux-headers-$ (uname -r) .
Способ 2 (/etc/apt/apt.conf.d/50unattended-upgrades)
Второй метод использует файл /etc/apt/apt.conf.d/50unattended-upgrades .
Откройте его для редактирования.
$ sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
Прокрутите вниз до раздела Unattended-Upgrade::Package-Blacklist и отредактируйте его следующим образом.
Unattended-Upgrade::Package-Blacklist < "linux-generic"; "linux-image-generic"; "linux-headers-generic"; "linux-modules-generic"; "linux-modules-extra-generic"; >;
Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.
Способ 3 (дпкг)
Чтобы сохранить обновление ядра с помощью dpkg , введите следующую команду. Эта команда будет содержать все пакеты, связанные с ядром, одновременно.
$ for i in $(dpkg -l "*$(uname -r)*" | grep kernel | awk ''); do echo $i hold | dpkg --set-selections; done
Чтобы снять удержание, используйте следующую команду.
$ for i in $(dpkg -l "*$(uname -r)*" | grep kernel | awk ''); do echo $i install | dpkg --set-selections; done
Способ 4 (/etc/apt/preferences)
Давайте сначала проверим детали относительно текущей версии ядра.
$ apt-cache policy linux-image-$(uname -r)
Вы должны увидеть следующий вывод.
linux-image-5.15.0-53-generic: Installed: 5.15.0-53.59 Candidate: 5.15.0-53.59 Version table: *** 5.15.0-53.59 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 100 /var/lib/dpkg/status
Несмотря на то, что ядро 5.15.0.53 имеет последнюю версию на момент написания этого руководства, мы предполагаем, что следующая версия уже вышла ( 5.15.0.56 — текущая стабильная версия ядра Linux).
Чтобы заблокировать следующую версию ядра, введите следующий код в файл /etc/apt/preferences .\\
Package: linux-image-5.15.0-53-generic linux-headers-5.15.0-33-generic linux-modules-5.15.0-33-generic linux-modules-extra-5.15.0-33-generic Pin: version 5.15.0-53.59 Pin-Priority: -1
Приведенный выше код не позволит Ubuntu установить какие-либо или все обновления ядра.
Вы можете следовать методам 2 и 3 для любого обычного пакета, а не только для ядра.
Заключение
Вот и все для этого урока. Теперь у вас должна быть возможность заблокировать любые или определенные версии любых пакетов, которые вы не хотите устанавливать или обновлять в своей системе Ubuntu или Debian. Если у вас есть какие-либо вопросы, задайте их в комментариях ниже.
Запрет на обновление пакета в Debian/Ubuntu
В Debian-подобных дистрибутивах Linux порой возникают ситуации, когда нужно запретить какому-либо пакету обновляться при регулярном обновлении системы.
Чтобы запретить какому-либо пакету обновляться при apt-get update && apt-get upgrade делаем следующее:
В Apt за запрет обновлений пакетов отвечает утилита Apt-mark.
apt-mark hold pppoe — блокируем обновление пакета pppoe
apt-mark unhold pppoe — снимаем блокировку обновления пакета pppoe
apt-mark showhold — показать все пакеты с меткой hold
Если у вас установлена какая-либо графическая оболочка, то в Синаптике выделяем нужный пакет, далее в меню «Пакет» выбери пункт «Заблокировать версию».
В пакетном менеджере aptitude есть возможность помечать пакеты меткой «hold». После того, как тот или иной пакет получает такую метку — он перестает обновляться до тех пор, пока она не будет снята. Причины заморозить какие либо пакеты думаю вы найдете сами, это довольно часто требуется, особенно в серверных решениях. Хватит воды — перейдем к делу.
Чтобы увидеть список пакетов, которые сейчас удерживаются пакетным менеджером нужно выполнить:
aptitude search «~ahold»
После выполнения команды появится искомый список, который можно подредактировать, а точнее убрать метку.
aptitude unhold php5-fpm
После этого, если требуется обновляемся.
aptitude update && aptitude upgrade
P.S. В пакетном менеджере yum список залоченных пакетов хранятся в файле /etc/yum/pluginconf.d/versionlock.list и имеет вид: