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

При необходимости использования утилиты для настройки прошивки 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, если ОС желает, чтобы прошивка остановилась в пользовательском интерфейсе прошивки при следующей загрузке.

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 приводит к 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 $ cat /boot/config-$(uname -r) | grep CONFIG_EFI=y возвращает CONFIG_EFI=y
  2. Ядро процессора / бит дуги процессора и EFI бит должно соответствовать
    ?
  3. Ядро должно загружаться в режиме EFI
    CSM отключен в утилите настройки прошивки / BIOS
  4. Службы среды EFI в ядре не должны быть отключены с помощью cmdline ядра, то есть параметр noefi kernel не должен использоваться.
    cat /proc/cmdline | grep EFI cat /proc/cmdline | grep EFI ничего не возвращает
  5. Файловая система efivarfs должна быть установлена ​​в / sys / firmware / efi / efivars
    mount | grep efivars mount | grep efivars возвращает none on /sys/firmware/efi/efivars type efivarfs (rw)
  6. efivar -l должен перечислить переменные EFI без какой-либо ошибки
    Команда перечисляет 82 строки и ошибок.
  7. Проверьте наличие / sys / firmware / efi / efivars / dump- * files.
    Там нет дампов.

Согласно https://ask.fedoraproject.org/en/question/8264/after-installing-fedora-i-cant-open-biosefi-setup/?answer=16402#post-id-16402 cat 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 

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

3 Solutions collect form web for “Как написать / отредактировать / обновить переменную eIi OsIndications из командной строки?”

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

Соответствующая 64-битная маска здесь:

  #define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001 

Это может быть сделано в виде строки типа little-endian (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" 

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

 # echo 'enter-uefi-fw' > /sys/firmware/efi/vars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c/raw_var 
  • Не удается пройти EFI для установки RHEL на сервер HP Itanium
  • Как остановить grub от возиться с моим разделом EFI?
  • Предупреждение! Корневой диск не существует после элементарной установки
  • Двойная загрузка с SSD в слоте оптического дисковода
  • Как построить таблицу разделов только для GPT в Linux?
  • Почему прошивка uEFI не может получить доступ к файлу RAID 1 / boot / efi?
  • EFI grub исчез, как вернуть его?
  • Нужно ли устанавливать загрузчик?
  • Двойная установка загрузки не имеет эффекта (без GRUB), Boot-Repair не помогает
  • Обновление ядра для Linux-системы без обновления пользовательских приложений / библиотек?
  • Как установить GRUB с двойной загрузкой в ​​режиме Legacy?
  • Interesting Posts

    mkfifo, файловые дескрипторы и ImageMagick (конвертировать)

    Почему echo "bar" -n отличается от echo -n "bar"?

    zsh: отключить «файл существует:» предупреждение с перенаправлением

    динамически созданный файл журнала в screenrc, показанный в hardstatus

    Разница размеров между изо-файлом, сгоревшим на компакт-диск, и файлом, полученным с помощью dd

    Где в Apache 2 вы устанавливаете директиву ServerName глобально?

    Установка нескольких мониторов Mint Linux с выпуском Nvidia Quadro K3000M

    Возможно ли, что у вас есть оболочка входа, которая не является интерактивной?

    Ошибка инициализации поддержки USB: Другая ошибка

    Как я должен отправлять журналы systemd на выделенный сервер протоколирования

    Как напечатать имя отсутствующих файлов в папке?

    grep из текстового файла с разделителями и включить его в другую команду

    Ручная установка библиотек для кросс-компиляции

    Как я могу перечислить все сокеты, которые открыты для удаленных компьютеров?

    cron.hourly «выходит с кодом возврата 1» нет вывода в файл журнала

    Linux и Unix - лучшая ОС в мире.