Làm thế nào để viết / chỉnh sửa / cập nhật biến Osfif efi từ dòng lệnh?


9

Trong nhu cầu nhập tiện ích thiết lập chương trình cơ sở UEFI trong khi sử dụng khởi động cực nhanh (trình điều khiển bàn phím không được tải trong POST), tôi muốn ghi vào biến efi "Chỉ dẫn Os". Hệ điều hành của tôi là Ubuntu 14.04 kernel 3.13.0-35-generic.

OsIndications biến trả về một bitmask UINT64

OsIndicationsSupported biến trả về một bitmask UINT64

Các EFI_OS_INDICATIONS_BOOT_TO_FW_UIbit có thể được thiết lập trong biến OsIndicationsSupported bởi firmware, nếu các yêu cầu hỗ trợ firmware OS dừng lại ở một giao diện người dùng firmware. Các EFI_OS_INDICATIONS_BOOT_TO_FW_UIbit có thể được thiết lập bởi các hệ điều hành trong biến OsIndications, nếu mong muốn hệ điều hành cho các firmware để dừng lại ở một giao diện người dùng firmware trên khởi động tiếp theo.

EFI_OS_INDICATIONS_BOOT_TO_FW_UI= 0x0000000000000001- Trang 312 của UEFI spec 2.3.1C

Phần sụn của tôi có khả năng vào tiện ích thiết lập phần sụn ở lần khởi động tiếp theo:

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

Tôi có thể tạo một biến mới /sys/firmware/efi/efivarsbằng cách sử dụng

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

Tuy nhiên, việc ghi vào biến efi OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8cdẫn đến tất cả các loại write error: Invalid argument:

Sử dụng efivarf mới

# 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

Sử dụng sysfs-efivars cũ tối đa 1024 byte

# 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

Đã kiểm tra các yêu cầu để hỗ trợ biến UEFI hoạt động đúng

  1. Hỗ trợ dịch vụ thời gian chạy EFI sẽ có mặt trong
    $ cat /boot/config-$(uname -r) | grep CONFIG_EFI=ytrả về kernelCONFIG_EFI=y
  2. Độ cứng / vòm của bộ xử lý hạt nhân và độ cứng / vòm của bộ xử lý EFI có phù hợp
    ?
  3. Kernel nên được khởi động ở chế độ EFI
    CSM bị vô hiệu hóa trong tiện ích thiết lập Firmware / BIOS
  4. Các dịch vụ thời gian chạy EFI trong kernel không nên bị vô hiệu hóa thông qua cmdline kernel, tức là không nên sử dụng tham số kernel noefi.
    cat /proc/cmdline | grep EFItrả lại không có gì
  5. efivarfs hệ thống tập tin nên được gắn ở / sys / firmware / efi / efivars
    mount | grep efivarslợi nhuậnnone on /sys/firmware/efi/efivars type efivarfs (rw)
  6. efivar -lnên liệt kê các biến EFI mà không có bất kỳ lỗi nào
    Lệnh liệt kê 82 dòng và không có lỗi.
  7. Kiểm tra sự tồn tại của các tập tin / sys / firmware / efi / efivars / dump- *.
    Không có tập tin kết xuất tồn tại ở đó.

Theo https://ask.fedoraproject.org/en/question/8264/after-installing-fedora-i-cant-open-biosefi-setup/?answer=16402#post-id-16402 các cat enter-uefi-fw > /sys/firmware/efi/vars/new_varlệnh nên làm việc trong Fedora 17.

Lần đầu tiên xóa các nội dung không cải thiện

# 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

Làm cách nào tôi có thể cập nhật biến efi OsIndifying đã có trong Ubuntu 14.04 (đáng tin cậy) từ dòng lệnh?

Câu trả lời:


1

Do có nhiều lỗi phần sụn trong đó việc loại bỏ các biến UEFI không chuẩn khiến phần sụn hệ thống không thể POST, các tệp efivarfs không phải là biến tiêu chuẩn nổi tiếng được tạo thành tệp bất biến.

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

Điều này có thể được xác minh và thay đổi với các lệnh lsattrchattr .

Ví dụ:

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

Mặt nạ 64 bit có liên quan ở đây là:

  #define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001

Điều này có thể được sản xuất dưới dạng chuỗi định dạng nhỏ (Intel) bằng cách sử dụng:

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

Đầu ra printf "$str"ở trên cần đi vào nội dung dữ liệu của tệp biến efivarfs $var, trong đó

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

Tuy nhiên, mỗi tệp /sys/firmware/efi/efivarsbắt đầu bằng tiêu đề 4 byte và sau đó được theo sau bởi nội dung dữ liệu của nó. Do đó, đầu ra của printf "$str"nhu cầu phải được thêm tiền tố với tiêu đề 4 byte trước khi chúng ta có thể ghi nó vào tệp biến efivarfs $var. Với $str$varnhư trên, điều này có thể được thực hiện, ví dụ, bằng cách sử dụng:

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

0

Hãy thử sử dụng echothay vì cat.

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

kernel 3.13.0-35-generic và 3.17.0-031700rc7-generic output:-bash: echo: write error: Invalid argument
Pro Backup

Nhìn kỹ hơn vào danh sách những điều bạn đã thử, bạn đã thử 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 chưa? lưu ý '\' hàng đầu trong printf '\ x' mà bạn đã bỏ qua, thực tế là chúng tôi đang điền vào toàn bộ giá trị và raw_var ở cuối đường dẫn.
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_varkết quả trong-bash: printf: write error: Invalid argument
Sao lưu chuyên nghiệp

Bạn đã tải xuống pjones.fedorap People.org/enter-uefi-fw trước khi chạy catlệnh?
Fragmede

Có, tôi đã tải xuống tệp dữ liệu enter-uefi-fw và tệp đó nằm trong thư mục làm việc hiện tại của tôi: # ls -l enter-uefi-fwreturn -rw-r--r-- 1 root root 2084 Aug 25 20:23 enter-uefi-fw.
Sao lưu chuyên nghiệp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.