1.legencybios+mbr分區
# 1. 進入 parted 工具
parted /dev/sda
# 2. (在 parted 交互內) 創建 msdos (MBR) 分區表
mklabel msdos
# 3. 開啓對齊參數(推薦,確保存儲性能)
set default-sector-size 512
unit MiB
# 4. 創建 /boot 分區 (主分區, 1GiB)
mkpart primary ext4 1 1025
# 設置啓動標誌 (Legacy BIOS 讀取這裏)
set 1 boot on
# 5. 創建 swap 分區 (主分區, 假設 4GiB)
mkpart primary linux-swap 1025 5121
# 6. 創建 / 根分區 (主分區, 假設 20GiB)
mkpart primary ext4 5121 25601
# 7. 創建擴展分區 (主分區類型, 佔用剩餘所有空間)
# 注意:這裏必須是 extended 類型,且起始位置緊接上一個分區
mkpart extended 25601 100%
# 8. 在擴展分區內創建邏輯分區 /home (從 25.6G 開始)
mkpart logical ext4 25601 50000
# 9. 在擴展分區內創建邏輯分區 /data (剩餘空間)
mkpart logical ext4 50000 100%
###### 跳過格式化和掛載 ###########
# 假設你的目標系統根目錄在 /mnt/target
# 1. 安裝 GRUB 到磁盤的 MBR (注意是 /dev/sda,不是分區)
grub-install --target=i386-pc --boot-directory=/mnt/target/boot /dev/sda
# 參數解釋:
# --target=i386-pc : 明確指定 Legacy BIOS 模式
# --boot-directory : 指定 boot 目錄位置,GRUB 會去那裏找 grub.cfg
# /dev/sda : 物理磁盤設備
# 2. 生成配置文件 (需要在目標系統環境下運行,或者使用宿主機的工具指定目錄)
# 如果你已經把 /dev/sda3 掛載到了 /mnt/target,並且裏面有了基本的 Linux 環境
chroot /mnt/target update-grub
# 或者在某些發行版 (如 CentOS/RHEL) 上:
# chroot /mnt/target grub2-mkconfig -o /boot/grub2/grub.cfg
注意:
- mbr格式的stage2會佔用1-62扇區(0扇區為mbr即stage1),所以第一個分區理論上可以從63扇區開始,但是為了對齊現代磁盤的物理塊,從 1MiB 開始能獲得最佳性能和兼容性。
- mbr只支持4個主分區;如果分區超過4個,需要創建3個主分區+1個擴展分區,然後在擴展分區內創建邏輯分區。
- 執行 set 1 boot on 時,parted 會將第1個分區在 MBR 中的這個字節設置為 0x80(十六進制 80)。BIOS 的行為:電腦啓動時,BIOS 讀取 MBR 後,會去查找哪個分區被標記了 0x80。找到後,它會把控制權交給這個分區的引導扇區(Volume Boot Record),從而加載 Grub 或其他引導程序。
2.legencybios+gpt分區
# 1. 進入 parted 工具
parted /dev/sda
# 2. (在 parted 交互內) 創建 gpt 分區表
mklabel gpt
# 3. 設置單位為 MiB
unit MiB
# 4. 創建 bios_grub 分區 (1MB, 不格式化, 必須是第一個分區)
# 注意:起始位置從 1 開始,不要從 0 開始
mkpart primary 1 2
# 設置標誌為 bios_grub
set 1 bios_grub on
# 5. 創建 /boot 分區 (主分區, 1GiB)
mkpart primary ext4 2 1026
# 6. 創建 swap 分區 (主分區, 假設 4GiB)
mkpart primary linux-swap 1026 5122
# 7. 創建 / 根分區 (主分區, 假設 20GiB)
mkpart primary ext4 5122 25602
# 8. 創建 /home 分區
mkpart primary ext4 25602 50000
# 9. 創建 /data 分區 (剩餘空間)
mkpart primary ext4 50000 100%
###### 跳過格式化和掛載 ###########
# 安裝 GRUB 到磁盤 (注意:是 /dev/sda,不是分區)
# grub-install 會自動檢測到 /dev/sda1 是 bios_grub 類型,並將 core.img 嵌入進去
grub-install \
--target=i386-pc \
--boot-directory=/mnt/target/boot \
/dev/sda
# 如果上面命令報錯 "embedding is not possible",請檢查:
# 1. /dev/sda1 是否確實設置了 bios_grub 標誌
# 2. /dev/sda1 是否太小(必須 >= 1MB)
# 3. 是否在 parted 中正確設置了 gpt 格式
# 生成配置文件
# 如果你在 chroot 環境內:
# chroot /mnt/target update-grub
# 如果你在內存系統中(未 chroot):
grub-mkconfig --root-directory=/mnt/target -o /mnt/target/boot/grub/grub.cfg
注意: (1)bios_grub:當磁盤使用的是 GPT 分區表,但電腦啓動模式是 Legacy BIOS(非 UEFI)時,必須創建一個bios_grub的分區。如果是傳統的 MBR 分區表 + Legacy BIOS,通常不需要這個分區,GRUB 會直接嵌入到 MBR 和第一個分區之間的“空隙”(1-62扇區)中。在 GPT 磁盤上,MBR 和分區之間沒有預留的“空隙”(或者空隙太小),GRUB 的核心鏡像(core.img)沒地方放。這個標記為 bios_grub 的分區就是專門給 GRUB 存放core.img用的。 怎麼設置? 大小:非常小,1MB - 2MB 就足夠了(GRUB 代碼很小)。 格式:不要格式化它(沒有文件系統,如 ext4/fat32)。它是一個裸分區。 (2)第一個分區的起始扇區強烈建議從 1MiB (2048扇區) 開始:GPT 磁盤在磁盤開頭保留了 34 個扇區用於 GPT 頭和分區表。為了確保與各種磁盤工具的兼容性以及 4K 扇區對齊,從 1MiB 開始是現代 Linux 發行版的標準做法。
3.uefi+gpt分區
# 1. 進入 parted 交互模式
parted /dev/sda
# 2. (parted 內部) 創建 GPT 分區表
mklabel gpt
# 3. 設置單位為 MiB (便於計算)
unit MiB
# 4. 創建 EFI 分區 (建議 500MB - 1GB)
# 起始位置:1MiB (對齊),結束位置:513MiB (即 500MB 大小)
mkpart primary fat32 1 513
# 5. 設置 EFI 分區的標誌 (這是關鍵,讓 UEFI 識別)
set 1 boot on
set 1 esp on
# 6. 創建 /boot 分區 (存放內核和 grub 配置)
mkpart primary ext4 513 1537 # 1GB 大小
# 7. 創建 swap 分區
mkpart primary linux-swap 1537 5637 # 4GB 大小
# 8. 創建 / (根分區)
mkpart primary ext4 5637 26117 # 20GB 大小
# 9. 創建 /home 分區
mkpart primary ext4 26117 51557 # 剩餘空間前半部分
# 10. 創建 /data 分區 (剩餘所有空間)
mkpart primary ext4 51557 100%
###### 跳過格式化和掛載 ###########
grub-install \
--target=x86_64-efi \ # 指定 UEFI 目標架構
--efi-directory=/mnt/target/boot/efi \ # 指定 EFI 掛載點
--boot-directory=/mnt/target/boot \ # 指定 grub 配置存放點
--recheck \
/dev/sda
# 在內存系統中 (未 chroot):
grub-mkconfig --root-directory=/mnt/target -o /mnt/target/boot/grub/grub.cfg
注意: 僅支持uefi時,不需要bios_grub分區,但是必須要efi分區(需要格式化為FAT32)。支持uefi時,只能使用gpt分區,不能使用mbr分區。
4.同時支持legencybios和uefi+gpt分區
要同時支持 Legacy BIOS (CSM) 和 UEFI,你的磁盤分區表必須是 GPT,並且需要同時包含兩種模式所需的特殊分區:bios_grub 和 EFI System Partition。這種配置通常被稱為“混合啓動”或“雙重啓動”配置。
# 1. 進入 parted 交互模式
parted /dev/sda
# 2. (parted 內部) 創建 GPT 分區表
mklabel gpt
# 3. 設置單位為 MiB
unit MiB
# === 第一個分區:Legacy BIOS 的“儲物間” ===
# 4. 創建 bios_grub 分區 (1MB, 不需要文件系統)
mkpart primary 1 2
# 設置標誌為 bios_grub (告訴 GRUB 這裏是它的地盤)
set 1 bios_grub on
# === 第二個分區:UEFI 的“家” ===
# 5. 創建 EFI 分區 (FAT32, 500MB-1GB)
mkpart primary fat32 2 514
# 設置標誌為 boot 和 esp (告訴 UEFI 這裏是啓動文件)
set 2 boot on
set 2 esp on
# === 第三個分區:/boot (存放內核和 grub 配置) ===
mkpart primary ext4 514 1538 # 1GB
# === 第四個分區:swap ===
mkpart primary linux-swap 1538 5638 # 4GB
# === 第五個分區:/ (根分區) ===
mkpart primary ext4 5638 26118 # 20GB
# === 第六個分區:/home (剩餘空間) ===
mkpart primary ext4 26118 100%
###### 跳過格式化和掛載 ###########
# 1. 安裝 UEFI 版本的 GRUB (這是主引導)
# 這會生成 grubx64.efi 文件到 /boot/efi
grub-install \
--target=x86_64-efi \ # 指定 UEFI 目標
--efi-directory=/mnt/target/boot/efi \ # 指定 ESP 掛載點
--boot-directory=/mnt/target/boot \ # 指定 grub 配置存放點
--recheck \
/dev/sda
# 2. 安裝 Legacy BIOS 版本的 GRUB
# 這一步會將 core.img 嵌入到我們之前創建的 1MB 的 sda1 分區中
grub-install \
--target=i386-pc \ # 指定 Legacy BIOS 目標
--boot-directory=/mnt/target/boot \ # 指定 grub 配置存放點
/dev/sda # 注意:是磁盤,不是分區
# 3. 生成配置文件 (兩條命令通常只需執行一次,配置文件是通用的)
grub-mkconfig --root-directory=/mnt/target -o /mnt/target/boot/grub/grub.cfg
5.同時支持legencybios和uefi的情況下,grub需要安裝兩次,兩次安裝會不會發生資源衝突
| 資源類型 | Legacy BIOS 安裝 (i386-pc) |
UEFI 安裝 (x86_64-efi) |
是否衝突 |
|---|---|---|---|
| 磁盤頭部 | 佔用 MBR (前 512 字節) | 不佔用 MBR | ❌ 無衝突 |
| 特殊分區 | 佔用 bios_grub (嵌入 core.img) |
不佔用該分區 | ❌ 無衝突 |
| ESP 分區 | 通常不寫入文件 (除非 chainload) | 佔用 EFI 系統分區 (寫入 .efi 文件) |
❌ 無衝突 |
| /boot 目錄 | 讀取 /boot/grub/i386-pc/*.mod |
讀取 /boot/grub/x86_64-efi/*.mod |
❌ 無衝突 (不同子目錄) |
| 配置文件 | 讀取 /boot/grub/grub.cfg |
讀取 /boot/grub/grub.cfg |
✅ 共用 (無衝突) |
總結: Legacy BIOS:確實佔用了 MBR 和 bios_grub 分區,並且在 /boot 下放了 i386-pc 相關的文件。 UEFI:佔用了 ESP 分區(放 grubx64.efi),並在 /boot 下放了 x86_64-efi 相關的文件。 兩者共用/boot/grub/grub.cfg但是無衝突。