Как написать / отредактировать / обновить переменную OsIndications efi из командной строки?

9

При необходимости войти в утилиту настройки прошивки UEFI при использовании сверхбыстрой загрузки (драйверы клавиатуры не загружаются во время POST), я хочу записать в переменную efi «Os Indications». Моя ОС - Ubuntu 14.04, ядро ​​3.13.0-35-generic.

OsIndications переменная возвращает битовую маску UINT64

OsIndicationsSupported переменная возвращает битовую маску UINT64

EFI_OS_INDICATIONS_BOOT_TO_FW_UIБит может быть установлен в переменной OsIndicationsSupported прошивкой, если запросы микропрограмм поддерживает ОС останавливаться на пользовательском интерфейсе прошивки. EFI_OS_INDICATIONS_BOOT_TO_FW_UIБит может быть установлен в ОС в переменной OsIndications, если желания OS для прошивки останавливаться на пользовательском интерфейсе прошивки на следующей загрузке.

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.
    CSM отключен в утилите настройки прошивки / BIOS
  4. Службы времени выполнения EFI в ядре не должны быть отключены через cmdline ядра, т.е. параметр ядра noefi не должен использоваться.
    cat /proc/cmdline | grep EFIничего не возвращает
  5. efivarfs файловая система должна быть установлена в / SYS / прошивки / 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

Как я могу обновить уже существующую переменную OsIndications efi в Ubuntu 14.04 (trusty) из командной строки?

Pro Backup
источник

Ответы:

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"

Вывод printf "$str"вышеупомянутого должен идти в содержимое данных файла переменной efivarfs $var, где

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

Однако каждый файл /sys/firmware/efi/efivarsначинается с 4-байтового заголовка, а затем следует его содержимое данных. Следовательно, перед выводом команды printf "$str"необходимо указать 4-байтовый заголовок, прежде чем мы сможем записать его в файл переменной efivarfs $var. С помощью $strи $varкак указано выше, это можно сделать, например, используя:

  { head -c 4 "$var"; printf "$str"; } > "$var"
adgadg
источник
0

Попробуйте использовать echoвместо cat.

# echo 'enter-uefi-fw' > /sys/firmware/efi/vars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c/raw_var
fragmede
источник
выходные данные ядра 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
# 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команды?
фрагмент
Да, я загрузил файл данных enter-uefi-fw, и этот файл находится в моем текущем рабочем каталоге: # ls -l enter-uefi-fwвозвращает -rw-r--r-- 1 root root 2084 Aug 25 20:23 enter-uefi-fw.
Pro Backup