CentOSでyumとrpmを使ったパッケージ管理:インストール、削除、リポジトリ管理

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

実体験から:なぜ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 -qfyum history undo、パッケージリストのエクスポート方法を知らなかったら、完了までの時間は倍以上かかっていたと思う。yumrpmを本当に理解するとは、コマンドを暗記することではなく、想定外の事態が起きたとき、適切なタイミングで適切なツールを使えることだ。

CentOS Stream 9やRocky/AlmaLinuxを使っている場合、補足として:yumは実際にはdnfのエイリアスになっている——構文は似ているが、dnfにはモジュールストリームとより優れた依存関係ソルバーが追加されている。この記事で紹介したコマンドはすべてそのまま動作する。より深く掘り下げたい場合は、RHEL/Rocky LinuxでのDNFパッケージマネージャー詳細ガイドも参照してほしい。

Share: