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

#前置き
最近、OSが起動しないパターンの障害によく遭遇するので、忘れないうちに記事にしておきます。
今回は、GRUBが破損してOSが起動しなくなった場合の対応方法についてです。

OSが起動しない場合の対処方法は、[以前にも記事にしたので](https://qiita.com/daisuke0115/items/4b0ed3a5888cf81efd0a "SElinuxの無効化に失敗してOSが起動しなくなった話")こちらも併せて読んでみてください。

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

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

##前準備
grub.cfgが破損した状態を再現するために以下を実施しました。
###1.grub.cfgのバックアップを取得。
cpコマンドでgrub.cfgのバックアップを取得します。

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

```
[root@localhost]# cd /boot/efi/EFI/centos/
[root@localhost]# ls -l /boot/efi/EFI/centos/grub.*
-rwx------. 1 root root 4221  7月 28 15:54 /boot/efi/EFI/centos/grub.cfg
[root@localhost]# cp -p grub.cfg grub.cfg_bk
[root@localhost]# ls -l /boot/efi/EFI/centos/grub.*
-rwx------. 1 root root 4221  7月 28 15:54 /boot/efi/EFI/centos/grub.cfg
-rwx------. 1 root root 4221  7月 28 15:54 /boot/efi/EFI/centos/grub.cfg_bk
```

###2.grub.cfgを破損させる
疑似的にgrub.cfgが破損した状態を再現するため、grub.cfgを/dev/nullで上書きします。

```
[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](https://qiita-image-store.s3.amazonaws.com/0/269326/459789dc-710c-222a-7d83-3df110d38059.png)

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

[^1]: カーネル起動オプションの設定を誤り、「対応方法」に記載されている方法でバックアップしたgrub.cfgを読み込みたい場合などに使用します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/6eac89aa-5aa5-1001-ba87-7aa72a7993f0.png)

##対応方法
grub.cfgのバックアップがある場合は、バックアップされたファイルを読み込むことでOSを起動させることができます。対応手順は以下の通りです。

###１．grub.cfgのバックアップファイルを探す
grubコマンド画面で`ls`と叩くと認識されているディスク一覧が表示されます。[^2]
表示されるディスク名はOS上と名前が異なるので注意してください。

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

```
grub> ls
(hd0) (hd0,gpt1) (hd0,gpt2) (hd0,gpt3) (hd0,gpt4) (hd1) (hd1,gpt1)

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

|OS|GRUB(EFI)|GRUB(BIOS)|
|:-:|:-:|:-:|
|sda|(hd0)|(hd0)
|sda1|(hd0,gpt1)|(hd0,msdos1)
|sdb2|(hd1,gpt2)|(hd1,msdos2)

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

```
grub> ls (hd0,gpt1)/
efi/

```

lsコマンドを駆使して、grbu.cfgのバックアップファイルがあるディレクトリを探します

```
grub> ls (hd0,gpt1)/efi/
./ ../ centos/ boot/
grub> ls (hd0,gpt1)/efi/centos/
./ ../ grubenv grub.cfg_bk ...

```

バックアップされたgrub.cfgファイルが確認できました。

###２．grub.cfgを読み込ませる
以下のコマンドでバックアップされたgrub.cfgを読み込ませます。
`configfile [バックアップしたgrub.cfg]`
今回の場合ですと`configfile (hd0,gpt1)/efi/centos/grub.cfg_bk`となります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/60376ea5-771c-8805-ebbd-17e3356b03b9.png)

無事OSの選択画面を表示される事に成功しました。
このままOSを起動します。

###３．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.cfgのバックアップを取得していなかった場合
この場合は、CD/DVDブートで「Troubleshooting」よりOSにログインし、grub.cfgを再作成する必要があります。
CD/DVDブートでのOS起動の方法は[「SElinuxの無効化に失敗してOSが起動しなくなった話」](https://qiita.com/daisuke0115/items/4b0ed3a5888cf81efd0a)を参考にしてください。なお、CD/DVDブートでのgrub.cfgの再作成は未検証ですので実施する場合はご注意ください。

#あとがき
今回はGRUBが起動しない場合のリカバリー方法を一つ紹介しました。
対応方法としては、grubコマンド画面から直接OSを起動させる方法もありますので、機会がありましたら記事にしたいと思います。

追記：grubコマンド画面から直接OSを起動させる方法を[記事](https://qiita.com/daisuke0115/items/da6f399df52af95cc0b8 "grub.cfgが破損してOSが起動しなくなった場合の対応方法②")にしました。

以上