Як написати / редагувати / оновлювати змінну efi OsIndication з командного рядка?


9

У разі необхідності ввести утиліту налаштування прошивки UEFI під час використання надшвидкого завантаження (драйвери клавіатури не завантажуються під час POST), я хочу написати в змінну efi "Показання Os". Моя ОС - ядро ​​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:

Використання нових ефіварфів

# 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 в ядрі не слід відключати через cmdline ядра, тобто параметр ядра noefi не повинен використовуватися.
    cat /proc/cmdline | grep EFIнічого не повертає
  5. Файлову систему efivarfs слід встановлювати на
    mount | grep efivarsповерненнях / sys / firmware / efi / efivarsnone 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.

Перше видалення OsIndication не покращується

# 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

Як я можу оновити вже існуючу змінну efi OsIndication в Ubuntu 14.04 (надійний) з командного рядка?

Відповіді:


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"

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 output:-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команди?
fragmede

Так, я завантажив файл даних enter-uefi-fw, і цей файл знаходиться в моєму поточному робочому каталозі: # ls -l enter-uefi-fwповертається -rw-r--r-- 1 root root 2084 Aug 25 20:23 enter-uefi-fw.
резервне копіювання
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.