CentOS/Rocky Linuxでパッケージとカーネルの更新をブロックする方法
CentOS/Rocky Linuxでパッケージとカーネルの更新をブロックする方法
このページで
- 前提条件
方法1 - パッケージのインストール/更新を永久に無効にする(yum.confを使用)
- カーネル更新をブロックする
方法4 - リポジトリ全体の更新をブロックする
パッケージマネージャーは、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 システムでインストールまたはアップグレードされたくない特定のバージョンのパッケージをブロックできるようになったはずです。