wiki:LinuxGrubTrap

GRUBがコケる

最小限のダウンタイムでRAIDに移行するって話を進めていたのですが、最後の最後でGRUBでつまずいていました。 ちゃんと動くようにインストールしたはずが、マシンを再起動すると画面にぐちゃぐちゃと文字が流れて暴走して固まります。 マシンの暴走なんて、ここ何年も見てなかったな。めずらしい。いやいや、悠長に珍しがっている場合ではありません。 悩みに悩んで、ようやく解決。僕が悪かったわけではないみたい。 僕はまた、RAIDとGRUBの絡みで何か僕が大きな勘違いをしてしまったのではないかと、ここ10日ばかり悩んでました。

原因は、GRUBシェルとstage*ファイルのバージョンの相違でした。

GRUBシェル(コマンドラインから起動するアレ)はバージョン0.97なのに、/boot/grub/以下に入っているstage*ファイルはバージョン0.95でした。 実はね、そのマシン、Debian woodyからsarge、etchへとアップグレードしてきた物なんです。 アップグレードの過程で、何かおかしくしちゃったんでしょうね。 GRUBの(ブートローダの)インストールし直しなんてめったにすることではありません。 これまで全く気づかず、運用にも問題がなかったのも、無理もない話です。

GRUBシェルでブートローダのインストールを行うとき、stage1、stage1.5にバイナリでパラメータを書き込んだ物をドライブのシリンダ0に書き込みます。 また、ファイルシステム上のstage2ファイルにも、バイナリでパラメータを書き込みます。 ここからは想像ですが、GRUBの0.95と0.97とで、パラメータを書き込む位置などに微妙な差異があるんでしょうね。 ただ、同じドライブを使ってQEMUの仮想マシンで起動すると、ちゃんと起動するのです。 QEMUだと起動でき、生のマシン(DELL PowerEdge 350と、たぶんSC1435)だと起動できないってのが説明つきません。 きっとBIOSの実装によっては、うまく動いちゃうこともあるってことにしておきましょう。 LBAの周りがくさいと思っているのですが。

修復は難しくありません。「/usr/lib/grub/」以下に正しいstage*ファイルが入っているので、これを「/boot/grub/」以下にコピーすれば終わり。 あ、もちろん、このあとにGRUBシェルを起動してブートローダのインストールをやり直す必要があります。

(2008/1/21 - sgk)