実体験から:なぜyumとrpmを理解する必要があるのか
2021年末にCentOS 8がEOLを宣言したとき、1週間以内に5台のサーバーをRocky Linuxへ緊急移行しなければならなかった。一番頭を悩ませたのは新しいOSそのものではなく、本番環境で動いていたすべてのパッケージを再インストールし、バージョンを確認し、依存関係に漏れがないかチェックする作業だった。そのとき痛感した:yum installを叩くだけで終わりにしていては、到底足りない。
CentOS(またはRocky、AlmaLinux)のサーバーを管理しているなら、yumは毎日使うツールだ。そしてrpmはその下層にある基盤であり、yumだけでは対処できない場面で、rpmレベルまで降りて手動操作する必要が出てくる。CentOS 8からAlmaLinux 9への移行を検討しているなら、パッケージ管理の理解は移行成功の鍵となる。
背景:yumとrpmの違いとは
わかりやすく例えるなら:rpmはWindowsで.exeファイルを使ってアプリをインストールするようなもの——ファイルがあればインストールできる。ただし、アプリが必要とするライブラリが揃っていなければ、自分で解決しなければならない。一方、yumはApp Storeに近い——必要なものをすべて自動で探して取得してきてくれ、依存関係も含めて解決してくれる。
- rpm:
.rpmファイルを直接操作する。依存関係は自動解決しない - yum:上位レイヤーのパッケージマネージャー。オンラインリポジトリに接続し、依存関係を自動処理する
実際のところ、日常業務の90%はyumで事足りる。ただし、オフラインでのパッケージインストール、あるファイルがどのパッケージに属するか追跡したいとき、あるいはyum経由では削除できない厄介なパッケージを処理したいときは、rpmまで降りる必要が出てくる。
押さえておくべきyumの基本コマンド
パッケージのインストールと削除
# 新しいパッケージをインストール
yum install nginx
# 複数のパッケージを同時にインストール
yum install nginx mysql-server php-fpm
# パッケージを削除(依存関係は残す)
yum remove nginx
# 不要になった依存関係ごと削除
yum autoremove nginx
パッケージの更新
# すべてのパッケージを更新
yum update
# 特定のパッケージだけ更新
yum update nginx
# 利用可能な更新一覧を確認(実際には適用しない)
yum check-update
小技:本番サーバーを更新する前に、まずyum check-updateで何が変わるかを確認するようにしている。カーネルやglibcが一覧に含まれていたら、闇雲に更新するのではなく、慎重に検討する。
パッケージの検索と情報確認
# パッケージ名で検索
yum search nginx
# パッケージの詳細情報を表示
yum info nginx
# 特定のファイルやコマンドを提供するパッケージを調べる
yum provides /usr/bin/python3
yum provides "*/nginx.conf"
yumによるリポジトリ管理
リポジトリ(repo)はパッケージの格納庫だ。CentOSにはデフォルトでいくつかの公式リポジトリが付属しているが、Nginx stable、Node.js LTS、MariaDBといった人気ソフトウェアの多くは、開発元が独自のリポジトリを管理している——デフォルトのリポジトリより新しいバージョンが提供され、テストも十分に行われている。CentOS Stream 9でApacheとPHP-FPMを構成する際も、サードパーティリポジトリの活用が効いてくる場面は多い。
有効なリポジトリ一覧の確認
# すべてのリポジトリを一覧表示
yum repolist
# 無効なリポジトリも含めて表示
yum repolist all
# 特定のリポジトリの詳細を確認
yum repoinfo base
新しいリポジトリの追加
EPELはRHELベースのディストリビューション向けで最も広く使われている拡張リポジトリで、デフォルトリポジトリにない8,000以上のパッケージ(htop、iftop、fail2banなど)を提供している:
# EPELリポジトリをインストール
yum install epel-release
# EPELが追加されたことを確認
yum repolist | grep epel
手動でリポジトリを追加する場合は、/etc/yum.repos.d/に.repoファイルを作成する:
# Nginx stable用のrepoファイルを作成
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF
# 追加したリポジトリからnginxをインストール
yum install nginx
リポジトリの一時的な有効化・無効化
# 特定のリポジトリからパッケージをインストール(設定は永続しない)
yum --enablerepo=epel install htop
# インストール時にリポジトリを無効化(例:競合を避けるため)
yum --disablerepo=epel install nginx
rpmを直接操作する
.rpmファイルからのインストール
最もよくあるのは、メーカーのウェブサイトから.rpmファイルをダウンロードして、オフラインでインストールしたり、リポジトリにはない特定バージョンをインストールしたりする場合だ。
# ローカルの.rpmファイルからインストール
rpm -ivh package.rpm
# よく使うフラグ:
# -i = インストール
# -v = 詳細表示(verbose)
# -h = プログレスバーを表示(#####)
# アップグレード(古いバージョンが既にある場合)
rpm -Uvh package.rpm
# 依存関係チェックをスキップしてインストール(非推奨)
rpm -ivh --nodeps package.rpm
インストール済みパッケージの確認
# インストール済みの全パッケージを表示
rpm -qa
# 名前でパッケージを検索
rpm -qa | grep nginx
# 詳細情報を表示
rpm -qi nginx
# パッケージに含まれるファイル一覧を表示
rpm -ql nginx
# あるファイルがどのパッケージに属するかを調べる
rpm -qf /etc/nginx/nginx.conf
rpm -qfはデバッグ時に非常に役立つ。先ほどの5台のサーバー移行時も、このコマンドで設定ファイルからパッケージ名を逆引きし、Rocky Linuxで再インストールが必要なパッケージの完全なリストを作成した。
rpmによるパッケージ削除
# パッケージを削除(正確な名前が必要)
rpm -e nginx
# 依存関係チェックをスキップして削除
rpm -e --nodeps nginx
削除時の--nodepsは諸刃の剣だ。かつてこのフラグで共有ライブラリを削除してしまい、それに依存する多数のアプリが連鎖的に落ちた経験がある——後処理に2時間かかった。自分が何をしているか完全に把握している場合のみ使用すること。
よくある問題への対処
パッケージインストール時の依存関係エラー
# インストール前にパッケージの依存関係を確認
yum deplist nginx
# 依存関係エラーが発生した場合、キャッシュをクリアして再試行
yum clean all
yum makecache
yum install nginx
更新後のロールバック
# yumトランザクションの履歴を表示
yum history
# トランザクション番号5の詳細を確認
yum history info 5
# トランザクション番号5を元に戻す(ロールバック)
yum history undo 5
yum history undoには何度か助けられた。カーネルやglibcの更新でサーバーが起動しなくなったときに特に有効だ。本番環境を更新する前に現在のトランザクションIDをメモしておくのが習慣になっている。問題が発生してもロールバックは30秒もかからない。
インストールせずにパッケージをダウンロード
# パッケージ(および依存関係)を指定ディレクトリにダウンロード
yum install --downloadonly --downloaddir=/tmp/packages nginx
# その後、オフラインでインストール
rpm -ivh /tmp/packages/*.rpm
パッケージシステムの確認とメンテナンス
インストール済みパッケージの整合性チェック
# パッケージ内の全ファイルのチェックサムとパーミッションを確認
rpm -V nginx
# 出力がなければ変更なし(正常)
# 出力がある場合、インストール時からファイルが変更されている
# インストール済み全パッケージを確認(時間がかかる)
rpm -Va 2>/dev/null | grep -v "^.....UG"
定期的にパッケージ整合性を確認する習慣は、Linuxサーバーのハードニングにおいて重要なチェック項目の一つでもある。改ざんの早期発見に直結する。
キャッシュのクリア
# ダウンロード済みパッケージのキャッシュを削除
yum clean packages
# キャッシュを全削除(ヘッダー+メタデータ+パッケージ)
yum clean all
# メタデータキャッシュを再構築
yum makecache
再インストール用にパッケージリストをエクスポート
移行準備のたびに使っているテクニック——一つひとつのパッケージを思い出す作業と比べて、数時間の節約になる:
# インストール済みパッケージの一覧をエクスポート(名前のみ)
rpm -qa --qf "%{NAME}\n" | sort > installed-packages.txt
# 新しいサーバーでリストから一括インストール
yum install $(cat installed-packages.txt)
すべてのパッケージがそのままインストールできるわけではなく、事前にリポジトリの追加が必要なものもある。それでも完全なリストがあれば、インストール漏れを防げる。
まとめ
冒頭の5台のサーバー移行の話に戻ると:もしrpm -qf、yum history undo、パッケージリストのエクスポート方法を知らなかったら、完了までの時間は倍以上かかっていたと思う。yumとrpmを本当に理解するとは、コマンドを暗記することではなく、想定外の事態が起きたとき、適切なタイミングで適切なツールを使えることだ。
CentOS Stream 9やRocky/AlmaLinuxを使っている場合、補足として:yumは実際にはdnfのエイリアスになっている——構文は似ているが、dnfにはモジュールストリームとより優れた依存関係ソルバーが追加されている。この記事で紹介したコマンドはすべてそのまま動作する。より深く掘り下げたい場合は、RHEL/Rocky LinuxでのDNFパッケージマネージャー詳細ガイドも参照してほしい。

