なぜリポジトリは「ゴミ溜め」になりやすいのか?
CentOS 8が突如終了(EOL)した際、私はわずか1週間で5台の本番サーバーをCentOS Stream 9へ移行させるのに奔走しました。その時に得た最も手痛い教訓は、「リポジトリ管理を疎かにすると、システムはすぐに修復不可能な混沌とした状態に陥る」ということです。
よくあるシナリオはこうです。デフォルトの BaseOS を使いつつ、数多くのツールを利用するために EPEL を追加したり、最新の PHP 8.2 を使うために Remi を導入したりします。しかし、不用意に dnf update を一度実行するだけで、openssl や libxml2 といった極めて重要なシステムパッケージが、サードパーティ製リポジトリの互換性のないバージョンで上書きされてしまうことがあります。その結果、サービスが即座にダウンしてしまうのです。
DNF Priorities は、まさにその救世主です。各ソフトウェアソースに優先度を設定することで、OSのコアパッケージが常に厳格に保護されるように保証します。
競合を管理する3つの手法:最適な選択肢はどれか?
コマンドを入力する前に、管理手法を比較検討し、なぜ DNF Priorities が専門家に推奨されるのかを確認しましょう。
1. リポジトリの手動有効化/無効化 (–enablerepo)
普段は外部リポジトリをすべて無効にしておき、特定のパッケージをインストールする時だけ有効にします。
- メリット: その場での絶対的なコントロールが可能。
- デメリット: 10〜20台のサーバークラスターを管理する場合、非常に手間がかかります。また、自動更新スクリプトが機能しなくなります。
2. 設定ファイルでの exclude 指示子の使用
.repo ファイルに直接 exclude=package_name を記述し、特定のリポジトリからの特定パッケージの提供を禁止します。
- メリット: 対象をピンポイントでブロックできる。
- デメリット: 長期的な維持が困難です。ブロック対象が数十個に及ぶと、設定ファイルは技術的なゴミの山のようになります。
3. DNF Priorities の設定(専門家推奨)
各リポジトリに1から99までの数値を割り当てます。数値が小さいほど、優先度(権限)が高くなります。
- メリット: 完全に自動化され、エンタープライズ基準に準拠。
- デメリット: 更新の停滞を避けるため、最初に優先順位の論理的な設計が必要です。
CentOS Stream 9 で DNF Priorities の実装
CentOS Stream 9 では、DNF にこの機能が組み込まれています。ただし、サポートプラグインを念のため確認しておくことをお勧めします。
ステップ 1: コアプラグイン의インストール
システムに十分な管理ツールが揃っていることを確認するため、次のコマンドを実行します。
sudo dnf install dnf-plugins-core -y
ステップ 2: 優先度指数の賢い階層化
priority=N パラメータは、1が最高、99が最低という原則で動作します。後で何度も修正する手間を省くため、私は通常、以下のような間隔を空けたルールを適用しています。
- レベル 1-5: BaseOS、AppStream専用(不可侵グループ)。
- レベル 10-20: EPEL(15,000以上のパッケージを保有)などの信頼できるコミュニティリポジトリ。
- レベル 50以上: サードパーティ製リポジトリや社内ビルドのソフトウェアリポジトリ。
ステップ 3: システムリポジトリの設定
/etc/yum.repos.d/ 内のファイルを編集します。まずはメインリポジトリから始めましょう。
sudo vi /etc/yum.repos.d/centos.repo
各セクション [baseos] と [appstream] の最後に priority=1 を追加します。
[baseos]
name=CentOS Stream $releasever - BaseOS
# ...
enabled=1
priority=1
[appstream]
name=CentOS Stream $releasever - AppStream
# ...
enabled=1
priority=1
ステップ 4: EPEL の設定
EPEL には、より低い優先度(例:10)を設定します。これにより、AppStream 内にある、より安定性の高い同名パッケージが EPEL によって上書きされるのを防ぎます。
sudo vi /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux $releasever
enabled=1
priority=10
ステップ 5: 結果の確認
DNFが設定を正しく読み込んでいるか確認するため、キャッシュをクリアしてリストをチェックします。
sudo dnf clean all
sudo dnf repolist --with-priorities
Priority カラムに入力した通りの数値が表示されていれば、成功です。
実践的なヒント:すべてを「1」に設定してはいけない
CentOS Stream 9 を使い始めたばかりの頃、私はすべてのリポジトリを priority=1 に設定するというミスを犯しました。その結果、権限が等しい2つのリポジトリ間で競合が発生し、DNF が「フリーズ」してしまったのです。
黄金律: 優先レベルの間には常に余裕を持たせておきましょう(例:1、10、20)。将来、間に新しいリポジトリを挿入する必要が出てきた場合でも、システム全体を修正し直す必要がなくなります。
優先度の低いリポジトリからベータ版をインストールする必要がある場合は、設定を変更する代わりに、一時的にプラグインを無効にするコマンドを使用してください。
sudo dnf install package_name --disableplugin=priorities
リポジトリをマスターすることは、サーバーを円滑に稼働させるだけでなく、システムの自動更新時にも枕を高くして眠れる安心感をもたらします。皆さんのシステム管理がより自信に満ち、効率的になることを願っています!

