apt-mark パッケージをメジャーバージョン(特定のマイナーバージョンではない)に保持する

apt-mark パッケージをメジャーバージョン(特定のマイナーバージョンではない)に保持する

インフラストラクチャの重大な変更によってコードが破損するのを防ぐために、サーバー上でパッケージのバージョンを保持したいと考えています (たとえば、mongodb 2.4 から 2.6 への変更など)。

たとえば、そうできることはわかっていますapt-mark hold packageが、そうするとセキュリティ パッチやマイナー アップグレードが提供されなくなります。

また、メジャーバージョン(マイナーバージョンではない)を設定してパッケージをインストールしたいです。

たとえば、私は次のことができると知っています:

sudo apt-get install -y rabbitmq-server=3.3.5

しかし、インストールをメジャーバージョン (3.*) に固定したいだけです。

これを実現するにはどうすればよいでしょうか?

答え1

バージョン番号のワイルドカードセットを固定することができます。man apt_preferences例:

特定の形式では、指定されたバージョンまたはバージョン範囲の 1 つ以上の指定されたパッケージに優先度 (「Pin-Priority」) が割り当てられます。たとえば、次のレコードは、バージョン番号が「5.10」で始まる perl パッケージのすべてのバージョンに高い優先度を割り当てます。複数のパッケージはスペースで区切ることができます。

Package: perl
Pin: version 5.10*
Pin-Priority: 1001

たとえば、Ubuntu 16.04 では、 のxenial-backportsデフォルトの優先度は 100 ですが、 の初期ポリシーは次debhelperのようになります。

$ apt-cache policy debhelper
debhelper:
  Installed: 9.20160115ubuntu3
  Candidate: 9.20160115ubuntu3
  Version table:
     10.2.2ubuntu1~ubuntu16.04.1 100
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main i386 Packages
 *** 9.20160115ubuntu3 500
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main i386 Packages
        100 /var/lib/dpkg/status

次に、バックポートをより高い優先度に固定しました。

$ cat /etc/apt/preferences.d/debhelper
Package: *
Pin: release v=16.04,o=Ubuntu,a=xenial-backports,n=xenial,l=Ubuntu,c=main,b=amd64
Pin-Priority: 600

$ apt-cache policy debhelper
debhelper:
  Installed: 9.20160115ubuntu3
  Candidate: 10.2.2ubuntu1~ubuntu16.04.1
  Version table:
     10.2.2ubuntu1~ubuntu16.04.1 600
        600 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main i386 Packages
 *** 9.20160115ubuntu3 500
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main i386 Packages

再び、9.*バージョンをdebhelperさらに高い優先度に固定します。

$ cat /etc/apt/preferences.d/debhelper
Package: *
Pin: release v=16.04,o=Ubuntu,a=xenial-backports,n=xenial,l=Ubuntu,c=main,b=amd64
Pin-Priority: 600

Package: debhelper
Pin: version 9.*
Pin-Priority: 800

$ apt-cache policy debhelper
debhelper:
  Installed: 9.20160115ubuntu3
  Candidate: 9.20160115ubuntu3
  Version table:
     10.2.2ubuntu1~ubuntu16.04.1 600
        600 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main i386 Packages
 *** 9.20160115ubuntu3 800
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main i386 Packages
        100 /var/lib/dpkg/status

/etc/apt/preferences.d/したがって、次の内容を含むファイルを作成する必要があります。

Package: rabbitmq-server
Pin: version 3.*
Pin-Priority: 1001

デフォルトでは、どのリポジトリも優先度が 1000 を超えていません。必要に応じて apt を強制的にダウングレードするには、1001 で十分です。

P >= 1000 の場合、パッケージのダウングレードであってもバージョンがインストールされます。

関連情報