コマンドラインからOsIndications efi変数を書き込む/編集/更新する方法は?


9

超高速ブート(POST中にキーボードドライバーが読み込まれない)を使用しているときにUEFIファームウェアセットアップユーティリティを起動する必要がある場合は、 "Os Indications" efi変数に書き込みます。私のOSはUbuntu 14.04カーネル3.13.0-35-genericです。

OsIndications 変数はUINT64ビットマスクを返します

OsIndicationsSupported 変数はUINT64ビットマスクを返します

EFI_OS_INDICATIONS_BOOT_TO_FW_UIファームウェアは、ファームウェアのユーザーインタフェースで停止するOSの要求をサポートしている場合のビットは、ファームウェアによってOsIndicationsSupported変数に設定することができます。 EFI_OS_INDICATIONS_BOOT_TO_FW_UIOSは、次の起動時にファームウェアのユーザー・インターフェースで停止するファームウェアのために望む場合ビットは、OsIndications変数にOSによって設定することができます。

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

新しいefivarfsの使用

# 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変数サポートが正しく機能するための要件を確認しました

  1. EFIランタイムサービスのサポートがカーネル
    $ cat /boot/config-$(uname -r) | grep CONFIG_EFI=yリターンに存在する必要がありますCONFIG_EFI=y
  2. カーネルプロセッサのビット数/アーチとEFIプロセッサのビット数/アーチは一致する必要があり
    ますか?
  3. カーネルはEFIモードで起動する必要があります
    CSMはファームウェアセットアップユーティリティ/ BIOSで無効になっています
  4. カーネルのEFIランタイムサービスは、カーネルコマンドラインで無効にしないでください。つまり、noefiカーネルパラメータを使用しないでください。
    cat /proc/cmdline | grep EFI何も返さない
  5. efivarfsファイルシステムは/ sys / firmware / efi / efivarsにマウントする必要があり
    mount | grep efivarsますnone on /sys/firmware/efi/efivars type efivarfs (rw)
  6. efivar -lエラーなしでEFI変数をリストするはずです
    コマンドは82行をリストし、エラーはありません。
  7. / sys / firmware / efi / efivars / dump- *ファイルの存在を確認します。
    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。

最初にOsIndicationsを削除しても改善されない

# 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変数を更新するにはどうすればよいですか?

回答:


1

非標準の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# 

1

ここでの関連する64ビットマスクは次のとおりです。

  #define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001

これは、以下を使用してリトルエンディアン(Intel)形式の文字列として生成できます。

  str='\x01\x00\x00\x00\x00\x00\x00\x00'; printf "$str"

上記の出力は、efivarfs変数ファイルのデータコンテンツprintf "$str"入る必要があります。$var

  var='/sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c'

ただし、の各ファイルは4バイトのヘッダー/sys/firmware/efi/efivars始まり、その後にデータの内容が続きます。したがって、efivarfs変数ファイルに書き込む前に、4バイトのヘッダーを前に付ける必要があります。し、上記のように、これは使用して、例えば、行うことができます。printf "$str"$var$str$var

  { head -c 4 "$var"; printf "$str"; } > "$var"

0

echo代わりに使用してみてくださいcat

# echo 'enter-uefi-fw' > /sys/firmware/efi/vars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c/raw_var

カーネル3.13.0-35-genericおよび3.17.0-031700rc7-generic出力:-bash: echo: write error: Invalid argument
Pro Backup

あなたが試したことのリストをもっと注意深く見て、あなたは試しました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 か?省略したprintf '\ x'の先頭の '\'、値全体を入力していること、およびパスの最後にraw_varがあることに注意してください。
fragmede 2014年

# 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
Pro Backup

コマンドを実行する前に、pjones.fedorapeople.org / enter-uefi-fwをダウンロードしましたcatか?
fragmede 2014年

はい、enter-uefi-fwデータファイルをダウンロードしました。そのファイルは現在の作業ディレクトリにあり# ls -l enter-uefi-fwます-rw-r--r-- 1 root root 2084 Aug 25 20:23 enter-uefi-fw
プロバックアップ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.