Debian/Ubuntu でパッケージとカーネルの更新をブロックする方法
このページでは
- 前提条件
- 方法 1 (apt-mark)
- 方法 2 (/etc/apt/preferences)
- 1 つのバージョンをスキップして、もう 1 つのバージョンを許可する
- リポジトリ設定を変更する
- 方法 1 (apt-mark)
- 方法 2 (/etc/apt/apt.conf.d/50unattended-upgrades)
- 方法 3 (dpkg)
- 方法 4 (/etc/apt/preferences)
APT は、おそらく Linux ユーザーにとって最も便利なツールです。単一のコマンドで、Linux システムから任意のソフトウェア/パッケージをインストール、アップグレード、および削除できます。ただし、インストールまたはアップグレードするパッケージと、自動アップグレードをブロックするパッケージを細かく制御する必要がある場合があります。なぜこれをしたいのですか?パッケージの更新されたバージョンにバグがあることがわかる場合があります。次回
sudo apt upgrade
を実行するときにそのパッケージをアップグレードしたくありません。また、各パッケージを個別にアップグレードするのは面倒です。このチュートリアルでは、特定のパッケージのインストールまたはアップグレードをブロックする方法と、特定のバージョンのパッケージまたはカーネルのインストールをブロックする方法について説明します。
注: バグのないバージョンがリリースされても、しばらくすると保持していたパッケージを忘れがちです。パッケージを長期間保持すると、セキュリティ上の問題が発生する可能性があるため、警戒を怠らないでください。
ここでは、2 つの方法について説明します。最初の方法は、特定のパッケージのすべてのインストールとアップグレードをブロックします。 2 番目の方法では、より詳細な制御が提供され、特定のバージョンのパッケージをブロックできます。
前提条件
- Ubuntu または Debian OS を搭載したサーバー。このチュートリアルでは Ubuntu 22.04 を使用しましたが、ここでのコマンドは、他の Debian ベースのオペレーティング システムや古いリリースでも問題なく動作するはずです。
- sudo 権限を持つ root 以外のユーザー。
方法 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 のインストール先に 2 つのリポジトリがあることがわかります。 1 つ目は Ubuntus リポジトリで、2 つ目は 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
違いに気づきましたか? Candidate リリース バージョンは、
1.22.1
から1.22.0
に下がりました。これは、システムがインストールする次に高いバージョンが 1.22.0 であることを意味します。また、システムがそのバージョンをスキップする必要があることを意味する、最新バージョンに対して書かれた -1 にも気付くでしょう。1 つのバージョンをスキップして、もう 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.22.0
ではなく1.20.2
に移行しました。リポジトリの設定を変更する
もう 1 つのケースを考えてみましょう。 Nginx のリポジトリからのインストールをブロックし、代わりに Ubuntu リポジトリを選択したい場合はどうすればよいでしょうか? 1 つの方法は Nginx リポジトリを削除することですが、設定ファイルを使用してリポジトリを選択することもできます。
ファイルに次のコードを入力します。
Package: nginx Pin: release o=nginx Pin-Priority: -1
release キーワードは、次の上位バージョンを指定するだけです。
o=nginx
はパッケージのオリジンを参照します。こちらがnginxです。これは、システムがリポジトリから nginx パッケージをインストールすべきではないことを意味します。同じ結果を得る別の方法は、次のコードを使用することです。Package: nginx Pin: release o=jammy Pin-Priority: 1000
今回は、Ubuntu (
jammy
) リポジトリ パッケージの優先度を 1000 に設定しました。これにより、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)
2 番目の方法には、
/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システムにインストールまたはアップグレードしたくないパッケージの任意または特定のバージョンをブロックできるようになりました.質問がある場合は、以下のコメントに投稿してください。