При работе над некоторыми проектами иногда требуется стабильность среды.
Обновление какого-либо пакета может привести к сбою всего проекта.
Мы можем случайно обновить такие пакеты, которые создадут серьезные проблемы на сервере.
Вот почему может быть важно поддерживать определенную версию пакета.
Это руководство покажет вам, как можно исключить определенный пакет из обновления на дистрибутивах Ubuntu или Debian.
1. Исключение пакетов с помощью некоторых команд
Существует несколько различных методов исключения или удержания определенного пакета во время полного обновления системы.
Можно пометить пакет как “удерживаемый”.
В этой статье для примера мы будем использовать пакет virtualbox.
Вы можете посмотреть установленную версию:
# dpkg -l | grep virtualbox
ii virtualbox 5.0.18-dfsg-2build1 amd64 x86 virtualization solution - base binaries
Теперь вы можете увидеть, что у нас есть обновленная версия.
# apt list --upgradable
Listing... Done
virtualbox/xenial-updates 5.0.40-dfsg-0ubuntu1.16.04.2 amd64 [upgradable from: 5.0.18-dfsg-2build1]
Вы можете пометить пакеты с помощью следующих команд:
apt-mark
Вы можете использовать команду apt–mark, за которой следует опция hold.
Это предотвратит автоматическую установку, обновление или удаление пакета.
Синтаксис команды выглядит следующим образом
apt-mark hold package
Вы можете использовать его практически следующим образом:
# apt-mark hold virtualbox
virtualbox set on hold.
Теперь вы можете проверить, как показано ниже:
# apt upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
virtualbox
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
Вы можете увидеть, что обновление пакета невозможно.
Чтобы снять пометку, используйте следующий синтаксис
apt-mark unhold package
Практически у вас будет следующая команда:
# apt-mark unhold virtualbox
Canceled hold on virtualbox.
dpkg
Вы также можете использовать команду dpkg –set-selection для маркировки пакета.
Синтаксис команды выглядит следующим образом:
# echo " hold" | dpkg --set-selections
Практически, вы можете сделать это следующим образом:
# echo "virtualbox hold" | dpkg --set-selections
У вас нет никакого вывода, который показывает результат.
Поэтому уточним
# apt upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
virtualbox
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
Вы можете видеть, что это работает.
Теперь, чтобы разблокировать, команда отличается и соблюдает синтаксис
echo "package install" | sudo dpkg --set-selections
поэтому используйте команду:
# echo "virtualbox install" | dpkg --set-selections
Вывода не будет.
Поскольку мы уже являемся пользователем root, мы не используем sudo
aptitude
Вы также можете использовать команду aptitude.
По умолчанию эта команда отсутствует в вашей системе, поэтому вам необходимо установить ее следующим образом:
# apt install aptitude
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
aptitude-common libcwidget3v5
Чтобы пометить пакет с помощью команды, используйте синтаксис
aptitude hold package
Когда вы помечаете пакет с помощью aptitude, у вас нет вывода.
Если вы проверите результат с помощью aptitude upgrade, у вас не будет упоминания отмеченного пакета, но оно появится, если вы попробуете apt upgrade.
Вы можете снять пометку с помощью синтаксиса:
aptitude unhold package
так же, как и ниже
# aptitude unhold virtualbox
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
dselect
Вы можете использовать команду dselect, которая является дополнением к dpkg, используемому для управления пакетами программного обеспечения в Debian и Debian-based дистрибутивах Linux.
Она не присутствует по умолчанию, поэтому вам необходимо установить её:
# apt install dselect
Запустите команду
Теперь внимательно прочитайте справку.
Теперь вы можете использовать клавишу пробела, чтобы выйти из справки и найти пакет, который нужно “захолдить”.
Это можно сделать с помощью H или =
теперь вы можете выйти с помощью Q.
Откроется первое меню, выберите Quit.
Вы можете проверить измнения:
# apt upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
virtualbox
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
2. Блокировка пакета с помощью конфигурационных файлов apt
Одним из способов пометить пакет является редактирование файла /etc/apt/preferences.
Чтобы не обновлять пакет при обновлении всей системы, мы должны установить приоритет apt pin меньше нуля (0). если файл не существует, вы должны его создать.
Необходимо соблюдать следующий синтаксис:
Package: <package-name> ('*' for all packages)
Pin: release * (o=Ubuntu for Ubuntu origin)
Pin-Priority: <less than 0>
Есть и другие опции, которые можно использовать.
Чтобы заблокировать пакет virtualbox, отредактируйте файл следующим образом:
Package: virtualbox
Pin: release o=Ubuntu
Pin-Priority: -1
сохраните и выйдите.
Это все, что вам нужно для блокировки пакета.
Чтобы снять блокировку пакета, можно закомментировать строки или просто удалить файл.
Заключение
Вы видите, что можно использовать несколько методов для блокировки пакета.
Это может быть полезно для поддержания стабильной версии вашего проекта.