Обновления пакетов · 7 min read · Dec 20, 2025

Как заблокировать обновления пакетов и ядра в Debian / Ubuntu

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

Этот учебник охватывает, как заблокировать определенные пакеты от установки или обновления и как заблокировать конкретные версии пакетов или ядер от установки.

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

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

Предварительные требования

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

Метод 1 (apt-mark)

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

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

$ sudo apt-mark hold htop

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

htop set on hold.

Заблокированный пакет останется на той же версии, даже если вы обновите свою систему. Это особенно полезно для удержания графических драйверов.

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

$ sudo apt-mark unhold htop

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

Canceled hold on htop.

Существует важное предостережение по этому поводу. Хотя пакет не будет автоматически обновлен при использовании команды sudo apt upgrade или при обновлении системы, вы все равно можете удалить пакет вручную. sudo apt remove все равно будет работать с удерживаемыми пакетами.

Этот метод только блокирует их от автоматических изменений. Удерживание их на месте сохранит их на текущих версиях, независимо от обстоятельств, если вы не решите удалить их вручную.

Метод 2 (/etc/apt/preferences)

Этот метод включает редактирование файла /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

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

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

Package: nginx
Pin: version 1.22.1-1~jammy
Pin-Priority: -1

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

Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.

Давайте снова проверим пакет.

$ 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

Заметьте ли вы какое-либо отличие? Версия кандидата обновилась с 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 -> Компонент
  • a -> Архив
  • o -> Происхождение
  • l -> Метка
  • n -> Архитектура

Блокировка конкретных обновлений ядра

Давайте посмотрим, как мы можем заблокировать конкретные обновления ядра. Перечислите все пакеты, связанные с ядром, на вашей системе.

$ dpkg -l "*$(uname -r)*" | grep kernel | awk '{print $2}'

Вы увидите аналогичный вывод.

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)

Сначала давайте проверим, какая версия ядра активна. Для этого выполните следующую команду.

$ uname -r

Вы должны увидеть аналогичный вывод.

5.15.0-53-generic

Чтобы предотвратить дальнейшее обновление ядра, мы можем просто использовать команду 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)

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

$ for i in $(dpkg -l "*$(uname -r)*" | grep kernel | awk '{print $2}'); do echo $i hold | dpkg --set-selections; done

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

$ for i in $(dpkg -l "*$(uname -r)*" | grep kernel | awk '{print $2}'); 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. Если у вас есть какие-либо вопросы, оставьте их в комментариях ниже.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.