จะเขียน / แก้ไข / อัพเดทตัวแปร OsIndications efi จากบรรทัดคำสั่งได้อย่างไร


9

ในความต้องการที่จะเข้าสู่ยูทิลิตี้การตั้งค่าเฟิร์มแวร์ UEFI ในขณะที่ใช้การบูตอย่างรวดเร็วเป็นพิเศษ (ไม่ได้โหลดไดรเวอร์คีย์บอร์ดระหว่าง POST) ฉันต้องการเขียนถึงตัวแปร efi "Os Indications" ระบบปฏิบัติการของฉันคือ Ubuntu 14.04 kernel 3.13.0-35-generic

OsIndications ตัวแปรส่งกลับ bitmask UINT64

OsIndicationsSupported ตัวแปรส่งกลับ bitmask UINT64

EFI_OS_INDICATIONS_BOOT_TO_FW_UIบิตสามารถตั้งค่าในตัวแปร OsIndicationsSupported โดยเฟิร์มถ้าขอเฟิร์มแวสนับสนุนระบบปฏิบัติการที่จะหยุดที่อินเตอร์เฟซที่ใช้เฟิร์มแว EFI_OS_INDICATIONS_BOOT_TO_FW_UIบิตสามารถตั้งค่าได้โดยระบบปฏิบัติการในตัวแปร OsIndications ถ้าปรารถนา OS สำหรับเฟิร์มที่จะหยุดที่อินเตอร์เฟซที่ใช้เฟิร์มในการบูตถัดไป

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ส่งผลให้ทุกประเภท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

ใช้ sysfs-efivars สูงสุด 1024 ไบต์เก่า

# 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คืนค่าเคอร์เนลCONFIG_EFI=y
  2. Kitness processor bitness / arch และ EFI processor bitness / arch ควรตรงกัน
    หรือไม่
  3. เคอร์เนลควรบูตในโหมด EFI
    CSM ถูกปิดใช้งานในยูทิลิตี้การตั้งค่าเฟิร์มแวร์ / BIOS
  4. ไม่ควรปิดใช้งานบริการ EFI รันไทม์ในเคอร์เนลผ่านเคอร์เนล cmdline เช่นไม่ควรใช้พารามิเตอร์เคอร์เนล noefi
    cat /proc/cmdline | grep EFIไม่มีอะไรคืน
  5. efivarfs ระบบแฟ้มควรจะติดตั้งที่ sys / / เฟิร์มแว / EFI / efivars
    mount | grep efivarsผลตอบแทนnone on /sys/firmware/efi/efivars type efivarfs (rw)
  6. efivar -lควรแสดงรายการตัวแปร EFI โดยไม่มีข้อผิดพลาด
    คำสั่งแสดงรายการ 82 บรรทัดและไม่มีข้อผิดพลาด
  7. ตรวจสอบการมีอยู่ของไฟล์ / sys / firmware / efi / efivars / dump- *
    ไม่มีไฟล์ดัมพ์อยู่

ตาม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คำสั่งควรจะทำงานใน 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

ฉันจะอัปเดตตัวแปร OsIndications efi ที่มีอยู่แล้วใน Ubuntu 14.04 (เชื่อถือได้) จากบรรทัดคำสั่งได้อย่างไร

คำตอบ:


1

เนื่องจากมีข้อบกพร่องของเฟิร์มแวร์จำนวนมากซึ่งการลบตัวแปร UEFI ที่ไม่ได้มาตรฐานทำให้เฟิร์มแวร์ระบบล้มเหลวในการโพสต์ ไฟล์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# 

1

รูปแบบ 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 $varไบต์ก่อนที่เราจะสามารถเขียนมันลงบนไฟล์ตัวแปร ด้วย$strและ$varตามข้างต้นสิ่งนี้สามารถทำได้เช่นการใช้:

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

0

ลองใช้แทนechocat

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

เคอร์เนลเอาต์พุต 3.13.0-35-generic และ 3.17.0-031700rc7-generic:-bash: echo: write error: Invalid argument
สำรองข้อมูล Pro

มองอย่างระมัดระวังมากขึ้นในรายการของสิ่งที่คุณพยายามที่มีคุณพยายาม: 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 ? สังเกตว่า '\' นำหน้าใน printf '\ x' ที่คุณตัดออกความจริงที่ว่าเราเติมเต็มทั้งค่าและ raw_var ที่ส่วนท้ายของเส้นทาง
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_varผลลัพธ์ใน-bash: printf: write error: Invalid argument
Backup Pro

คุณดาวน์โหลดpjones.fedorapeople.org/enter-uefi-fwก่อนใช้catคำสั่งหรือไม่
fragmede

ใช่ฉันได้ดาวน์โหลดไฟล์ข้อมูลป้อน-UEFI-FW และไฟล์ที่อยู่ในไดเรกทอรีที่ทำงานปัจจุบันของฉัน: ผลตอบแทน# ls -l enter-uefi-fw -rw-r--r-- 1 root root 2084 Aug 25 20:23 enter-uefi-fw
สำรองข้อมูล Pro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.