
UEFIファームウェア設定ユーティリティに入る必要がある超高速ブートを使用するとき(POST中にキーボードドライバがロードされない)、「Os Inspirations」efi変数に書きたいと思います。私のオペレーティングシステムはUbuntu 14.04カーネル3.13.0-35-genericです。
OsIndications
変数はUINT64ビットマスクを返します。
OsIndicationsSupported
変数はUINT64ビットマスクを返します。
EFI_OS_INDICATIONS_BOOT_TO_FW_UI
ファームウェアがファームウェアのユーザーインターフェイスで停止するようにOS要求をサポートしている場合、ファームウェアはOsInductionsSupported変数でこのビットを設定できます。EFI_OS_INDICATIONS_BOOT_TO_FW_UI
オペレーティングシステムが次の起動時にファームウェアのユーザーインターフェイスでファームウェアを停止したい場合、オペレーティングシステムはOsIndicates変数でこのビットを設定できます。
EFI_OS_INDICATIONS_BOOT_TO_FW_UI
=0x0000000000000001
-UEFI仕様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
。
新しいefivafを使用してください
# 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
古い1024バイトの最大sysfs-efivarsを使用する
# 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
UEFI変数のサポートが正しく機能するには、要件を確認してください。
- EFIランタイムサービスのサポートは、カーネル
$ cat /boot/config-$(uname -r) | grep CONFIG_EFI=y
リターンに表示する必要があります。CONFIG_EFI=y
- コアプロセッサビット/アーキテクチャとEFIプロセッサビット/アーキテクチャは一致する必要がありますか
? - カーネルはEFIモードで起動する必要があります。
ファームウェア設定ユーティリティ/BIOSでCSMが無効になっています。 - カーネルコマンドラインを介してカーネルのEFIランタイムサービスを無効にしないでください。つまり、noefiカーネルパラメータを使用しないでください。
cat /proc/cmdline | grep EFI
何も返さない - efivarfsファイルシステムは、/sys/firmware/efi/efivars
mount | grep efivars
returnにマウントする必要があります。none on /sys/firmware/efi/efivars type efivarfs (rw)
efivar -l
EFI変数はエラーなしでリストする必要があります。
このコマンドはエラーなしで82行を一覧表示します。- /sys/firmware/efi/efivars/dump-* ファイルがあることを確認してください。
ダンプファイルが存在しません。
~によると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で動作します。
OsInductionsを最初に削除しても改善されませんでした。
# 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(信頼できる)の既存のOsInductions efi変数を更新するには?
答え1
多数のファームウェアエラーが原因で非標準のUEFI変数を削除すると、システムファームウェアがPOSTを実行できなくなります。 エピワフよく知られている標準化変数でないファイルは、不変ファイルとして生成されます。
https://www.kernel.org/doc/Documentation/filesystems/efivarfs.txt
これは、次のコマンドで確認して変更できます。lsattrそしてシャテル注文する。
たとえば、
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#
答え2
関連する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
、ここで
var='/sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c'
ただし、各ファイルは/sys/firmware/efi/efivars
次に終了します。4バイトヘッダその後、データコンテンツがあります。したがって、printf "$str"
出力をefivarfs変数ファイルに書き込む前に、出力の前に4バイトのヘッダーを追加する必要があります$var
。上記のように、$str
これは次のように行うことができます。たとえば、次のようにします。$var
{ head -c 4 "$var"; printf "$str"; } > "$var"
答え3
echo
代わりに試してみてくださいcat
。
# echo 'enter-uefi-fw' > /sys/firmware/efi/vars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c/raw_var