twitter icon   twitter icon   rss icon

Linux.com Japan

Home Linux Jp チュートリアル Linux 上の GRUB 2 がブートできなくなったときの対処方法

Linux 上の GRUB 2 がブートできなくなったときの対処方法

原文はこちらです。

grub command shell

一時期、GRUB バージョン 0.97 (Grand Unified Linux Bootloadの略) がよく使われていました。この古典的な GRUB はさまざまな特徴を持っていましたが、いまでは古くなり、開発者はもっと多くの機能を実現するために、GRUB 2 を世に送り出しました。

GRUB 2 は大きく書き換えられていて、多くの違いがあります。リムーバル デバイスからのブートが可能であり、BIOS と連携するオプションを組み込むこともできます。スクリプトを実行したり、/boot/grub/menu.lst のかわりに、すべてのオプションを 1 か所に格納します。デフォルトでは /boot/grub/grub.cfg です。通常、そのファイルを直接編集することはできません。そのかわりに、/etc/defaults/grub を編集し、GRUBメニューを制御します。また、/etc/grub.d にあるスクリプトも適宜編集します。これらのスクリプトは、オペレーティング システムのブート、memtestos_prober といった外部アプリケーションを制御します。/etc/default/grubと/etc/grub.d/* を編集するたびに、update-grub コマンドを実行して /etc/grub/grub.cfg を再生成します。

update-grub スクリプトは、カーネルとブート ファイルの検出、および GRUB ブート メニューへのオペレーティング システム追加を行う優れたスクリプトです。ユーザーは、これらの作業をマニュアルで行う必要がありません。

ここでは、よく起こり得る 2 つの問題について、その解決策を学びます。システムをブートしたときに、grub> プロンプトを出して、システムが停止したときは、GRUB 2 コマンド シェルが動いている状態です。これは、GRUB 2 が正常に起動し、 モジュール (および / boot/grub/[arch]/ に格納されている他モジュール) をロードしたが、grub.cfg ファイルが見つからなかったことを意味します。もうひとつのケースとして、grub rescue> プロンプトが表示されたときは、normal.mod が見つからなかったことを意味します。これは、ブートに関連するファイルがいずれも存在しないことを意味します。

このようなことがなぜ起こるのでしょうか。カーネルが何らかの理由でドライブ名を変更した、ハード ディスクを移動した、パーティションを変更した、または新しいオペレーティング システムを追加して関連する何かを移動したなどです。これらの場合は、GRUB がファイルを検出できないだけで、ファイル自体はもとの場所に存在します。そこで、GRUB がプロンプトを出したら、ファイルの場所を指定し、システムをブートして、GRUB の設定を修正すればよいのです。

GRUB 2 コマンド シェル

GRUB 2 コマンド シェルは、旧 GRUB のシェルのように強力です。ブート イメージ、カーネル、ルート ファイルシステムの検出ができます。実際、ローカルなマシン上のすべてのファイルシステムに、パーミッションやアクセス権限とは無関係に完全アクセス可能です。これは、セキュリティ上の問題に思えるかもしれませんが、昔の UNIX 時代には、マシンの所有者は、物理的なアクセス権限を持っていました。
grub> プロンプト状態では、コマンド シェルと同様に history やタブ補完が可能です。grub rescue> プロンプト状態は、もっと限られています。historyもタブ補完も使えません。
動くシステムを使って、GRUB ブート メニューが表示されたときに、C キーを押してください。GRUB コマンド シェルが動きます。ブートアップのカウント ダウンを止めるには、矢印キーを使って、メニューをスクロール アップまたはダウンさせます。GRUB コマンド ラインで入力しても保存はされないので、自由に挑戦してください。grub>grub rescue> が表示されていれば、もう準備完了です。
下記に示すコマンドは、grub>grub rescue> のどちらでも使用できます。最初に、pager コマンドで、長いコマンド出力をページングさせます。

 

grub> set pager=1

"=" 記号の前後には空白を入れません。少し、意味のあることをしましょう。ls コマンドで、GRUB が認識しているパーティションをリストします。

grub> ls
(hd0) (hd0,msdos2) (hd0,msdos1)

この msdos 云々は、このシステムが Global Unique Identifiers Partition Table (GPT) (参照文献) ではなく、MS-DOS 時代のパーティション テーブルを持っていることを意味します。GPT を使用しているときは、(hd0,gpt1) と表示されます。それでは、もう少し検索しましょう。ファイルを検索するため、ls コマンドを使います。

grub> ls (hd0,1)/
lost+found/ bin/ boot/ cdrom/ dev/ etc/ home/  lib/
lib64/ media/ mnt/ opt/ proc/ root/ run/ sbin/ 
srv/ sys/ tmp/ usr/ var/ vmlinuz vmlinuz.old 
initrd.img initrd.img.old

ルート ファイルシステムのようですね。msdosgpt のラベルは省略可能です。"/" (スラッシュ) を付けずに実行すると、ファイルシステムの情報を表示します。cat コマンドを使って、ファイルの内容を読むことができます。

grub> cat (hd0,1)/etc/issue
Ubuntu 14.04 LTS \n \l

/etc/issue を見ればどの Linux ディストリビューションを使っているか確認できるので、マルチブート システムでは便利です。

grub> プロンプトからブートする

次は、ブートに関連するファイルの設定と grub> プロンプト状態からブートする方法です。ls コマンドを実行して、(hd0,1) 上に Linux ルート ファイルシステムがあることがわかりました。そして、/boot/grub がどこにあるかを確認するまで、検索することができます。そして、以下のコマンドを実行してください。これで、ルート パーティションに存在するカーネル、および initrd を用いて起動します。

grub> set root=(hd0,1)
grub> linux /boot/vmlinuz-3.13.0-29-generic root=/dev/sda1
grub> initrd /boot/initrd.img-3.13.0-29-generic
grub> boot

1 行目で、ルート ファイルシステムが存在するパーティションを指定します。2 行目で、起動するカーネルを指定します。/boot/vml までタイプして、タブ補完を使い、残りを補完します。次にroot=/dev/sdを入力し、ルート ファイルシステムを指定します。冗長なようですが、これを正しく指定しないとカーネル パニックになります。では、正しい指定は、何でしょうか。hd0,1=/dev/sda1、hd1,1=/dev/sdb1、hd3,2=/dev/sdd2 の関係があります。あとは、わかりますね。
3 行目で、カーネルと同じバージョンの initrd ファイルを指定します。
4 行目で、システムをブートします。
いくつかの Linux システムでは、カーネルと initrd は、ルート ファイルシステムのトップ レベルにシンボリック リンクされています。

$ ls -l /
vmlinuz -> boot/vmlinuz-3.13.0-29-generic
initrd.img -> boot/initrd.img-3.13.0-29-generic

その場合は、次のようにします。

grub> set root=(hd0,1)
grub> linux /vmlinuz root=/dev/sda1
grub> initrd /initrd.img
grub> boot

grub-rescue> からブートする

GRUB rescue shell の場合は、違うコマンドを使います。まず、normal.modlinux.mod の各モジュールをロードします。

grub rescue> set prefix=(hd0,1)/boot/grub
grub rescue> set root=(hd0,1)
grub rescue> insmod normal
grub rescue> normal
grub rescue> insmod linux
grub rescue> linux /boot/vmlinuz-3.13.0-29-generic root=/dev/sda1
grub rescue> initrd /boot/initrd.img-3.13.0-29-generic
grub rescue> boot

両モジュールをロードしてから、タブ補完が使えます。

恒久的な修正を行う

問題なくシステムをブートできたら、以下のコマンドで、GRUB を修正します。

# update-grub
Generating grub configuration file ...
Found background: /usr/share/images/grub/Apollo_17_The_Last_Moon_Shot_Edit1.tga
Found background image: /usr/share/images/grub/Apollo_17_The_Last_Moon_Shot_Edit1.tga
Found linux image: /boot/vmlinuz-3.13.0-29-generic
Found initrd image: /boot/initrd.img-3.13.0-29-generic
Found linux image: /boot/vmlinuz-3.13.0-27-generic
Found initrd image: /boot/initrd.img-3.13.0-27-generic
Found linux image: /boot/vmlinuz-3.13.0-24-generic
Found initrd image: /boot/initrd.img-3.13.0-24-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
done
# grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

grub-install コマンドを実行したときのインストール先は、パーティションではなく、ハード ドライブのブート セクタであることに注意してください。つまり、/dev/sda1 のようにパーティションを指定してはいけません。

それでも動かないときは

それほどひどい状態のときは、Super GRUB2 live rescue disk を使ってください。GNU GRUB Manual 2.00 も役に立つでしょう。

Linux Foundationメンバーシップ

30人のカーネル開発者

人気コンテンツ


Linux Foundationについて

Linux Foundation はLinux の普及,保護,標準化を進めるためにオープンソース コミュニティに資源とサービスを提供しています

 

The Linux Foundation Japan

サイトマップ

問い合わせ先

サイトに関するお問い合わせはこちらまで

Linux Foundation Japan

Linux Foundation

Linux Training

提案、要望

Linux.com JAPANでは広く皆様の提案、要望、投稿を受け付ける予定です。

乞うご期待!