本文分為兩部分:
* BIOS + MBR + GRUB * BIOS + GPT + GRUB
這兩種模式下有所區別,下面會一層層的解釋這兩種方式。通常GPT與UEFI一起使用,因為UEFI只能使用GPT分區表,GPT是UEFI的一部分,但是本文本文討論的是GPT + BIOS的方式,目前並不涉及UEFI相關的內容。
# 啟動原理簡述
GRUB由幾個鏡像文件組成,其中最重要的是:
# boot.img,此圖像是GRUB的第一部分。 由於大小限制,它不了解文件系統。它的唯一功能是從本地磁盤加載core.img文件。要使BIOS讀取它,此鏡像將寫入MBR中或分區的引導扇區。
# core.img,它包含足夠的模塊來訪問/boot/grub目錄,並在運行時從文件系統加載其他所有內容(包括菜單處理,加載目標操作系統的能力等)。此鏡像可以安裝在磁盤上的不同區域,具體取決於是使用MBR分區表還是GPT分區表。
所以,就引導來說,這兩種模式的主要區別還是在與core.img的位置。
# BIOS + MBR + GRUB
有兩個位置用來安裝core.img鏡像:
# 在MBR后的“空隙”中:“空隙”是MBR和第一個分區之間的區域。由於MBR是512字節,並且第一個分區通常以1MiB(2048個扇區)偏移對齊,因此為core.img留下了足夠的空間。
# 在文件系統中,在這種情況下,包含core.img的塊列表可以存儲在該分區的第一扇區中。需要注意的是,這些塊可能會被文件系統移動。 因此,不建議在此處放置core.img鏡像。
# BIOS + GPT + GRUB
可以在GPT磁盤上為GRUB保留整個分區,稱為「BIOS引導分區」。然后,可以將GRUB嵌入到該分區中,而不會被其他軟件覆蓋,也不會被包含在可能移動其塊的文件系統中。
BIOS引導分區的大小至少應為31KiB。在扇區大小為512字節的GPT磁盤上,第一個可用扇區通常為34。因為:
LBA 0: Protective MBR. LBA 1: GPT header. LBA 2-33: Partition Entry Array.
並且第一個分區通常以1MiB(2048個扇區)偏移對齊。這留下了類似於MBR磁盤上的間隙,可以將它作為「BIOS引導分區」使用。 但是,也可以在磁盤上的不同偏移處創建「BIOS引導分區」。
「BIOS引導分區」還必須具有正確的分區類型,即在gdisk中設置為EF02,或者在parted中設置bios_grub標志。這也是下面錯誤的原因:
# grub-install /dev/sdd Installing for i386-pc platform. grub-install: warning: this GPT partition label contains no BIOS Boot Partition; embedding won't be possible. grub-install: error: embedding is not possible, but this is required for RAID and LVM install.
你需要創建一個「BIOS引導分區」,專門用於保存core.img鏡像。
# 創建BIOS引導分區
下面是在parted中操作:
#!/bin/sh # 假設我們的硬盤是/dev/sdd # parted /dev/sdd GNU Parted 3.2 Using /dev/sdd Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) print Model: Samsung SSD 860 QVO 2TB (scsi) Disk /dev/sdd: 2000GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 1075MB 1074MB ext4 Linux filesystem bios_grub 2 1075MB 538GB 537GB Linux LVM lvm (parted) set 1 bios_grub on (parted) q Information: You may need to update /etc/fstab. # 關鍵命令是「set 1 bios_grub on」,其中參數「1」是分區編號。 # 另外,「BISO引導分區」不用這么大。我是因為一開始並不懂,所以才分配了這么大。同樣1MiB足夠了。
!!!「BIOS引導分區」是一個單獨的分區,用於存放core.img鏡像,不能格式化,不能用作其他的用途。
# 安裝GRUB引導
接下來的任務就是安裝GRUB引導:
#!/bin/sh grub install /dev/sda update-grub
# 驗證
有個Shell腳本,「Boot Info Script」,用於查看系統的引導信息。執行該命令后,他會輸出boot.img和core.img鏡像的位置。
相關文章
參考文獻
Grub failing to install on Debian/Ubuntu with GPT partitions
GRUB on a BIOS System
gpt/bios grub2 boot problem, diagnostic and tools
Booting from GPT
Legacy BIOS Issues with GPT