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


このページでは

  1. 前提条件
  2. 方法 1 (apt-mark)
  3. 方法 2 (/etc/apt/preferences)
    1. 1 つのバージョンをスキップして、もう 1 つのバージョンを許可する
    2. リポジトリ設定を変更する

    1. 方法 1 (apt-mark)
    2. 方法 2 (/etc/apt/apt.conf.d/50unattended-upgrades)
    3. 方法 3 (dpkg)
    4. 方法 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システムにインストールまたはアップグレードしたくないパッケージの任意または特定のバージョンをブロックできるようになりました.質問がある場合は、以下のコメントに投稿してください。