顯示磁碟或分區是 BIOS 可引導還是 UEFI 可引導
我有一個筆式驅動器或磁碟,可以通過以下方式訪問
/dev/sda
並且分區在
/dev/sda1 /dev/sda2 /dev/sda...
我想知道磁碟本身和每個分區:
- 它是經典可啟動的(BIOS 啟動模式/UEFI 之前)(我認為使用了 MBR)
- 它是 UEFI 可引導的嗎(我認為那時沒有使用 MBR)
- 以上都不是
- 以上兩者
我知道有 fdisk 但它不支持 GPT 所以我不能將它用於 GPT 磁碟。並且 parted 只顯示“啟動”標誌,但它不知道它是 BIOS 可啟動還是 UEFI 可啟動。
我知道這項任務不會那麼難,因為每個現代 BIOS 都可以列出可啟動設備,並且它還顯示它是否是 UEFI。
如果磁碟的第一個 512 字節塊(塊 #0)的最後兩個字節是 0x55 和 0xaa,則磁碟是可引導的 BIOS 樣式。如果這是真的,那麼 BIOS 韌體將假定該塊包含有效的主引導記錄 (MBR) 並將嘗試執行它。前 446 個字節左右應該包含 x86 處理器在 16 位 8086 兼容模式下的可執行程式碼。
# dd if=/dev/sda bs=512 count=1 2>/dev/null | od -t x1z -A x | tail -2 0001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa >..............U.< 000200
除此之外的任何事情都取決於 MBR 程式碼的作用:大多數標準 Microsoft MBR 將查找已標記為活動的主分區,並將繼續載入並執行該分區的第一個塊。但是另一個像 GRUB 這樣的引導載入程序可以完全忽略分區標誌,並在需要時做一些完全不同的事情。
如果可移動媒體包含 UEFI 韌體可辨識的文件系統(該規範最初要求使用特定版本的 FAT32,但它也擴展為涵蓋 FAT12 和 FAT16;此外,韌體實現可以自由添加支持其他文件系統類型),文件系統有一個名為
EFI
(不區分大小寫)的目錄,該目錄有一個名為 的子目錄boot
,並且該子目錄有一個引導載入程序文件(*.efi
),其名稱特定於系統架構。或者換句話說,以從特定文件系統的根開始的 Windows 風格的絕對路徑表示:
\EFI\boot\bootx64.efi
適用於 64 位 x86 系統\EFI\boot\bootia32.efi
適用於 32 位 x86 系統(一些迷你筆記型電腦和舊 x86 Mac)\EFI\boot\bootia64.efi
用於 Intel Itanium 系統(主要是執行某些版本的 Windows、HP-UX 或 OpenVMS 的伺服器)\EFI\boot\bootarm.efi
適用於帶有 UEFI 韌體的 32 位 ARM 處理器\EFI\boot\bootaa64.efi
適用於帶有 UEFI 韌體的 64 位 ARM 處理器\EFI\boot\bootriscvNN.efi
適用於具有 UEFI 韌體的 32、64 和 128 位 RISC-V 處理器(NN
分別可以是 32、64 或 128)- …隨著 UEFI 韌體針對新的處理器架構實施,此列表可以擴展。
如果磁碟具有 GPT 分區表,則包含 UEFI 引導載入程序的分區的分區類型 GUID 應為
C12A7328-F81F-11D2-BA4B-00A0C93EC93B
,將其標識為EFI 系統分區或簡稱 ESP。任何帶有 UEFI 韌體的系統都應該支持 GPT 分區。如果磁碟具有 MBR 分區表,則包含 UEFI 引導載入程序的分區應具有 MBR 分區類型程式碼
0xef
… 但這不是嚴格要求。不可移動磁碟可以在不同的路徑中包含其他 UEFI 引導載入程序,因為已安裝作業系統的引導載入程序路徑名將儲存在用於保存其他 UEFI 韌體設置的同一非易失性記憶體中。這些應該放在 ESP 分區中,在目錄的供應商特定子目錄中
\EFI
。在 Linux 中以 root 身份使用efibootmgr -v
以查看 UEFI 引導載入程序路徑名和相關的引導設置。不可移動磁碟也可以在上面為可移動媒體指定的固定路徑之一中包含 UEFI 引導載入程序文件:這稱為備用引導載入程序路徑,並且可以在非易失性記憶體設置失去時使用。
bootmgfw.efi
預設情況下,Windows 會像這樣放置它的副本;除非您特別要求,否則 Linux 發行版的安裝程序通常不會這樣做。由於 ESP 經常(但不總是)安裝
/boot/efi/
在 Linux 中,您會發現例如 RHEL 的 Secure Boot shim bootloader/boot/efi/EFI/redhat/shimx64.efi
和實際的 GRUB 在/boot/efi/EFI/redhat/grubx64.efi
. 第一個efi
只是掛載點目錄的名稱,第二個EFI
是 UEFI 規範要求的子目錄的名稱。根據 GPT 規範,GPT 分區表從磁碟塊 #1 開始,塊 #0 為保護 MBR保留:一個虛擬 MBR 分區表,它應該只有一個分區條目,描述佔用整個磁碟(或大約 2 TiB 的 MBR 絕對最大值,以較小者為準),分區類型設置為
0xee
.這告訴不支持 GPT 的系統“是的,該磁碟已被格式化和分區並且正在使用中,不,它不是您會知道的分區類型。請不要為使用者提供簡單的方法來一鍵格式化我。”
當然,這使得建構具有混合 GPT/MBR 分區的磁碟成為可能:對於不理解 GPT 的系統來說是一個有效的 MBR(可能包括引導程式碼),對於那些理解 GPT 的系統來說是一個有效的 GPT 分區表,帶有一個 ESP 分區包含用於不同系統架構的任意數量的 UEFI 引導載入程序。