きっかけ
古いPCを再利用して運用しているUbuntu Serverが、起動時に毎回GRUBの選択画面で30秒待たされるので、解決するために調査をした。
原因
GRUBにはrecordfailという機能がある。
起動時にGRUBがgrubenvにrecordfail=1を設定、
正常に起動するとgrub-common.serviceがgrubenvからrecordfailを削除する。
次回起動時にrecordfailが無ければGRUBの選択画面をスキップしすぐに起動、
recordfail=1の場合はgrub-common.serviceが削除していない=起動に失敗と判断し、選択画面が表示され、リカバリモードなどに入りやすくなる。
しかし、recordfailはブート時にgrubenvへの書き込みが必要なため、環境によっては動作しない。
今回の問題は、recordfailが動作しない環境だったのが原因だった。
詳細
/boot/grubが
- diskfilter | lvmに置かれている
- btrfs | cpiofs | newc | odc | romfs | squash4 | tarfs | zfsに置かれている
上記いずれかに該当する場合、recordfailが動作しない。
これに加えて、efiでインストールされている場合、GRUB_RECORDFAIL_TIMEOUTが使用され、選択画面がこの時間表示される。
GRUB_RECORDFAIL_TIMEOUTのデフォルト値は30秒。
解決方法
1. recordfailが動作するようにインストールし直す
これが一番良い解決方法だが、OSインストールからやり直す必要があるため、新規インストールの際に気を付けるのが良い。
/bootを分割し、ext4でフォーマットすると良さそう。
2. GRUB_RECORDFAIL_TIMEOUTを短くする
OSの再インストールをせずに解決できるので、既存のシステムで発覚した場合、この方法が安全。
/etc/default/grubにGRUB_RECORDFAIL_TIMEOUTを設定し、grub.cfgを更新するだけで良い。
3. grubenvに嘘の値を設定する (非推奨)
ファイルシステム等が上記のリストに一致しても、efiでなければ30秒の待ち時間は発生しない。
そのため、grubenvにgrub_platform=xなど、efi以外の値を設定し騙すことで選択画面をスキップできる。
ただし、この方法は他の場所でefi用に書かれたものも動かなくなるので、不具合が生じる可能性がある。
そのためこの方法は非推奨とする。