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

Как заблокировать обновления пакетов и ядра в CentOS/Rocky Linux


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

  1. Предпосылки
  2. Способ 1 – окончательное отключение установки/обновления пакетов (с помощью yum.conf)
    1. Блокировать обновления ядра

    1. Блокировка репозиториев через их файл репо

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

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

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

    Здесь мы обсудим пять методов. Все эти методы будут включать менеджер пакетов yum (обновление Yellow dog, Modified) и dnf (Dandified YUM).

    Предпосылки

    • Сервер с CentOS, Rocky Linux или Alma Linux. Для этого руководства использовался Rocky Linux 9, но приведенные здесь команды должны хорошо работать и с другими операционными системами, а также с более ранними выпусками.
    • Пользователь без полномочий root с привилегиями sudo.

    Способ 1 — навсегда отключить установку/обновление пакетов (с помощью yum.conf)

    Чтобы навсегда заблокировать пакет от установки, обновления или удаления, мы можем использовать /etc/yum.conf или /etc/dnf/dnf.conf файл.

    Это должно выглядеть следующим образом.

    [main]
    gpgcheck=1
    installonly_limit=3
    clean_requirements_on_remove=True
    best=True
    skip_if_unavailable=False
    

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

    exclude=nginx
    

    Если вы хотите остановить все пакеты nginx, вы можете использовать символ *.

    exclude=nginx*
    

    Если вы хотите исключить более одного пакета, вы можете разделить их имена пробелом.

    exclude=nginx php
    

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

    Попробуем установить заблокированный пакет nginx.

    $ sudo dnf install nginx
    or
    $ sudo yum install nginx
    

    Вы получите аналогичный результат.

    Last metadata expiration check: 0:00:21 ago on Mon 05 Dec 2022 10:42:01 AM UTC.
    All matches were filtered out by exclude filtering for argument: nginx
    Error: Unable to find a match: nginx
    

    Здесь вы также можете заблокировать пакеты через их архитектуру. Например, если вы хотите заблокировать 32-разрядные пакеты, вы можете ввести следующую строку в файл /etc/yum.conf.

    exclude=*.i?86 *i686
    

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

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

    Блокировать обновления ядра

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

    $ sudo dmf --exclude=kernel* update
    or
    $ sudo yum --exclude=kernel* update
    

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

    Способ 2 — временно отключить установку/обновление пакетов

    Этот метод предполагает использование команды yum с дополнительным параметром.

    Во время обновления любого пакета используйте переключатель -x с вашей командой, чтобы заблокировать определенные пакеты, которые вы не хотите обновлять.

    $ sudo dnf -x nginx update
    or
    $ sudo yum -x nginx update
    

    Приведенная выше команда обновит все пакеты, кроме пакета nginx в вашей системе. Чтобы заблокировать несколько пакетов одной командой, используйте ключ -x несколько раз.

    $ sudo dnf -x nginx -x php update
    or
    $ sudo yum -x nginx -x php update
    

    Вы также можете использовать переключатель --exclude вместо -x таким же образом.

    $ sudo dnf --exclude nginx, php
    or
    $ sudo yum --exclude nginx, php
    

    Способ 3 — использование репозитория (использование файлов .repo)

    Если у вас есть пакет, установленный через его репозиторий, есть еще один способ остановить его обновление. Это делается путем редактирования файла .repo, который можно найти в каталоге /etc/yum.repos.d.

    Предположим, в вашей системе добавлен репозиторий Epel, и вы не хотите устанавливать из него пакет golang, вы можете заблокировать его, добавив строку exclude=certbot в файле /etc/yum.repos.d/epel.repo, как показано.

    [epel]
    name=Extra Packages for Enterprise Linux 8 - $basearch
    # It is much more secure to use the metalink, but if you wish to use a local mirror
    # place its address here.
    #baseurl=https://download.example/pub/epel/8/Everything/$basearch
    metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-8&arch=$basearch&infra=$infra&content=$contentdir
    enabled=1
    gpgcheck=1
    countme=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8
    exclude=certbot
    ...
    

    Теперь попробуйте установить пакет certbot, доступный в репозитории Epel.

    $ sudo dnf install certbot
    or
    $ sudo yum install certbot
    

    Вы получите аналогичный результат.

    Extra Packages for Enterprise Linux 8 - x86_64                                           20 kB/s | 4.5 kB     00:00
    All matches were filtered out by exclude filtering for argument: certbot
    Error: Unable to find a match: certbot
    

    Способ 4 — блокировка всего репозитория от обновления

    Кроме того, вы можете заблокировать обновление всего репозитория.

    Во-первых, давайте проверим все репозитории в нашей системе.

    $ dnf repolist
    or
    $ yum repolist
    

    Вы получите аналогичный результат.

    repo id                                       repo name
    appstream                                     Rocky Linux 8 - AppStream
    baseos                                        Rocky Linux 8 - BaseOS
    digitalocean-agent                            DigitalOcean Agent
    docker-ce-stable                              Docker CE Stable - x86_64
    epel                                          Extra Packages for Enterprise Linux 8 - x86_64
    extras                                        Rocky Linux 8 - Extras
    nginx-stable                                  nginx stable repo
    

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

    $ sudo dnf update --disablerepo=epel
    or
    $ sudo yum update --disablerepo=epel
    

    Вы можете отключить несколько репозиториев, разделив их идентификаторы запятыми.

    $ sudo dnf update --disablerepo=epel, extras
    or
    $ sudo yum update --disablerepo=epel, extras
    

    Блокировка репозиториев через их файл репо

    Есть еще один способ заблокировать репозиторий, который включает в себя редактирование конкретного файла репо.

    Давайте откроем файл epel.repo для редактирования.

    $ sudo nano /etc/yum.repos.d/epel.repo
    

    Измените значение переменной enabled с 1 на 0.

    [epel]
    name=Extra Packages for Enterprise Linux 8 - $basearch
    # It is much more secure to use the metalink, but if you wish to use a local mirror
    # place its address here.
    #baseurl=https://download.example/pub/epel/8/Everything/$basearch
    metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-8&arch=$basearch&infra=$infra&content=$contentdir
    enabled=0
    gpgcheck=1
    countme=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8
    ...
    

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    Теперь давайте попробуем установить пакет certbot, который доступен в репозитории epel.

    $ sudo dnf install certbot
    or
    $ sudo yum install certbot
    

    Вы получите аналогичный результат.

    Last metadata expiration check: 0:02:10 ago on Mon 05 Dec 2022 10:48:31 AM UTC.
    No match for argument: certbot
    Error: Unable to find a match: certbot
    

    Способ 5 — Блокировка пакетов в определенной версии (с помощью плагина versionlock)

    Versionlock — это плагин для менеджера пакетов Yum. Этот плагин не позволяет обновлять пакеты до версии выше той, которая была установлена на момент выполнения блокировки.

    Во-первых, установите блокировку версии.

    $ sudo dnf install dnf-plugin-versionlock
    or
    $ sudo yum install dnf-plugin-versionlock
    

    Это также создаст файл /etc/yum/pluginconf.d/versionlock.list в вашей системе.

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

    $ sudo dnf versionlock mariadb-server
    or
    $ sudo yum versionlock mariadb-server
    

    Вы получите аналогичный результат.

    Last metadata expiration check: 0:01:05 ago on Mon 05 Dec 2022 12:14:16 PM UTC.
    Adding versionlock on: mariadb-server-3:10.3.35-1.module+el8.6.0+1005+cdf19c22.*
    

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

    $ sudo dnf versionlock evolution golang
    or
    $ sudo yum versionlock evolution golang
    

    Вы получите аналогичный результат.

    Last metadata expiration check: 0:01:05 ago on Mon 05 Dec 2022 12:14:16 PM UTC.
    Adding versionlock on: evolution-0:3.28.5-18.el8.*
    Adding versionlock on: golang-0:1.18.4-1.module+el8.7.0+1073+99e3b3cd.*
    

    Попробуем обновить пакет mariadb-server.

    $ sudo dnf update mariadb-server
    or
    $ sudo yum update mariadb-server
    

    Вы получите аналогичный результат.

    Last metadata expiration check: 0:02:07 ago on Mon 05 Dec 2022 12:14:16 PM UTC.
    Package mariadb-server available, but not installed.
    No match for argument: mariadb-server
    Error: No packages marked for upgrade.
    

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

    $ dnf versionlock list
    or
    $ yum versionlock list
    

    Вы получите аналогичный результат.

    Last metadata expiration check: 0:00:05 ago on Wed 07 Dec 2022 02:36:20 AM UTC.
    elasticsearch-7.17.5-1.x86_64
    mariadb-server-3:10.3.35-1.module+el8.6.0+1005+cdf19c22.*
    evolution-0:3.28.5-18.el8.*
    golang-0:1.18.4-1.module+el8.7.0+1073+99e3b3cd.*
    

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

    $ sudo dnf versionlock delete mariadb-server
    or
    $ sudo yum versionlock delete mariadb-server
    

    Вы получите следующий вывод.

    Deleting versionlock for: mariadb-server-3:10.3.35-1.module+el8.6.0+1005+cdf19c22.*
    

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

    $ sudo dnf versionlock clear
    or
    $ sudo yum versionlock clear
    

    Кроме того, вы можете отредактировать файл /etc/yum/pluginconf.d/versionlock.list, чтобы заблокировать пакеты с помощью плагина versionlock.

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

    $ sudo sh -c 'rpm -qa | grep evolution >> /etc/yum/pluginconf.d/versionlock.list'
    

    Приведенная выше команда блокирует пакет evolution, добавляя его в список. Мы использовали rpm -qa | grep evolution, чтобы получить полное имя пакета. И

    Команда sudo sh -c запускает оболочку sudo, в которой запускаются команды для записи в файл.

    Заключение

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