- apt には、リポジトリやパッケージが競合する場合に、自動選択する仕組みがある
- これは優先度に基づいて行われるが、デフォルトの優先度は状況によって異なり「リポジトリを登録したのに使われていない」なんてことがまれに生じる
- apt のリポジトリ優先度の考え方と、設定の確認・変更方法をまとめる
検証環境
apt における優先度付けのルール
apt の優先度は静的な順序付けではない
実は apt リポジトリの優先度は、静的に順序付けされるものではない。ユーザが設定ファイルで指定しない限り、優先度は動的に設定される。また、優先度の絶対値にも意味がある。
apt_preferencesのmanページを見れば、具体的なルールが記載されている。
デフォルトの優先度
特に指定のない場合、apt は以下の優先度を付与する。
| 優先度 | 諸元 |
|---|---|
| 1 | Releaseファイルに NotAutomatic: yes が指定されているが、ButAutomaticUpgrades: yes が指定されていないリポジトリのパッケージ |
| 100 | (1) Releaseファイルに NotAutomatic: yes と ButAutomaticUpgrades: yes が指定されているリポジトリのパッケージ(2) 既にシステムにインストール済みのパッケージ |
| 500 | 他の条件に合致していないパッケージ |
| 990 | ターゲットリリースとして指定されたリポジトリのパッケージ |
なお、ターゲットリリースとは、/etc/apt/apt.confでAPT::Default-Releaseに指定しているリリースか、コマンド実行時に -t オプションで指定したリリースを指す。
絶対値に応じた制御
apt は、リポジトリ同士の相対的な比較とは独立して、絶対値による評価も行う。
ただし、デフォルトの優先度でこれらの値になることはない。ユーザが /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.confにAPT::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/preferences1は自動 |
他のリポジトリに存在せず、また、まだインストールされていない場合(アップグレードでない場合)に限り採用する |
| 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になっていることが分かる。