版: 1.0
著者: Falko Timme
apt-pinning を使うと、Debian 系ディストリビューション(例: Debian, Ubuntu)で複数のリリース(stable, testing, unstable)やサードパーティのリポジトリを共存させ、パッケージごとにどのリリースからインストールするかを制御できます。通常は stable を優先して運用し、必要なパッケージだけテスト版や不安定版から取得する運用に有効です。この記事は手順、例、検証方法、運用チェックリストを含みます。
重要: ここで示す設定は一例です。環境によってはシステムが不安定になる可能性があるため、必ずテスト環境で検証してください。
概要
apt-pinning は apt の優先度(Pin-Priority)機能を利用して、どのリリースからパッケージを取得するかを決めます。これにより、システム全体は stable を基本にしつつ、個別パッケージのみ newer な testing や unstable からインストールすることができます。
定義済みの用語(1行定義):
- apt-pinning: apt の Pin-Priority を使い、パッケージソースの優先順位を指定する仕組み。
- sources.list: apt が参照するリポジトリ一覧ファイル(/etc/apt/sources.list)。
- apt_preferences: Pin 設定を置くファイル(/etc/apt/preferences または /etc/apt/preferences.d/)。
- Candidate: apt-cache policy の出力で、インストール候補となるバージョン。
1 事前の注意
この説明は著者が Debian Lenny(stable)上で試したものに基づきます。例として phpmyadmin を用いており、執筆時点で各リリースに以下のバージョンがありました(参照: http://packages.debian.org/search?keywords=phpmyadmin&searchon=names&suite=all§ion=all)。
- lenny (stable): 4:2.11.8.1-5
- squeeze (testing): 4:3.1.2-2
- sid (unstable): 4:3.1.3-1
2 sources.list にテスト用リポジトリを追加する
/etc/apt/sources.list に testing や unstable を追加します。例:
vi /etc/apt/sources.list次のようにします(例: Lenny に testing と unstable を追加):
deb http://volatile.debian.org/debian-volatile lenny/volatile main
deb-src http://volatile.debian.org/debian-volatile lenny/volatile main
## Lenny / Stable
deb http://ftp2.de.debian.org/debian/ lenny main
deb-src http://ftp2.de.debian.org/debian/ lenny main
deb http://security.debian.org/ lenny/updates main
deb-src http://security.debian.org/ lenny/updates main
## Squeeze / Testing
deb http://ftp2.de.debian.org/debian/ squeeze main
deb-src http://ftp2.de.debian.org/debian/ squeeze main
deb http://security.debian.org/ squeeze/updates main
deb-src http://security.debian.org/ squeeze/updates main
## Sid / Unstable
deb http://ftp2.de.debian.org/debian/ sid main
deb-src http://ftp2.de.debian.org/debian/ sid main追加後、apt のキャッシュ制限を増やすことを推奨します。/etc/apt/apt.conf を開き、次を追加します:
vi /etc/apt/apt.confAPT::Cache-Limit "100000000";これをしないと、apt-get update 実行時に以下のようなエラーが出ることがあります:
E: Dynamic MMap ran out of roomその後、パッケージデータベースを更新します:
apt-get update3 apt-pinning の考え方と優先度の意味
デフォルトでは、stable, testing, unstable の優先度が同じ(例: 500)になるため、apt は単純に「もっとも新しいバージョン」を Candidate として選びます。これを詳細に制御するのが apt-pinning です。
優先度の範囲(man 5 apt_preferences の要約):
- P > 1000: ダウングレードでも強制的にそのバージョンをインストール
- 990 < P <= 1000: ターゲットリリース外でもインストールされる(ただしインストール済みの方が新しい場合は除く)
- 500 < P <= 990: ターゲットリリースかインストール済みの方が新しければそちらを使う
- 100 < P <= 500: 他のディストリビューションがなければインストールされる
- 0 < P <= 100: インストール済みがない場合のみインストール
- P < 0: インストールを禁止
実際に優先度を確認するコマンド:
apt-cache policy例(出力の一部):
server1:~# apt-cache policy
Package files:
100 /var/lib/dpkg/status
release a=now
500 http://volatile.debian.org lenny/volatile/main Packages
release o=volatile.debian.org,a=stable,l=debian-volatile,c=main
origin volatile.debian.org
500 http://ftp2.de.debian.org sid/main Packages
release o=Debian,a=unstable,l=Debian,c=main
origin ftp2.de.debian.org
500 http://security.debian.org squeeze/updates/main Packages
release v=None,o=Debian,a=testing,l=Debian-Security,c=main
origin security.debian.org
500 http://ftp2.de.debian.org squeeze/main Packages
release o=Debian,a=testing,l=Debian,c=main
origin ftp2.de.debian.org
500 http://security.debian.org lenny/updates/main Packages
release v=5.0,o=Debian,a=stable,l=Debian-Security,c=main
origin security.debian.org
500 http://ftp2.de.debian.org lenny/main Packages
release v=5.0,o=Debian,a=stable,l=Debian,c=main
origin ftp2.de.debian.org
Pinned packages:
server1:~#この例ではすべて 500 なので、新しければ unstable のパッケージが Candidate になります。phpmyadmin の候補確認例:
apt-cache policy phpmyadmin出力例:
server1:~# apt-cache policy phpmyadmin
phpmyadmin:
Installed: (none)
Candidate: 4:3.1.3-1
Version table:
4:3.1.3-1 0
500 http://ftp2.de.debian.org sid/main Packages
4:3.1.2-2 0
500 http://ftp2.de.debian.org squeeze/main Packages
4:2.11.8.1-5 0
500 http://ftp2.de.debian.org lenny/main Packages
server1:~#Candidate が unstable のバージョンになっているのが分かります。
4 典型的な apt-pinning の設定例
/ 例: phpmyadmin を stable 優先で、必要なら testing を許容する設定(/etc/apt/preferences.d/99-phpmyadmin を作成)
Package: phpmyadmin
Pin: release a=stable
Pin-Priority: 700
Package: phpmyadmin
Pin: release a=testing
Pin-Priority: 600さらに一般的に、リリース全体のデフォルトポリシーを設定する場合:
# /etc/apt/preferences.d/00-defaults
Package: *
Pin: release a=stable
Pin-Priority: 700
Package: *
Pin: release a=testing
Pin-Priority: 600
Package: *
Pin: release a=unstable
Pin-Priority: 100この設定では基本的に stable を優先し、testing は許容、unstable は明示的に指定しない限り使われません。
重要: Pin-Priority の値は運用方針に合わせて調整してください。大きすぎる値は意図しないダウングレードや依存関係の破綻を引き起こす可能性があります。
5 検証とテスト手順
- apt-cache policy
で Candidate が期待通りか確認 - apt-get -s install
でシミュレーション(実際に変更を加えない) - テスト環境で実際のインストール/アップグレードを実行し、依存関係やサービスの挙動を確認
例:
apt-cache policy phpmyadmin
apt-get -s install phpmyadmin6 いつ使うべきか・使わない方がよい場合
- 適している場合:
- 全体は安定版で運用したいが、一部のパッケージのみ新しい機能やバグ修正が必要なとき
- テスト用に限定的に新しいパッケージを導入したいとき
- 適さない場合:
- 多数のパッケージに混在するリリースを導入する場合(依存関係が複雑になりやすい)
- 運用チームがパッケージソースを厳密に管理できない場合
7 代替アプローチ
- コンテナ化(Docker 等)で特定アプリのみ新しい環境を用意する
- backports リポジトリを利用して安定版向けに新しいバージョンを提供する
- ソースからビルドして /usr/local にインストールする
8 運用チェックリスト(管理者向け)
- 変更前にテスト環境で検証済みか
- /etc/apt/sources.list と /etc/apt/preferences(.d) のバックアップを取得したか
- apt-get -s で依存関係の影響を確認したか
- セキュリティアップデートを適切に取得できるか確認したか
- 変更履歴(誰がいつ何を変更したか)を記録しているか
9 受け入れ基準(テストケース)
- apt-cache policy で期待するリリースが Candidate になっていること
- apt-get -s install で依存関係の衝突が報告されないこと
- 本番に反映後、サービスが正常に稼働すること
10 よくある失敗例と回避策
失敗例: sources.list に誤った行を加え、依存関係が破綻して apt が壊れる。
回避策: 変更前にファイルをバックアップし、1行ずつ追加して apt-get update 後に apt-cache policy を確認する。失敗例: Pin-Priority を 1001 など大きすぎる値にして意図せぬダウングレードを発生。
回避策: 優先度は小さめから試し、動作を確認してから本番に適用する。
11 マインドセットとヒューリスティック
- ルール: 「全体は安定、個別は例外」– デフォルトは stable にする。
- 小さく変える: 1パッケージずつピンを追加して影響を確認する。
- ロールバック準備: すぐに戻せるように設定変更の差分と手順を残す。
12 1行用語集
- Pin: パッケージソースの優先順位を表す設定。
- Candidate: インストール候補のバージョン。
- Backports: 安定版向けに新しいパッケージを提供する仕組み。
まとめ
apt-pinning は複数リリースを共存させつつ、システムの安定性を保ちながら必要なパッケージだけ新しくする強力な手段です。ただし依存関係の問題や予期せぬダウングレードを招く可能性があるため、テスト環境での検証、小刻みな適用、明確な運用手順とログ記録を徹底してください。
重要:
- まずテスト環境で検証すること
- Pin-Priority は慎重に設定すること
- 変更は必ず記録し、戻せる手順を用意すること
関連参照: http://packages.debian.org/search?keywords=phpmyadmin&searchon=names&suite=all§ion=all