В этой статье рассмотрим, как запретить обновление конкретного пакета в системах на базе Debian и Ubuntu с помощью команды apt-mark hold. Это полезно, если вы хотите зафиксировать версию стабильного ПО или предотвратить автоматические обновления критичных компонентов.
Почему может понадобиться apt-mark hold
- Обновление может нарушить совместимость сервисов или зависимостей.
- Пакет содержит специфические настройки или кастомные правки, которые нельзя потерять.
- Текущая версия проверена и стабильна — обновления могут внести ошибки.
- После обновления возникали сбои, и необходимо зафиксировать рабочую версию.
Пошаговое решение (пример с пакетом nginx)
1. Проверяем текущий статус пакета
dpkg --get-selections | grep nginxВывод может выглядеть так:
nginx installЕсли справа указано install, пакет установлен и не заморожен. Если указано hold, обновления уже заблокированы.
2. Замораживаем пакет с помощью apt-mark
sudo apt-mark hold nginxЭта команда помечает пакет как «удерживаемый». Теперь apt не будет обновлять nginx при выполнении apt upgrade.
Пример вывода:
nginx set on hold.3. Проверяем, что пакет действительно заблокирован
apt-mark showholdВыводит список всех пакетов, находящихся в состоянии hold. Пример:
nginx4. Размораживаем пакет при необходимости
sudo apt-mark unhold nginxПосле этого nginx снова будет обновляться при системных апдейтах.
Альтернативные методы
1. Использование dpkg напрямую
echo "nginx hold" | sudo dpkg --set-selectionsЭта команда делает то же самое, что и apt-mark hold, но работает на более низком уровне. Чтобы снять блокировку, используйте:
echo "nginx install" | sudo dpkg --set-selections2. Блокировка версии через APT Pinning
Можно зафиксировать конкретную версию пакета, чтобы apt не обновлял его. Для этого создайте файл:
sudo nano /etc/apt/preferences.d/nginx.prefИ добавьте в него содержимое:
Package: nginx
Pin: version 1.18.0-6ubuntu14.4
Pin-Priority: 1001Узнать нужную версию можно командой:
apt-cache policy nginxЭтот метод полезен, если вы хотите оставить пакет на конкретной версии, а не просто запретить обновления.
Проверка результата
Чтобы убедиться, что пакет не будет обновляться:
sudo apt update
sudo apt upgrade --simulateВ выводе не должно быть строк с обновлением пакета nginx. Опция --simulate (или -s) запускает «сухой» прогон без реальных изменений.
Как избежать проблем в будущем
- Используйте
apt-mark holdтолько для ключевых и стабильных пакетов. - Периодически проверяйте список удерживаемых пакетов (
apt-mark showhold). - Перед обновлениями тестируйте новые версии в изолированной среде.
- Автоматизируйте контроль версий через Ansible, Puppet или простые bash-скрипты.
FAQ
Можно ли удерживать сразу несколько пакетов?
Да, просто перечислите их через пробел:
sudo apt-mark hold nginx mysql-server php
Что делать, если apt-mark не срабатывает?
Убедитесь, что используете Debian/Ubuntu и установлен пакет apt. При необходимости можно воспользоваться альтернативой — dpkg --set-selections.
Как узнать, какие пакеты удерживаются?
Выполните apt-mark showhold — команда выведет весь список заблокированных пакетов.
Теперь вы знаете, как надёжно зафиксировать нужные версии пакетов с помощью apt-mark hold и избежать неожиданных обновлений.
Смотрите также: Как откатить пакет до предыдущей версии в apt