ウェブサイト検索

CentOS/Rocky Linuxでパッケージとカーネルの更新をブロックする方法


CentOS/Rocky Linuxでパッケージとカーネルの更新をブロックする方法

このページで

  1. 前提条件
  2. 方法1 - パッケージのインストール/更新を永久に無効にする(yum.confを使用)

    1. カーネル更新をブロックする
  3. 方法2 - パッケージのインストール/アップデートを一時的に無効にする
  4. 方法3 - リポジトリを使用する(.repoファイルを使用)
  5. 方法4 - リポジトリ全体の更新をブロックする

    1. リポジトリファイルを介してリポジトリをブロックする
  6. 方法5 - 特定のバージョンでのパッケージのブロック(versionlockプラグインを使用)
  7. 結論

パッケージマネージャーは、Linuxユーザーにとって最も便利なツールの一つです。単一のコマンドで、Linuxシステムから任意のソフトウェア/パッケージをインストール、アップグレード、削除できます。しかし、時にはどのパッケージをインストールまたはアップグレードしたいのか、そしてどのパッケージを自動的にアップグレードからブロックするのか、細かく制御する必要があります。なぜこれを行いたいのでしょうか?時には、パッケージの更新版にバグが含まれていることが判明することがあります。その場合、次回 sudo yum upgrade を実行したときに、そのパッケージをアップグレードしたくありません。そして、各パッケージを個別にアップグレードするのは面倒です。

このチュートリアルでは、特定のパッケージのインストールやアップグレードを禁止する方法と、特定のバージョンのパッケージやカーネルのインストールを禁止する方法について説明します。

注意: バグのないバージョンがリリースされた後でも、時間が経つと保持しているパッケージを忘れてしまうことがあります。したがって、長期間パッケージを保持することはセキュリティ上の問題を引き起こす可能性があるため、警戒を怠らないようにしましょう。

ここでは5つの方法について説明します。これらの方法はすべて、yum(Yellow dog Updater, Modified)およびdnf(Dandified YUM)パッケージマネージャーを使用します。

前提条件

  • CentOS、Rocky Linux、またはAlma Linuxを搭載したサーバー。今回のチュートリアルではRocky Linux 9を使用しましたが、ここでのコマンドは他のオペレーティングシステムや古いリリースでも問題なく動作するはずです。
  • 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 <package> は保持されたパッケージに対しても引き続き機能します。

この方法は、自動的に変更されるのを防ぐだけです。保留にしておくことで、それらは手動で削除するまで、現在のバージョンのまま維持されます。

カーネル更新をブロックする

カーネルの更新をブロックするには、以下のコマンドを使用してください。

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パッケージを除くすべてのパッケージを更新します。1つのコマンドで複数のパッケージをブロックするには、-xスイッチを複数回使用してください。

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

同じように、-xの代わりに--excludeスイッチを使用することもできます。

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

方法3 - リポジトリを使用する(.repoファイルを使用)

リポジトリを介してインストールしたパッケージがある場合、アップグレードを停止する別の方法があります。これは、/etc/yum.repos.d ディレクトリにある .repo ファイルを編集することで行えます。

システムにEpelリポジトリが追加されていて、golangパッケージをそこからインストールしたくない場合は、次のように/etc/yum.repos.d/epel.repoファイルにexclude=certbotという行を追加してブロックすることができます。

[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
...

さて、Epelリポジトリから利用可能なcertbotパッケージをインストールしてみてください。

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

複数のリポジトリは、そのIDをコンマで区切ることで無効にできます。

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と入力します。

さて、epelリポジトリにあるcertbotパッケージをインストールしてみましょう。

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パッケージマネージャのプラグインです。このプラグインは、ロックが行われた時点でインストールされていたバージョンよりも大きいバージョンへのパッケージのアップグレードを許可しません。

まず、versionlockをインストールします。

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.*

マリアDBサーバーパッケージを更新してみましょう。

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.

バージョンロックプラグインを介してブロックされたパッケージのリストを確認するには、次のコマンドを使用します。

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 システムでインストールまたはアップグレードされたくない特定のバージョンのパッケージをブロックできるようになったはずです。

関連記事: