Linux管理 · 2 min read · Dec 20, 2025
Debian / Ubuntuでパッケージとカーネルの更新をブロックする方法

APTはおそらくLinuxユーザーにとって最も便利なツールです。単一のコマンドでLinuxシステムから任意のソフトウェア/パッケージをインストール、アップグレード、削除できます。しかし、時にはどのパッケージをインストールまたはアップグレードしたいのか、どのパッケージを自動的にアップグレードされないようにブロックしたいのかを細かく制御する必要があります。なぜこれを行いたいのでしょうか?時には、パッケージの更新版にバグがあることがわかります。次回sudo apt upgradeを実行したときにそのパッケージがアップグレードされてほしくありません。そして、各パッケージを個別にアップグレードするのは面倒です。
このチュートリアルでは、特定のパッケージのインストールまたはアップグレードをブロックする方法と、特定のバージョンのパッケージやカーネルのインストールをブロックする方法を説明します。
注意: バグのないバージョンが出た後でも、どのパッケージを保持しているかを忘れるのは簡単です。したがって、長期間パッケージを保持することはセキュリティ上の問題を引き起こす可能性があるため、注意を怠らないでください。
ここでは2つの方法について説明します。最初の方法は、特定のパッケージのすべてのインストールとアップグレードをブロックします。2番目の方法は、特定のバージョンのパッケージをブロックするためのより細かい制御を提供します。
前提条件
- UbuntuまたはDebian OSを搭載したサーバー。Ubuntu 22.04を使用しましたが、ここでのコマンドは他のDebianベースのオペレーティングシステムや古いリリースでも問題なく動作するはずです。
- sudo権限を持つ非ルートユーザー。
方法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つあることがわかります。最初はUbuntuのリポジトリで、2番目はnginxのリポジトリです。
すべてのリポジトリに対して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と書かれていることに気付くでしょう。これは、システムがそのバージョンをスキップするべきであることを意味します。
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リポジトリを削除することですが、再びpreferencesファイルを使用してリポジトリを選択させることができます。
ファイルに次のコードを入力します。
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リポジトリからインストールされ、他の場所からはインストールされません。
パッケージの起源を指定するだけでなく、システムが選択すべきパッケージのアーカイブ、コンポーネント、ラベル、アーキテクチャを次のキーワードを使用して追加することもできます。
- 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システムでインストールまたはアップグレードされたくないパッケージの任意のバージョンをブロックできるようになりました。質問がある場合は、下のコメントに投稿してください。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。