OsIndications efi değişkenini komut satırından yazma / düzenleme / güncelleme


9

Ultra hızlı önyükleme (UST sırasında klavye sürücüleri yüklenmez) kullanırken UEFI ürün yazılımı kurulum yardımcı programına girmeniz gerektiğinde, "Os Endikasyonları" efi değişkenine yazmak istiyorum. İşletim sistemim Ubuntu 14.04 çekirdeği 3.13.0-35-jenerik.

OsIndications değişkeni bir UINT64 bitmask döndürür

OsIndicationsSupported değişkeni bir UINT64 bitmask döndürür

EFI_OS_INDICATIONS_BOOT_TO_FW_UIFirmware destekleri OS istekleri firmware kullanıcı arayüzü durmak eğer biraz yazılımlar ile OsIndicationsSupported değişkeninde ayarlanabilir. EFI_OS_INDICATIONS_BOOT_TO_FW_UIFirmware için OS arzuları sonraki açılışta bir firmware kullanıcı arayüzü durmak eğer biraz OsIndications değişkeninde işletim sistemi tarafından ayarlanabilir.

EFI_OS_INDICATIONS_BOOT_TO_FW_UI= 0x0000000000000001- Sayfa 312, UEFI spec 2.3.1C

Ürün yazılımım sonraki önyüklemede ürün yazılımı kurulum yardımcı programına girme yeteneğine sahiptir:

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

/sys/firmware/efi/efivarsKullanarak yeni bir değişken oluşturabilirim

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

Ancak efi değişkenine yazmak OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8cher türlü sonuçla sonuçlanır write error: Invalid argument:

Yeni efivarflar kullanma

# 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

Eski 1024 baytlık maksimum sysfs-efivars kullanma

# 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 değişkenleri desteğinin düzgün çalışması için gereksinimler kontrol edildi

  1. Çekirdek
    $ cat /boot/config-$(uname -r) | grep CONFIG_EFI=yiadelerinde EFI Çalışma Zamanı Hizmetleri desteği bulunmalıdırCONFIG_EFI=y
  2. Çekirdek işlemci bit / arch ve EFI işlemci bitness / arch eşleşmelidir
    ?
  3. Çekirdek EFI modunda önyüklenmelidir
    CSM, Firmware kurulum yardımcı programında / BIOS'ta devre dışı bırakıldı
  4. Çekirdekteki EFI çalışma zamanı hizmetleri, çekirdek cmdline'ı üzerinden devre dışı bırakılmamalıdır, yani noefi çekirdek parametresi kullanılmamalıdır.
    cat /proc/cmdline | grep EFIhiçbir şey döndürmez
  5. efivarfs dosya sistemi / sys / firmware / efi / efivars
    mount | grep efivarsreturn dizinine eklenmelidirnone on /sys/firmware/efi/efivars type efivarfs (rw)
  6. efivar -lEFI Değişkenlerini hatasız olarak
    listelemelidir. Komut 82 satırı listeler ve hata içermez.
  7. / Sys / firmware / efi / efivars / dump- * dosyalarının varlığını kontrol edin.
    Orada döküm dosyası yok.

Göre https://ask.fedoraproject.org/en/question/8264/after-installing-fedora-i-cant-open-biosefi-setup/?answer=16402#post-id-16402cat enter-uefi-fw > /sys/firmware/efi/vars/new_var komut Fedora'da çalışmalıdır 17.

İlk OsIndications'ı silmek düzelmez

# 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

Ubuntu 14.04'te (güvenilir) zaten mevcut olan OsIndications efi değişkenini komut satırından nasıl güncelleyebilirim?

Yanıtlar:


1

Standart olmayan UEFI değişkenlerinin kaldırılmasının sistem belleniminin POST'a başarısız olmasına neden olduğu çok sayıda bellenim hatası nedeniyle, iyi bilinen standartlaştırılmış değişkenler olmayan efivarfs dosyaları değişmez dosyalar olarak oluşturulur.

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

Bu, lsattr ve chattr komutlarıyla doğrulanabilir ve değiştirilebilir .

Örneğin:

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

Burada ilgili 64 bit maske:

  #define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001

Bu, aşağıdakiler kullanılarak küçük endian (Intel) biçim dizesi olarak üretilebilir:

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

Yukarıdakilerin çıktısının efivarfs değişken dosyasının veri içeriğineprintf "$str" girmesi gerekir ;$var

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

Ancak, içindeki her dosya 4 baytlık bir başlık/sys/firmware/efi/efivars ile başlar ve ardından veri içeriği gelir. Bu nedenle, efivarfs değişken dosyasına yazmadan önce çıktıların 4 bayt üstbilgisi ile ön ekine alınması gerekir . İle ve bu yapılabilir, yukarıdaki gibi, örneğin kullanarak:printf "$str"$var$str$var

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

0

echoBunun yerine kullanmayı deneyin cat.

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

çekirdek 3.13.0-35-jenerik ve 3.17.0-031700rc7-jenerik çıkış:-bash: echo: write error: Invalid argument
Pro Backup

Denediğiniz şeylerin listesine daha dikkatli bakarak, denediniz 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 mi? atladığınız printf '\ x' içindeki önde gelen '\' işaretini, tüm değeri doldurduğumuzu ve yolun sonundaki raw_var değerini not edin.
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_varsonuçları-bash: printf: write error: Invalid argument
Pro Backup

Komutu çalıştırmadan önce pjones.fedorapeople.org/enter-uefi-fw dosyasını indirdinizcat mi?
fragmede

Evet, enter-uefi-fw veri dosyasını indirdim ve bu dosya geçerli çalışma dizinimde: # ls -l enter-uefi-fwdöner -rw-r--r-- 1 root root 2084 Aug 25 20:23 enter-uefi-fw.
Pro Backup
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.