超高速ブート(POST中にキーボードドライバーが読み込まれない)を使用しているときにUEFIファームウェアセットアップユーティリティを起動する必要がある場合は、 "Os Indications" efi変数に書き込みます。私のOSはUbuntu 14.04カーネル3.13.0-35-genericです。
OsIndications
変数はUINT64ビットマスクを返します
OsIndicationsSupported
変数はUINT64ビットマスクを返しますファームウェアがOSユーザーがファームウェアユーザーインターフェイスで停止する要求をサポートしている場合、_
EFI_OS_INDICATIONS_BOOT_TO_FW_UI
_ビットはファームウェアによってOsIndicationsSupported変数に設定できます。 OSがファームウェアを次回の起動時にファームウェアユーザーインターフェイスで停止することを望む場合、OSが_EFI_OS_INDICATIONS_BOOT_TO_FW_UI
_ビットをOsIndications変数で設定できます。_
EFI_OS_INDICATIONS_BOOT_TO_FW_UI
_ = _0x0000000000000001
_- EFI仕様2.3.1Cの312ページ
私のファームウェアには、次回の起動時にファームウェアセットアップユーティリティに入る機能があります。
_$ hexdump /sys/firmware/efi/vars/OsIndicationsSupported-8be4df61-93ca-11d2-aa0d-00e098032b8c/data
0000000 0001 0000 0000 0000
0000008
_
_/sys/firmware/efi/efivars
_に新しい変数を作成できます
_$ printf\x07\x00\x00\x00\x00" > myvar-12345678-1234-1234-1234-123456789abc
_
ただし、efi変数_OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c
_に書き込むと、あらゆる種類の_write error: Invalid argument
_が生成されます。
_# printf "x00\x00\x00\x01" > /sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c
-bash: printf: write error: Invalid argument
# printf "x00\x00\x00\x01" > /sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c
-bash: printf: write error: Invalid argument
# printf "\x01" > /sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c
-bash: printf: write error: Invalid argument
# cat enter-uefi-fw > /sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c
cat: write error: Invalid argument
_
_# cat enter-uefi-fw > /sys/firmware/efi/vars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c/raw_var
cat: write error: Input/output error
# cat enter-uefi-fw > /sys/firmware/efi/vars/new_var
cat: write error: Invalid argument
# echo 'enter-uefi-fw' > /sys/firmware/efi/vars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c/raw_var
-bash: echo: write error: Invalid argument
# printf "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" > /sys/firmware/efi/vars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c/raw_var
-bash: printf: write error: Invalid argument
_
$ cat /boot/config-$(uname -r) | grep CONFIG_EFI=y
は_CONFIG_EFI=y
_を返しますcat /proc/cmdline | grep EFI
_は何も返しませんmount | grep efivars
_はnone on /sys/firmware/efi/efivars type efivarfs (rw)
を返しますefivar -l
_はEFI変数をエラーなしでリストする必要がありますhttps://ask.fedoraproject.org/en/question/8264/after-installing-Fedora-i-cant-open-biosefi-setup/?answer=16402#post-id-16402 によると= _cat enter-uefi-fw > /sys/firmware/efi/vars/new_var
_コマンドはFedora 17で動作するはずです。
_# rm -rv /sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c
removed '/sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c'
# ls -l enter-uefi-fw
-rw-r--r-- 1 root root 2084 Aug 25 20:23 enter-uefi-fw
# cat enter-uefi-fw > /sys/firmware/efi/vars/new_var
cat: write error: Invalid argument
_
コマンドラインからUbuntu 14.04の既存のOsIndications efi変数を更新するにはどうすればよいですか(信頼できる)。
非標準のUEFI変数を削除するとシステムファームウェアがPOSTに失敗する多くのファームウェアバグが存在するため、よく知られていないefivarfsファイル標準化された変数は不変のファイルとして作成されます。
https://www.kernel.org/doc/Documentation/filesystems/efivarfs.txt
これは、lsattrおよびchattrコマンドで確認および変更できます。
例えば:
root@hi12:/tmp/test# hexdump -C out
00000000 07 00 00 00 10 00 00 00 |........|
00000008
root@hi12:/tmp/test# cp out /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23
cp: cannot create regular file '/sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23': Operation not permitted
root@hi12:/tmp/test# lsattr /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23
----i-------------- /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23
root@hi12:/tmp/test# chattr -i /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23
root@hi12:/tmp/test# lsattr /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23
------------------- /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23
root@hi12:/tmp/test# cp out /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23
root@hi12:/tmp/test# chattr +i /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23
root@hi12:/tmp/test# lsattr /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23
----i-------------- /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23
root@hi12:/tmp/test#
ここで関連する64ビットマスクは次のとおりです。
#define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001
これは、以下を使用してリトルエンディアン(Intel)形式の文字列として生成できます。
str='\x01\x00\x00\x00\x00\x00\x00\x00'; printf "$str"
上記のprintf "$str"
の出力は、efivarfs変数ファイル$var
の-data contentsに入力する必要があります。
var='/sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c'
ただし、/sys/firmware/efi/efivars
の各ファイルは4バイトのヘッダーで始まり、その後にデータの内容が続きます。したがって、efivarfs変数ファイルprintf "$str"
に書き込む前に、$var
の出力の前に4バイトのヘッダーを付ける必要があります。 $str
と$var
を上記のように使用すると、これを行うことができます。たとえば、次のように使用します。
{ head -c 4 "$var"; printf "$str"; } > "$var"
echo
の代わりにcat
を使用してみてください。
# echo 'enter-uefi-fw' > /sys/firmware/efi/vars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c/raw_var