Поиск по сайту:

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


На этой странице

  1. Предпосылки
  2. Способ 1 (отметка метка)
  3. Способ 2 (/etc/apt/preferences)
    1. Пропустить одну версию, но разрешить другую
    2. Изменить настройки репозитория

    1. Способ 1 (отметка метка)
    2. Способ 2 (/etc/apt/apt.conf.d/50unattended-upgrades)
    3. Способ 3 (dpkg)
    4. Способ 4 (/etc/apt/preferences)

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

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

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

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

    Предпосылки

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

    Способ 1 (метка-метка)

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

    Давайте еще раз проверим посылку.

    $ 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
    

    Ключевое слово релиз просто указывает следующую более высокую версию. 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 '{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 (метка-метка)

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

    $ 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, введите следующую команду. Эта команда будет содержать все пакеты, связанные с ядром, одновременно.

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