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人のカーネル開発者

人気コンテンツ

  1. Today's Linux 2018/12/03 2018年 12月 02日
  2. Today's Linux 2018/12/04 2018年 12月 03日
  3. Today's Linux 2018/12/06 2018年 12月 05日
  4. Today's Linux 2018/12/07 2018年 12月 06日
  5. Today's Linux 2018/12/10 2018年 12月 09日

Linux Foundationについて

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

 

The Linux Foundation Japan

サイトマップ

問い合わせ先

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

Linux Foundation Japan

Linux Foundation

Linux Training

提案、要望

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

乞うご期待!