yum historyとgrepを使ったパッケージ管理トラブルシューティング
はじめに
LinuxサーバーでPackage Manager関連の問題、特に「いつの間にかパッケージが消えている」といった状況に遭遇したことはありませんか?そんなときに役立つのがyum history
とgrep
を組み合わせた調査手法です。
本記事では、トラブルシューティング事例を交えながら、パッケージ履歴調査の方法をご紹介します。
基本的なgrepの使い方
1. パッケージ名で絞り込む
特定のパッケージに関する操作履歴を調べたい場合:
yum history | grep httpd
この例ではhttpd
(Apache)を含むトランザクションのみが表示されます。パッケージ名の一部でも検索できるので、完全なパッケージ名を覚えていなくても大丈夫です。
# その他の例
yum history | grep git # gitパッケージの履歴
yum history | grep docker # dockerパッケージの履歴
yum history | grep nginx # nginxパッケージの履歴
2. 日付で絞り込む
特定の期間に行われた操作を調べたい場合:
# より確実な方法(全履歴を対象)
yum history list all | grep "xxxx-xx"
# 例:2024年7月の操作を確認
yum history list all | grep "2024-07"
この例では2024年7月に行われた全ての操作が一覧表示されます。障害が発生した日付周辺での変更を調べる際に便利です。
3. 組み合わせ技
パッケージ名で絞り込んだ後、詳細を確認する流れ:
# まず対象パッケージの履歴を表示
yum history | grep "httpd"
# 出力からトランザクションIDを確認し、詳細を表示
yum history info <ID>
この方法で、特定のパッケージがいつ、誰によって、どのような操作が行われたかを特定できます。
より詳細な調査方法
基本のyum history
では情報が限られている場合、yum history list all
を使用します:
yum history list all | grep httpd
このコマンドはより詳細な情報を表示するため、見落としがちな操作も発見できる場合があります。
トラブルシューティング例
yum historyの出力パターンを理解する
yum history
の出力で最も重要なのは、「誰が」操作を実行したかを示すUser欄です。この違いを理解することで、問題の原因を素早く特定しやすくなります。
ユーザーが手動で削除した場合
26 | root <root> | 2024-07-08 14:30 | Erase | httpd-2.4.6
27 | testuser <taro> | 2024-07-08 15:45 | Erase | git-1.8.3
この出力では:
root
= rootユーザーが直接コマンドを実行testuser
= testuserがsudoでコマンドを実行(ユーザー名がtaro)
"System "の謎を解く
一方、以下のような出力に遭遇することがあります:
25 | System <unset> | 2024-07-07 12:11 | Erase | httpd-2.4.6
このSystem
は重要な手がかりです。
System が意味すること
System
は、ユーザーが直接実行していないトランザクション(自動更新、システム処理、構成管理ツールなど)を示しています。
よくあるパターン:
- システム自動処理による削除
- yum autoremoveによる削除
- cloud-initやOSイメージ更新時の処理
- 構成管理ツール(SSM、Chef、Puppet、Ansibleなど)からの操作
- その他の可能性
- yumdbの破損時
- 手動でrpmコマンドを使った削除
- パッケージ情報の不整合
注意: ユーザーが直接実行していないトランザクション全般を指すため、自動削除に限らず様々なケースが考えられます。
削除されたパッケージの詳細調査
1. トランザクション詳細の確認
yum history info 25
このコマンドで実行されたコマンドラインや依存関係の詳細が確認できます。複数パッケージが削除されている場合、すべてのパッケージ名が表示されます。
2. yumログの確認
grep -A5 -B5 "httpd" /var/log/yum.log
前後5行を含めて表示することで、削除の文脈(他のパッケージとの関連性など)が見えてくることがあります。
ログ例:
Jul 07 12:10:58 Erased: php-7.4.8-1.el7.x86_64
Jul 07 12:11:02 Erased: httpd-2.4.6-88.el7_7.x86_64
Jul 07 12:11:03 Erased: httpd-tools-2.4.6-88.el7_7.x86_64
このように、httpdが他のパッケージ(php)の削除に伴って削除されていることが分かります。
3. 削除されたパッケージ一覧の確認
特定のトランザクションで削除されたすべてのパッケージを確認:
# トランザクション詳細で削除パッケージを確認
yum history info 25
# ログからも同時刻の削除を確認
grep "$(date -d '2024-07-07 12:11' '+%b %d %H:%M')" /var/log/yum.log
トラブルシューティングフロー
Webサーバーが突然動かなくなった場合の調査例:
# 1. httpdパッケージの履歴を確認
yum history | grep httpd
# 2. 結果例
# 25 | System <unset> | 2024-07-07 12:11 | Erase | httpd-2.4.6
# 3. トランザクション詳細を確認
yum history info 25
# 4. ログで前後の状況を確認
grep -A10 -B10 "2024-07-07 12:11" /var/log/yum.log
# 5. 必要に応じて再インストール
yum install httpd
まとめ
yum history
とgrep
を組み合わせることで、パッケージ管理のトラブルシューティングが効率化される場合があります。
注記:
本記事は主にCentOS7/RHEL7以前の環境を対象としています。