本サイトのCentOS Stream8サーバは早朝に定期リブートするようCRONに仕込んでいるのですが、リブート後にカーネルパニックが発生していたことがありました。こんなことがあったよ!的に残しておくことにします。
1.朝起きたらサイトがダウンしてる!
リブートをCRONで仕掛けているので数か月に1回、朝5時頃にリブート処理が行われます。そして起床後にスマホでmuninを見る習慣があるのですが・・・タイムアウト。当然ブログにもアクセス不可。リブートの日なのでVPSサーバで何かが起きてる!?
2.VPSコンソールを見てみるとカーネルパニックで止まってました
VPSサーバのコンパネにログインしコンソール画面を見てみるとKernel panicがコンニチハしてるじゃないですか。とりあえずブートローダーで一つ前のカーネル指定を試してみますか。
3.VPSコンソール操作がブートローダーに間に合わない(涙
VPSコンパネからVPSサーバの強制再起動を行いすぐさまVPSコンソールに接続するのですが、ここで最初のハードルが立ちふさぎます。
コンソールがサーバに接続できるまで若干のタイムラグがあるせいで操作可能な時にはブートローダーのデフォルトタイムアウト=5秒を過ぎてしまい起動カーネルを選ぶことができません。数回試しても5秒以内にはVPSコンソールが利用可能にならずかなり厳しい状況に。
その後も試行錯誤を続けた結果、VPSサーバの再起動ではなく「シャットダウン→起動」の手順を踏むことで仮想マシンのPOST処理が入り、コンソール操作をブートローダーに間に合わせることができるようになりました。これで暫定復旧成功。
4.暫定復旧したので本復旧に向けて原因調査開始
- まずはカーネル再インストールを試す
# dnf reinstall -f kernel-4.18.0-365.el8.x86_64
→ 結果:カーネルパニック発生
- そういえばエラーメッセージをメモしていなかった。ログにも残っていないようなので、悔しいけれど再度カーネルパニックを再現させてメモを取ることにする
error: ../../grub-core/fs/fshelp.c:258:file '/initramfs-4.18.0-365.el8.x86_64.img' not found
→ このカーネル用のinitramfsが存在しないのがパニックの原因のよう。
- initramfsファイルを手動生成してみる
# mkinitrd initramfs-4.18.0-365.el8.x86_64.img.img 4.18.0-365.el8.x86_64 Creating: target|kernel|dracut args|basicmodules dracut: dracut module 'network-legacy' cannot be found or installed.
→ dracutのnetwork-legacyモジュールが足りないとのこと。これが原因っぽい。
-
dracut: dracut module ‘network-legacy’ cannot be found or installed.をググってみると、RHEL8のナレッジがヒット。仕事用のアカウントはあるけれど私的流用はNGなので素直にあきらめる。
- dracutのnetwork-legacyがインストールされているか確認
# dracut --list-modules |grep legacy network-legacy
→ インストールされているのに認識できていない。どうやらコレが根本原因かな?
5.dracutがnetwork-legacyを認識できない原因を探す
ログやら依存関係やらといろいろ調べ試しても原因がわからず。それならもう一度dracutでinitramfsを生成してエラーログを確認しよう!とやったところ・・・
# dracut --regenerate-all --force --verbose ... dracut: dracut module 'network-legacy' will not be installed, because command 'dhclient' could not be found! ... dracut: dracut module 'network-legacy' cannot be found or installed.
dhclientが見つからない・・・・DHCPクライアントコマンドがないことが原因だと?カーネルなのにDHCP?と困惑状態ですが、足りないなら入れてあげましょうdhcp-client。
# dnf install dhcp-client -y ... Installed: bind-export-libs-32:9.11.26-6.el8.x86_64 dhcp-client-12:4.3.6-45.el8.x86_64 dhcp-common-12:4.3.6-45.el8.noarch dhcp-libs-12:4.3.6-45.el8.x86_64 geolite2-city-20180605-1.el8.noarch geolite2-country-20180605-1.el8.noarch ipcalc-0.2.4-4.el8.x86_64 libmaxminddb-1.2.0-10.el8.x86_64
いろんな仲間を引き連れてdhcp-clientがサーバに加わりました。
6.dhclientを追加してinitramfsを生成・・・成功
ではもう一度。dracutでinitramfsを生成してみると今度はエラーなく環境できました。
# dracut --regenerate-all --force --verbos ... dracut: *** Creating image file '/boot/initramfs-4.18.0-365.el8.x86_64.img' *** dracut: *** Creating initramfs image file '/boot/initramfs-4.18.0-365.el8.x86_64.img' done ***
再起動後の起動も成功。結局dhclient(dhcp-client)がないことでカーネルパニックが発生していたというオチでした。
7.本当の原因は自分自身。検証環境でも再現できないことは結構ある。
そもそもdhcp-clientが勝手に消えることなんでありません。
誰かが手動で削除したんです。
消せるのはroot権限、つまりサーバ管理者。
自分か!
そういえば不要なパッケージはリソースの無駄!ということで数か月前に削除したのを思い出しました。検証環境で削除後に再起動して問題がないことを確認した上での実施でしたが、まさか悪影響のタイムラグが数か月もあるとは思ってもみませんでした。
またサーバの定期再起動は何もなければ勝手に終わるので楽なのですが、仕事のある平日に再起動でトラブルが起きたら処置まで半日放置せざるを得ない場合も。リスクヘッジをもう少し慎重に行うべきでした。