[Linux] GRUBシェルの使い方[Linux] How to use GRUB shell

朝晩はすっかり寒くなってしまいました、岡本です。
自転車に乗っているのですが、そろそろ防寒装備が必要だと感じています。

LinuxではブートローダとしてGNU GRUB を採用しているディストリビューションが多いです。昔Linuxのブートローダとしては LILO (LInux LOder) が使われていましたが、今ではマルチブート対応のGRUBが一般的になり、LinuxだけでなくSolarisなどの標準ブートローダとしても使われるよ うになりました。

さてLinuxサーバをメンテしていると、OSアップグレードなどに伴って起動しなくなることがあります。読み込むべきカーネルイメージを間違え る、GRUBのconfigファイルが壊れる、ファイルシステム破損など…。先日、ラボにあるUbuntuのサーバをアップグレード (do-release-upgrade) したらUbuntuが起動しなくなってしまいました。GRUBのOS選択画面が出てこなくなりました。その代わり、以下のようなプロンプトが出てきました。

 これは、GRUB shellと呼ばれる、Bashライクなコマンドラインインタフェースです。普段カーネルオプションの追加などは /boot/grub/grub.cfg を編集して再起動、という手法をとると思いますが、このシェルからでもほぼ同じことができます。GRUBのOS選択メニューから ‘c’ キーを押してもこのシェルを呼び出せます。

例えば ls すると現在認識しているディスクパーティションを見ることができます。

 (hd0) は /dev/sda などに対応し、 (hd0,1) は /dev/sda1 などに対応すると思ってもらえればよいです。
さらに、GRUBが認識可能なファイルシステムを使っている場合は、そのまま中身を見ることができます。
今回 (hd0,1) は ext4 を使っているので、以下のように中身が見えます。

 では、GRUBシェルからOSを起動してみます。GRUBの設定ファイルが壊れているような場合は、以下の構文で通常通り起動できます。/boot /grub/grub.cnf (RedHat系) や /boot/grub/menu.lst (Debian系) で同様のものを見たことがある人もいると思います。

(Ubuntu 11.04の場合)

 1行目はroot (/) パーティションの指定、2行目はカーネルとカーネルオプション、3行目はinitrd (起動時の一時作業ディスク) の指定になっています。2行目は場合に寄っては linux ではなく kernel で始まることもあります。/vmlinuz, /initrd.img は最後にインストールしたカーネルやinitrdへのシンボリックリンクになっています。ちなみに、カーネルオプションに ’1′ と付けるとシングルユーザモード (ランレベル1) で起動できます。rootパスワードを忘れた場合等に便利です。

今回は以上の手順だけで正常に起動することができました。起動後にログインして、次回以降正常に起動するようにGRUBの修復を行います。

 grub-install はその名の通り GRUBをインストールするコマンドです。/dev/sda と指定すると sda のMBRをGRUBで上書きします。update-grub は /etc/grub.d 以下に置いてあるヘルパースクリプトから grub.cfg を構築するUbuntuのコマンドです。
これで再起動しても正常にUbuntuが起動するようになりました。

by Yoshihiro OKAMOTO