如何从命令行编写/编辑/更新OsIndications efi变量?


9

如果需要在使用超快速启动时输入UEFI固件设置实用程序(在POST过程中未加载键盘驱动程序),我希望写入“ Os Indications” efi变量。我的操作系统是Ubuntu 14.04内核3.13.0-35-generic。

OsIndications 变量返回一个UINT64位掩码

OsIndicationsSupported 变量返回一个UINT64位掩码

EFI_OS_INDICATIONS_BOOT_TO_FW_UI位可以在OsIndicationsSupported变量由固件设置,如果固件支持OS请求停止在固件的用户界面。EFI_OS_INDICATIONS_BOOT_TO_FW_UI如果操作系统希望固件在下次启动时停止在固件用户界面上,则可以由操作系统在OsIndications变量中设置该 位。

EFI_OS_INDICATIONS_BOOT_TO_FW_UI= 0x0000000000000001- 佩奇312 UEFI规范2.3.1C的

我的固件能够在下次启动时进入固件设置实用程序:

$ 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 Runtime Services支持应包含在内核
    $ cat /boot/config-$(uname -r) | grep CONFIG_EFI=y返回中CONFIG_EFI=y
  2. 内核处理器位/架构和EFI处理器位/架构应该匹配
    吗?
  3. 内核应以EFI模式引导
    固件设置实用程序/ BIOS中禁用了CSM
  4. 不应通过内核cmdline禁用内核中的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- *文件。
    那里没有转储文件。

根据https://ask.fedoraproject.org/en/question/8264/after-installing-fedora-i-cant-open-biosefi-setup/?answer=16402#post-id-16402cat 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变量?

Answers:


1

由于存在许多固件错误,在这些错误中,删除非标准UEFI变量会导致系统固件无法POST, 因此将不是众所周知的标准变量的efivarfs文件创建为不可变文件。

https://www.kernel.org/doc/Documentation/filesystems/efivarfs.txt

可以使用lsattrchattr命令进行验证和更改。

例如:

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"

printf "$str"上面的输出需要进入efivarfs变量文件的数据内容$var,其中

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

但是,每个文件都/sys/firmware/efi/efivars4字节的标头开头,然后是其数据内容。因此,printf "$str"在我们可以将输出写入efivarfs变量文件之前,需要在输出的前面加上4字节的标头$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-fwcat
fragmede 2014年

是的,我没有下载进入-UEFI-FW数据文件,该文件是我当前的工作目录:# ls -l enter-uefi-fw回报-rw-r--r-- 1 root root 2084 Aug 25 20:23 enter-uefi-fw
Pro Backup
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.