grub.cfgが破損してOSが起動しなくなった場合の対応方法②

この記事は最終更新日から1年以上が経過しています。

前置き

前回、grub.cfgが破損した場合にバックアップファイルから復旧する方法を記事にしました。今回は、バックアップを取得していなかった場合の復旧方法についてです。

実施環境はESXi6.5のネステッド環境に、ゲストOSとしてCentOS7.3をインストールしています。ファームウェアはEFIで実施していますので、BIOSを使用している環境で試す場合はご注意ください。

grub.cfgが破損してOSが起動しなくなった場合

注意:OSが起動しなくなる恐れがあるため、作業前にgrub.cfgをバックアップすることをお勧めします。バックアップならびにリストア方法については、「grub.cfgが破損してOSが起動しなくなった場合の対応方法①」を参考にしてください。

前準備

grub.cfgが破損した状態を再現するため、前回と同様にgrub.cfgを/dev/nullで上書きします。
cat /dev/null > grub.cfg

なお、GRUBファイルの格納場所は以下の通りです。
EFI:/boot/efi/EFI/centos/grub.cfg
BIOS:/boot/grub2/grub.cfg

[root@localhost]# cat /dev/null > /boot/efi/EFI/centos/grub.cfg
[root@localhost]# ls -l /boot/efi/EFI/centos/grub.*
-rwx------. 1 root root    0  8月  4 20:46 /boot/efi/EFI/centos/grub.cfg
-rwx------. 1 root root 4221  7月 28 15:54 /boot/efi/EFI/centos/grub.cfg_bk
[root@localhost]#

これで準備完了です。

エラー状態

OSを起動させようとした場合、通常時はgrub.cfgが読み込まれ、以下のようなOSの選択画面が表示されます。
【通常時】
image.png

今回、前準備でgrub.cfgを破損状態にしていた為、grub.cfgが読み込めずgrubのコマンド画面が表示されてしまいました。なお、【通常時】の画面からcキーを押下してもこちらの画面に切り替えることができます。

image.png

対応方法

1.起動するカーネルを探す

grubコマンド画面でlsと叩くと認識されているディスク一覧が表示されます。1
表示されるディスク名はOS上と名前が異なるので注意してください。

grub> ls
(hd0) (hd0,gpt1) (hd0,gpt2) (hd0,gpt3) (hd0,gpt4) (hd1) (hd1,gpt1)
(lvm/cl-root) (lvm/cl-swap)

参考までに簡単な対応表を置いておきます。

OS GRUB(EFI) GRUB(BIOS)
sda (hd0) (hd0)
sda1 (hd0,gpt1) (hd0,msdos1)
sdb2 (hd1,gpt2) (hd1,msdos2)
mapper/cl-root (lvm/cl-root) (lvm/cl-root)

さらにlsコマンドに表示されたディスク名を付けると、配下のディレクトリとファイルが表示されます。コマンドの最後に/を付けるのを忘れないようにしてください。

grub> ls (hd0,gpt1)/
efi/

lsコマンドを駆使して、起動するカーネルを探します。

grub> ls (hd0,gpt2)/
./ ../ lost+found/ efi/ grub2/ vmlinuz-3.10.0-514.16.1.el7.x86_64
initramfs-3.10.0-514.16.1.el7.x86_64.img

(hd0,gpt2)に起動するカーネル「vmlinuz-3.10.0-514.16.1.el7.x86_64」があることが確認できました。イメージファイル「initramfs-3.10.0-514.16.1.el7.x86_64.img」も同じディレクトリにあります。

2.パラメータを設定する

起動するための設定を読み込ませていきます。
必要な設定は以下の3つです。
①rootファイルシステムが存在するパーティーション
②起動するカーネルの場所とOSから見たrootが格納されているデバイス名
③イメージファイルの場所

それぞれ、①(hd0,gpt2) ②/vmlinuz-3.10.0-514.16.1.el7.x86_64と/dev/mapper/cl-root ③/initramfs-3.10.0-514.16.1.el7.x86_64.img となります。
※rootをLVM上に作成していた場合、linuxefi指定時に「lvmのデバイス名」を指定する必要があります。

これを以下のようにgrubコマンド画面で指定していきます。

grub> set root=(hd0,gpt2)
grub> linuxefi /vmlinuz-3.10.0-514.16.1.el7.x86_64 root=/dev/mapper/cl-root
grub> initrdefi /initramfs-3.10.0-514.16.1.el7.x86_64.img
grub> 

BIOSの場合は②と③を設定するコマンドがそれぞれlinuxinitrdになります。

3.起動する

ここまで設定したら、最後にbootコマンドでOSを起動させます。

grub>boot

うまく設定できていればOSが起動します。

4.grub.cfgを再作成する

OSにログイン後、以下のコマンドで破損しているgrub.cfgを再作成します。
grub2-mkconfig -o [grub.cfgの格納場所]

[root@localhost]# grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-514.16.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-514.16.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-084b46c885214a3eb90bb06d2dde1d48
Found initrd image: /boot/initramfs-0-rescue-084b46c885214a3eb90bb06d2dde1d48.img
done
[root@localhost]# ls -l /boot/efi/EFI/centos/grub.*
-rwx------ 1 root root 4385  8月  4 21:16 /boot/efi/EFI/centos/grub.cfg

破損したgrub.cfgの再作成が成功しました。
これで対応は完了となります。

以上

あとがき

今回はgrubコマンド画面より直接OSを起動させる方法を紹介しました。
grub周りの作業は失敗した場合にOSが起動しなくなりますので、十分に注意して行ってください。


  1. LVMのファイルが表示されない場合はinsmod lvmでモジュール読み込んでからlsするとパスが表示されるようになります。その他のgrubコマンド画面で使用できるコマンドは[Tab]キーで表示されます。 

daisuke0115
インフラエンジニアです。 最近は設計~構築をメインにお仕事しています。Qiitaには主にLinux周りで勉強したことを備忘録がわりに残しています。
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
コメント
この記事にコメントはありません。
あなたもコメントしてみませんか :)
すでにアカウントを持っている方は
ユーザーは見つかりませんでした