本日10時50分頃、カーネルアップデート後にリモートで reboot コマンドを叩いたところ、サーバーがそのまま沈黙しました……。
やはり、安易な気持ちでリモート再起動なんてするもんじゃありませんね。
物理的に電源を入れ直すこともできず、帰宅するまでの間、携帯には「HTTPサーバーにアクセスできません!」という死の宣告メールが大量に届き続ける始末。
帰宅後、原因究明から復旧までに悪戦苦闘した記録を、同じ状況で絶望している方のために残しておきます。
状況確認:無限パスワード要求ループの罠
帰宅後、コンソール画面を確認すると、カーネルパニックではなく起動時のファイルシステムチェック(fsck)でコケているようでした。
画面にはお決まりのメッセージが表示されています。
Give root password for maintenance
(or type Control-D to continue):「なんだ、パスワードを入れてメンテナンスモードに入ればいいだけか」と思い、キーボードを叩いたのですが……
Give root password for maintenance
(or type Control-D to continue):
Give root password for maintenance
(or type Control-D to continue):
Give root password for maintenance
(or type Control-D to continue):一文字打つたびにパスワードを要求され、無限ループに陥ってログインすらできません。 CTRL+ALT+DELETEの再起動は受け付けますが、何度やっても結果は同じでした。完全に詰みました。
レスキューUSBの作成(LiLi USB Creator)
「レスキューCDで起動して直すか…」と思いDVDドライブのボタンを押すも、無反応。 そういえば、HDD増設の際にSATAの電源ケーブルが届かず、DVDドライブのケーブルを引っこ抜いていたことを思い出しました。(サーバーラックの奥底から本体を引っ張り出すのは面倒すぎる…)。
そこで、「レスキューUSB」を作成してUSBブートで直すことにしました。
- 最初は別のツール(DDforWindows)を使いましたが、何度やってもBIOSループしてブートに失敗。
- 次にLiLi USB Creator(Linux Live USB Creator)を使用。サイトは怪しげですが、ソフトは日本語対応で非常に使いやすく、すんなりとレスキューUSBが完成しました。
これでレスキューOSを起動!……したのですが、解像度の問題か画面レイアウトが激しく崩れ、文字が全く読めない状態になってしまい断念。
最終兵器:KNOPPIXでUSBブートに挑む
レスキューOSでの復旧を諦め、USBメモリ(4GB)にギリギリ収まる容量(約3.7GB)のKNOPPIX 64bit版を焼き込んで起動を試みました。
設定が自動で完了し、いざGUI画面へ!と思ったその瞬間……
画面が謎の縦縞模様に……。マウスを動かすと模様もチカチカ変わります。 グラフィックドライバ(X-Window)の不具合のようです。CUIモードに切り替えても画面が真っ暗になるだけ。万事休すかと思いました。
解決策:起動オプションの追加
必死に調べた結果、KNOPPIXのboot画面で以下のオプション(起動パラメータ)を入力することで、正常に起動することがわかりました!
knoppix64 nomodeset nocompositeグラフィックドライバ周りの処理を無効化することで、無事にKNOPPIXのデスクトップ画面に到達しました。
fstabの修復と、Apache起動エラーの解消
ようやく、目的だった「本体HDDのマウントと修復」に入ります。 ターミナルを開き、以下のコマンドで本体のシステム領域(ここでは /dev/sda2)をマウントし、fstab を編集します。
$ su
# mkdir /mnt/a
# mount /dev/sda2 /mnt/a
# vi /mnt/a/etc/fstabエラーの原因となっていたおかしなボリュームの記述をコメントアウトし、サーバーを再起動! これで無事にOSが正常起動しました\( ⌒▽⌒ )/
最後の罠:eAcceleratorによるApache起動エラー
OSは無事に立ち上がりましたが、今度はWebサーバー(Apache)が起動しません。ログを見ると以下のエラーが。
eAccelerator: Could not allocate 268435456 bytes, the maximum size the kernel allows is 33554432 bytes. Lower the amount of memory request or increase the limit in /proc/sys/kernel/shmmax.PHPのアクセラレータ(eAccelerator)が要求する共有メモリのサイズ設定が足りていないようです。 以前、一時的な対応として echo 268435456 > /proc/sys/kernel/shmmax を叩いた記憶があるのですが、これは再起動すると初期化されてしまいます。
恒久的な対策 /etc/sysctl.conf に以下の設定を追記し、再起動しても設定が保持されるように修正しました。
kernel.shmmax = 268435456設定保存後、もう一度サーバーを再起動。 今度こそ、Apacheも含めてすべてのサービスが正常に稼働しました!
まとめ
今回のトラブルはカーネルアップデート自体が原因ではなく、「間違ったfstabの設定」や「一時的なカーネルパラメータ設定(shmmax)」が、再起動をトリガーにして一気に牙を剥いた形でした。
急にサーバーが起動しなくなるのは本当に心臓に悪いですね。 皆さんも、リモートで reboot する前には設定ファイル周りの見直しを慎重に行うことをおすすめします。