Как написать / отредактировать / обновить переменную 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 
  • UEFI загружает Fedora с USB 2.0 на 3.0-порт (l75d-a7280)
  • Невозможно загрузить в Windows после обновления таблицы разделов загрузки
  • Двойная загрузка Linux Mint в жестком диске стиля GPT вместе с Windows 8
  • Копирование установки, отличной от EFI / GPT, к установке EFI / GPT
  • Debian 8 Jessie EFI dualboot Windows 8.1
  • Черный экран после GRUB
  • arch Linux загружается в командной строке grub
  • Изменение размера раздела ESP / boot / efi
  • Когда мне нужно указать add_efi_memmap в качестве аргумента ядра в загрузке UEFI / EFI?
  • Как создать загрузочную флешку для «efi-shell»
  • Как я могу получить новую версию Fedora 19 для загрузки на Intel NUC
  • Interesting Posts

    Как я могу скопировать структуру папок с одного сервера на другой, сохраняя того же владельца и разрешения?

    Внешний жесткий диск не будет гореть во время загрузки

    Как эмулировать возвращаемые произвольные значения из функций оболочки?

    Правило IPTABLES для разделения пользователей

    Попросите определенные ключи пройти через lockscreen

    Как заменить уродливый шрифт «ПК» в Linux boot CLI?

    Предварительный просмотр миниатюр вторичного дисплея на основном дисплее?

    Общий раздел подкачки FreeBSD с Linux

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

    Что делать, когда ubuntu-vm-builder завершен?

    Разрешения на доступ к файлу дампа FreeBSD

    содержание grep между двумя стартовыми скобками

    Можно ли скопировать / etc / sysconfig / iptables на другую машину?

    Как передать ряд шаблонов в awk из сценария оболочки?

    Очистить неиспользуемое пространство с нулями (ext3, ext4)

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