web-dev-qa-db-ja.com

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

超高速ブート(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_が生成されます。

新しい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変数を更新するにはどうすればよいですか(信頼できる)。

9
Pro Backup

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

ここで関連する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"
1
adgadg

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

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