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

Каждое число (также называемый восьмеричным, потому что это - base8) в той группировке представляет 3 бита. Если Вы превращаете его в двоичный файл, это делает это намного легче.

1 = 0 0 1
3 = 0 1 1
5 = 1 0 1
7 = 1 1 1

Таким образом, если бы Вы сделали 1777, 3777, 5777, или 7777 Вы установили бы липкий бит, потому что третий столбец будет 1. Однако с 3 777, 5777, и 7777 Вы дополнительно устанавливаете другие биты (SUID для первого столбца и SGID для второго столбца).

С другой стороны любое другое число в том месте (максимум до 7) не установило бы липкий бит, потому что последний столбец не будет 1 или "на".

2 = 0 1 0
4 = 1 0 0
6 = 1 1 0

9
04.10.2014, 00:29
3 ответа

В связи с наличием многочисленных багов прошивки при удалении нестандартные переменные 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
27.01.2020, 20:08

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

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

Соответствующая 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"
1
27.01.2020, 20:08

Теги

Похожие вопросы