Каждое число (также называемый восьмеричным, потому что это - 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
В связи с наличием многочисленных багов прошивки при удалении нестандартные переменные 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#
Попробуйте использовать echo
вместо cat
.
# echo 'enter-uefi-fw' > /sys/firmware/efi/vars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c/raw_var
Соответствующая 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"