systemd-bootでEFIブート変数が書き換わった時の対処
TL;DR
# efivar --help
はじめに
systemd-bootを利用している場合、F1キーを押すことで起動パラメータを編集することができます。
基本的に全てのパラメータは「/ESP(EFI System Partition)/EFI/loader.conf」を参照することになっていますが、default
,timeout
はEFIブート変数を優先するようになっています。
そのため、以下の偶然が重なると、timeout
識別用の変数に0がセットされ、ブートメニューから何も選択できなくなります。
- PCの電源が入りブート処理が行われる
- ついうっかり「F1」キーが押される
- tキーが押される(timeoutの設定の上書き)
- 数値以外の何らかのキーが押される
対処
EFIブート変数は/sys/firmware/efi/efivars
にマウントされ実際のバイナリの値を参照することは出来ますが、readonlyな領域のためUEFIのNVRAMに対して書き込みを行うことはできません。
そのため、ファイルを編集するように簡単に値を編集することはできませんが、値はefivar
コマンドから操作することができます。
現在の値を確認するには以下のコマンドを実行します。
# efivar -l
...
4a67b082-0a4c-41cf-b6c7-440b29bb8c4f-LoaderConfigTimeout
...
たくさん出てきますが、今回問題となるのは「LoaderConfigTimeout」です。
謎のGUIDがありますが、値の規則はよくわかりませんでした。
値を書き換えるために、変更後の値を指定したファイルを作成する必要があるため、以下で作成します。今回はtimeout
を5秒にします。
echo -n 5 > LoaderConfigTimeout.txt
以下のコマンドで実際に設定を書き込みます。
# efivar --name=4a67b082-0a4c-41cf-b6c7-440b29bb8c4f-LoaderConfigTimeout -w -f LoaderConfigTimeout.txt
変更された事を確認します。
# efivar --name=4a67b082-0a4c-41cf-b6c7-440b29bb8c4f-LoaderConfigTimeout -p
GUID: 4a67b082-0a4c-41cf-b6c7-440b29bb8c4f
Name: "LoaderConfigTimeout"
Attributes:
Non-Volatile
Boot Service Access
Runtime Service Access
Value:
00000000 35 |5 |
再起動すると、EFIブート変数に指定した「LoaderConfigTimeout=5」が有効になることで、選択画面で5秒間待つようになり、0秒でtimeoutして適当なOSが起動するようになってしまった環境が元にもどります。