skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.

Как создать переменную UEFI и записать в неё строковое значение в Linux?

На компьютере установлен Gentoo Linux и Windows в dual-boot.

Загрузка систем выполняется в EFI-режиме. Загрузчиком по умолчанию выбран systemd-boot, в котором в свою очередь по умолчанию по истечению таймаута загружается Gentoo Linux.

Есть задача сделать возможность перезагрузки сразу в Windows без необходимости изменять выбор в systemd-boot.

Насколько я понял по документации, это можно сделать с помощью переменной LoaderEntryOneShot.

А вот записать значение auto-windows (детектируемый автоматически Windows Boot Manager) у меня пока не получилось.

Что пробовал:

# здесь и далее UUID сгенерирован рандомно с помощью uuidgen
# в файле /tmp/efivar-auto-windows лежит значение, которое я хотел записать в переменную
efivar -w -n 926b68c6-77da-4cf6-ba58-2f27df0f705d-LoaderEntryOneShot -f /tmp/efivar-auto-windows 
# efivar: Input/output error

echo "auto-windows" > /sys/firmware/efi/efivars/LoaderEntryOneShot-926b68c6-77da-4cf6-ba58-2f27df0f705d
# echo: write error: invalid argument


После различных экспериментов типа приведённых выше efivar -l начал отображать эту переменную, но содержимое всё равно, судя по всему, не записалось:
# efivar -p -n 926b68c6-77da-4cf6-ba58-2f27df0f705d-LoaderEntryOneShot                                                                                                                                                                                                      
GUID: 926b68c6-77da-4cf6-ba58-2f27df0f705d
Name: "LoaderEntryOneShot"
Attributes:
Value:


P.S. man efivar смотрел, но это одна из самых бессмысленных ман-страниц, что я видел.
  • Вопрос задан
  • 1238 просмотров
Решения вопроса 1
Что я почерпнул из документации и ссылок:
Наименование переменной должно быть
LoaderEntryOneShot-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f
- именно этот GUID ожидает загрузчик
С содержимым переменной сложнее - это бинарный файл.
Необходимо смонтировать файловую систему efivars mount -t efivarfs none /sys/firmware/efi/efivars
Бинарная структура файла следующая:
struct new_efi_variable {
u32 attributes;
u8 data[0];
};

Отсюда, первые 4 байта задают аттрибуты. Самые важные:
#define EFI_VARIABLE_NON_VOLATILE       0x00000001
#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002
#define EFI_VARIABLE_RUNTIME_ACCESS     0x00000004

Далее, должно идти значение вашей переменной auto-windows.

В итоге, полагаю, переменная создается так:
printf "\x07\x00\x00\x00\x61\x75\x74\x6f\x2d\x77\x69\x6e\x64\x6f\x77\x73" > LoaderEntryOneShot-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f


Попробуйте и поправьте, если я не угадал с решением.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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