Bagaimana cara menulis / mengedit / memperbarui variabel efi OsIndikasi dari baris perintah?


9

Dalam kebutuhan untuk memasuki utilitas pengaturan firmware UEFI saat menggunakan boot ultra cepat (driver keyboard tidak dimuat selama POST), saya ingin menulis ke variabel efi "Indikasi Induk". OS saya adalah Ubuntu 14.04 kernel 3.13.0-35-generik.

OsIndications variabel mengembalikan bitmask UINT64

OsIndicationsSupported variabel mengembalikan bitmask UINT64

The EFI_OS_INDICATIONS_BOOT_TO_FW_UIbit dapat diatur dalam variabel OsIndicationsSupported oleh firmware, jika permintaan dukungan firmware OS untuk berhenti di sebuah antarmuka firmware pengguna. The EFI_OS_INDICATIONS_BOOT_TO_FW_UIbit dapat diatur oleh OS dalam variabel OsIndications, jika keinginan OS untuk firmware untuk berhenti di sebuah antarmuka firmware pengguna pada boot berikutnya.

EFI_OS_INDICATIONS_BOOT_TO_FW_UI= 0x0000000000000001- Halaman 312 dari UEFI spec 2.3.1C

Firmware saya memiliki kemampuan untuk masuk ke utilitas pengaturan firmware saat boot berikutnya:

$ hexdump /sys/firmware/efi/vars/OsIndicationsSupported-8be4df61-93ca-11d2-aa0d-00e098032b8c/data
0000000 0001 0000 0000 0000
0000008

Saya dapat membuat variabel baru tentang /sys/firmware/efi/efivarspenggunaan

$ printf\x07\x00\x00\x00\x00" > myvar-12345678-1234-1234-1234-123456789abc

Namun menulis ke variabel efi OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8cmenghasilkan segala macam write error: Invalid argument:

Menggunakan efivarf baru

# 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

Menggunakan sysfs-efirar maksimum 1024 byte lama

# 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

Memeriksa persyaratan untuk dukungan variabel UEFI agar berfungsi dengan benar

  1. Dukungan Layanan Runtime EFI harus ada dalam
    $ cat /boot/config-$(uname -r) | grep CONFIG_EFI=ypengembalian kernelCONFIG_EFI=y
  2. Bitness / arch prosesor Kernel dan bitness / arch prosesor EFI harus cocok
    ?
  3. Kernel harus di-boot dalam mode EFI
    CSM dinonaktifkan di utilitas pengaturan Firmware / BIOS
  4. Layanan runtime EFI di kernel tidak boleh dinonaktifkan melalui cmdline kernel, yaitu parameter kernel noefi tidak boleh digunakan.
    cat /proc/cmdline | grep EFItidak mengembalikan apa pun
  5. filesystem efivarfs harus dipasang di / sys / firmware / efi / efivars
    mount | grep efivarspengembaliannone on /sys/firmware/efi/efivars type efivarfs (rw)
  6. efivar -lharus mencantumkan Variabel EFI tanpa kesalahan
    . Perintah ini mencantumkan 82 baris dan tidak ada kesalahan.
  7. Periksa keberadaan file / sys / firmware / efi / efivars / dump- *.
    Tidak ada file dump di sana.

Menurut https://ask.fedoraproject.org/en/question/8264/after-installing-fedora-i-cant-open-biosefi-setup/?answer=16402#post-id-16402 yang cat enter-uefi-fw > /sys/firmware/efi/vars/new_varperintah harus bekerja di Fedora 17.

Menghapus OsIndikasi pertama tidak membaik

# 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

Bagaimana saya bisa memutakhirkan variabel efIndikasi OsIndikasi yang sudah ada di Ubuntu 14.04 (trusty) dari baris perintah?

Jawaban:


1

Karena adanya banyak bug firmware di mana menghapus variabel UEFI non-standar menyebabkan firmware sistem gagal untuk POST, file efivarfs yang tidak dikenal variabel standar dibuat sebagai file yang tidak dapat diubah.

https://www.kernel.org/doc/Documentation/filesystems/efivarfs.txt

Ini dapat diverifikasi dan diubah dengan lsattr dan chattr .

Sebagai contoh:

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

Topeng 64-bit yang relevan di sini adalah:

  #define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001

Ini dapat diproduksi sebagai string format little-endian (Intel) menggunakan:

  str='\x01\x00\x00\x00\x00\x00\x00\x00'; printf "$str"

Output di printf "$str"atas perlu masuk ke isi data dari file variabel efivarfs $var, di mana

  var='/sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c'

Namun, setiap file /sys/firmware/efi/efivarsdimulai dengan header 4-byte dan kemudian diikuti oleh konten datanya. Oleh karena itu, output dari printf "$str"kebutuhan untuk diawali dengan header 4-byte sebelum kita dapat menuliskannya pada file variabel efivarfs $var. Dengan $strdan $varseperti di atas, ini dapat dilakukan, misalnya menggunakan:

  { head -c 4 "$var"; printf "$str"; } > "$var"

0

Coba gunakan echosebagai ganti cat.

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

kernel 3.13.0-35-generik dan 3.17.0-031700rc7-generik output:-bash: echo: write error: Invalid argument
Pro Backup

Melihat lebih cermat pada daftar hal yang Anda coba, sudahkah Anda mencoba 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 :? perhatikan '\' di printf '\ x' terkemuka yang Anda abaikan, fakta bahwa kami mengisi seluruh nilai, dan raw_var di ujung jalan.
Fragmede

# 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_varhasil dalam-bash: printf: write error: Invalid argument
Pencadangan Pro

Apakah Anda mengunduh pjones.fedorapeople.org/enter-uefi-fw sebelum menjalankan catperintah?
Fragmede

Ya, saya memang mengunduh file data enter-uefi-fw, dan file itu ada di direktori kerja saya saat ini: # ls -l enter-uefi-fwkembali -rw-r--r-- 1 root root 2084 Aug 25 20:23 enter-uefi-fw.
Pro Backup
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.