kWatanabe 記事一覧へ

kWatanabe の 技術帖

某企業でOSや仮想化の研究をやっているインフラ系エンジニア。オンプレとクラウドのコラボレーションなど、興味ある技術を綴る。

aptリポジトリにおける優先度のルールと確認方法

  • apt には、リポジトリやパッケージが競合する場合に、自動選択する仕組みがある
  • これは優先度に基づいて行われるが、デフォルトの優先度は状況によって異なり「リポジトリを登録したのに使われていない」なんてことがまれに生じる
  • apt のリポジトリ優先度の考え方と、設定の確認・変更方法をまとめる

検証環境

apt における優先度付けのルール

apt の優先度は静的な順序付けではない

実は apt リポジトリの優先度は、静的に順序付けされるものではない。ユーザが設定ファイルで指定しない限り、優先度は動的に設定される。また、優先度の絶対値にも意味がある。

apt_preferencesのmanページを見れば、具体的なルールが記載されている。

manpages.debian.org

デフォルトの優先度

特に指定のない場合、apt は以下の優先度を付与する。

優先度 諸元
1 Releaseファイルに NotAutomatic: yes が指定されているが、ButAutomaticUpgrades: yes が指定されていないリポジトリのパッケージ
100 (1) Releaseファイルに NotAutomatic: yesButAutomaticUpgrades: yes が指定されているリポジトリのパッケージ
(2) 既にシステムにインストール済みのパッケージ
500 他の条件に合致していないパッケージ
990 ターゲットリリースとして指定されたリポジトリのパッケージ

なお、ターゲットリリースとは、/etc/apt/apt.confAPT::Default-Releaseに指定しているリリースか、コマンド実行時に -t オプションで指定したリリースを指す。

絶対値に応じた制御

apt は、リポジトリ同士の相対的な比較とは独立して、絶対値による評価も行う。

  • 優先度が負値のリポジトリからは、パッケージをインストールしない
  • 優先度が1000以上のリポジトリは、たとえパッケージをダウングレードすることになってもインストールする
  • 優先度0は未定義動作

ただし、デフォルトの優先度でこれらの値になることはない。ユーザが /etc/apt/preferences で明示的に優先度を設定して、パッケージやリポジトリブラックリスト化や優先付けができるようになっている。

優先度を手動で設定する方法

リポジトリの優先度をaptに決めさせるのでなく、手動で設定したい場合は /etc/apt/preferencesに設定を追記する。

なお、優先度はリポジトリではなくパッケージごとに設定できる。

Package: <パッケージ>
Pin: release a=<リリース名>
Pin-Priority: <優先度の値>

例えば、testing リポジトリexperimental リポジトリと同様に、「明示的にターゲットリリースにしない限り、インストールもアップグレードもされないようにする」には、以下のようにする。

Package: *
Pin: release a=testing
Pin-Priority: 1

また、一時的にターゲットリリースとして設定するには、-t オプションを指定する。

$ sudo apt install -t testing ...

恒久的にターゲットリリースとして設定するには、/etc/apt/apt.confAPT::Default-Releaseを設定する。

APT::Default-Release "testing";

要するに

これらのルールに基づいて整理すると、以下のようになる。

リポジトリの優先度 指定方法 挙動
1000~ /etc/apt/preferences ダウングレードであっても採用する
991~999 /etc/apt/preferences ダウングレードで無い限り、ターゲットリリースにパッケージがあっても、こちらを採用する
990 -tオプション
/etc/apt/apt.conf
ターゲットリリース。明示的に指定した際に採用する
501~989 /etc/apt/preferences ターゲットリリースを指定したものの、目的のパッケージが無い場合に採用する
500 自動 一般的なリポジトリのデフォルト値
101~499 /etc/apt/preferences 他のリポジトリに目的のパッケージが無い場合に採用する
100 自動 インストール済みのパッケージ
1~99 /etc/apt/preferences
1は自動
他のリポジトリに存在せず、また、まだインストールされていない場合(アップグレードでない場合)に限り採用する
0 使用禁止 未定義動作
負値 /etc/apt/preferences いかなる場合でも採用しない

設定の確認方法

特に何も指定しない場合

現状の設定は apt-cache policyコマンドで確認できる。

$ apt policy
Package files:
 100 /var/lib/dpkg/status
     release a=now
   1 http://deb.debian.org/debian experimental/main amd64 Packages
     release o=Debian,a=experimental,n=experimental,l=Debian,c=main,b=amd64
     origin deb.debian.org
 100 http://deb.debian.org/debian buster-backports/main amd64 Packages
     release o=Debian Backports,a=buster-backports,n=buster-backports,l=Debian Backports,c=main,b=amd64
     origin deb.debian.org
 500 http://ftp.debian.org/debian buster/main amd64 Packages
     release v=10.6,o=Debian,a=stable,n=buster,l=Debian,c=main,b=amd64
     origin ftp.debian.org
...(略)...

この環境の例では、以下の設定となっていることが分かる。

  • 不安定なexplerimentalリポジトリは、インストール時に-t experimentalと明示的に指定しない限り、過去に導入済みであったとしても、自動では導入・更新されない。
  • 将来バージョンからのバックポートであるbuster-backportsは、安定版リポジトリと競合するため、インストール時に-t buster-backportsと明示的に指定しないと導入されないが、一度導入した後は自動更新の対象とされる。
  • 標準の安定版リポジトリは、他のリポジトリがターゲットリリースとして指定されない限り、これを使う。

なお、experimentalリポジトリについては以下の過去記事参照。 kwatanabe.hatenablog.jp

ターゲットリリースを明示的に指定した場合

ここで、-t experimentalを付けて、明示的にexperimentalリポジトリをターゲットリリースにしてみる。

$ apt policy -t experimental
Package files:
 100 /var/lib/dpkg/status
     release a=now
 990 http://deb.debian.org/debian experimental/main amd64 Packages
     release o=Debian,a=experimental,n=experimental,l=Debian,c=main,b=amd64
     origin deb.debian.org
 100 http://deb.debian.org/debian buster-backports/main amd64 Packages
     release o=Debian Backports,a=buster-backports,n=buster-backports,l=Debian Backports,c=main,b=amd64
     origin deb.debian.org
 500 http://ftp.debian.org/debian buster/main amd64 Packages
     release v=10.6,o=Debian,a=stable,n=buster,l=Debian,c=main,b=amd64
     origin ftp.debian.org
...(略)...

experimentalリポジトリの優先度が990になっていることが分かる。

まとめ

  • apt リポジトリの優先度は、インストール状況やパッケージの品質に応じて動的に調整されるようになっている
  • 一時的にリポジトリの優先度を高めたい場合は、-tオプションでターゲットリリースとして指定する
  • リポジトリによっては、インストール済みのパッケージのアップグレードでも、都度ターゲットリリースと指定しないと更新対象とならない場合もある
  • 現状の設定状況は apt-cache policy コマンドで確認できる