Boot-Loader

告訴/驗證引導載入程序的屬性

  • February 9, 2021

鑑於我們有一個帶有 GRUB 引導載入程序的 U 盤,如何判斷(從 Linux 命令行)

  • 是否是 UEFI?
  • 是否是安全啟動和驗證呢?

至於研究,有創建此類載入器的指南,但是,我找不到如何講述現有載入器。

如果您在 USB 記憶棒上看到一個分區,其根目錄包含一個名為EFIor的子目錄efi(UEFI 應該對文件名不區分大小寫),那麼它可能是 UEFI 可引導的。理想情況下,該分區應該有一個 FAT32 文件系統,但一些 UEFI 韌體也將支持其他文件系統類型,如 ISO9660、NTFS 或 HFS+。

在可移動媒體上,64 位 x86 硬體的實際 UEFI 引導載入程序將是 path 中的文件<partition root>/efi/boot/bootx64.efi。這實際上是可移動媒體引導載入程序的標準路徑名。在永久作業系統安裝上,引導載入程序路徑名將改為<partition root>/efi/<OS vendor or Linux distribution name>/<something>.efi. 作業系統安裝程序會將此路徑名儲存到 UEFI NVRAM 引導變數中,該變數類似於 BIOS 設置,但實際上具有標準化介面,允許作業系統在執行時對其進行查詢和操作。

在 Linux 中,efibootmgr -v命令是顯示 UEFI NVRAM 引導變數的一種方式;bootloader的bootctl命令systemd-boot也會顯示一些引導變數資訊。

可移動媒體可能同時是 BIOS 可引導和 UEFI 可引導的。在這種情況下,它將包括兩個引導載入程序:一個嵌入在 MBR 中的 BIOS 兼容引導載入程序(可能是 SYSLINUX),以及一個如上所述的 UEFI 兼容引導載入程序。

如果你使用file命令來辨識.efi文件的類型,它會這樣說:

# file bootx64.efi 
bootx64.efi: PE32+ executable (EFI application) x86-64 (stripped to external PDB), for MS Windows

換句話說,UEFI 引導載入程序使用與 Microsoft Windows 相同的執行檔格式。PE32+ 是 64 位可執行格式;如果您看到 32 位 UEFI 實現,它可能使用 32 位 PE32 格式(不帶+符號)。

注意:UEFI 支持多種硬體架構。一些 ARM 系統也可能使用 UEFI。

安全啟動是 UEFI 的一個子集。非 UEFI 引導載入程序不能與安全引導兼容。要查看.efi文件是否嵌入了安全啟動簽名,您可以使用pesign -S -i filename.efi.

# pesign -S -i bootx64.efi 
---------------------------------------------
certificate address is 0x7fb0f0f8dd80
Content was not encrypted.
Content is detached; signature cannot be verified.
The signer's common name is Microsoft Windows UEFI Driver Publisher
No signer email address.
No signing time included.
There were certs or crls included.
---------------------------------------------

如果不存在安全啟動簽名,則輸出將如下所示:

# pesign -S -i ipxe.efi 
No signatures found.

由於微軟的簽名證書包含在市場上大多數 UEFI PC 的安全啟動韌體中,並且微軟還為其他人提供了 UEFI 引導載入程序簽名服務,因此您在兼容安全引導的 Linux 引導載入程序上找到的最常見的簽名可能是微軟的。

如果帶有 GRUB 的可移動媒體與安全引導兼容,則實際<partition root>/efi/boot/bootx64.efi文件很可能是shim pre-loader。在安全啟動系統上的永久 Linux 安裝中,您會發現 shim 預載入器shimx64.efi。它可以為分發維護者自己的簽名證書添加安全啟動支持,也可以選擇為系統所有者自己的證書(稱為 MOK = Machine Owner’s Key)添加安全啟動支持。這是一個不幸的必要性,因為並非所有 UEFI 韌體實現都允許以任何簡單的方式自定義韌體中包含的安全啟動密鑰。

添加其證書後,shim 預載入程序將載入實際的引導載入程序,grubx64.efi在同一目錄中命名。(從技術上講,它實際上不必是 GRUB;這只是程式到 shim 預載入器中的預設文件名。)該文件也必須簽名,但它可能使用分發維護者自己的證書而不是 Microsoft 的證書進行簽名。

這樣做的目的是允許發行版維護者根據需要輕鬆打包和發布 GRUB 的更新版本,因為它們現在可以使用發行版維護者自己的密鑰進行簽名。如果需要更新 shim 預載入器,分發維護者將需要聯繫 Microsoft 以重新簽署更新的 shim。

引用自:https://unix.stackexchange.com/questions/633485