GRUB

出自 Arch Linux 中文维基

GRUB(GRand Unified Bootloader,大一統啟動加載器),是一個引導加載程序。當前的 GRUB 也被稱作 GRUB 2,而原始 GRUB(GRUB Legacy)表示 0.9x 版本。本頁只描述 GRUB 2。

注意: 在本文中,esp 表示EFI 系統分區(ESP)的掛載點。

受支持的文件系統[編輯 | 編輯原始碼]

GRUB捆綁了由自己支持的多種文件系統,尤其是FAT32ext4BtrfsXFS。有關一些注意事項,參見#不支持的文件系統

警吿: 文件系統可能會獲得一些GRUB還未支持的新特性,除非關閉這些不兼容的特性,否則這些特性無法適用於/boot。通常的解決辦法是使用一個單獨的/boot分區,並格式化為通用的文件系統,如FAT32

UEFI 系統[編輯 | 編輯原始碼]

注意:
  • 使用UEFI安裝時,一定要讓安裝介質以UEFI模式啟動,否則 efibootmgr 將無法添加 GRUB UEFI 啟動項。 但即使在 BIOS 模式工作時,安裝到後備啟動路徑仍然可行,因為這一過程用不到 NVRAM。
  • 要從一個磁盤上使用 UEFI 模式啟動,磁盤上必須要先有一個 EFI 分區。按照 EFI 系統分區#檢查現有的分區 上説的來查看你是否已經有一個 EFI 分區,如若沒有,就創建一個。
  • 本頁所有內容假定GRUB2是能夠通過insmod加載額外模塊的。#Shim-lock中討論了相關問題,這種情況下UEFI系統無法啟用安全啟動(Secure Boot)功能。在一個啟用了安全啟動的系統上,如果你想要使用任何不包含在標準GRUB EFI grubx64.efi文件中的額外GRUB模塊,你必須通過grub-mkstandalone或者使用grub-install重新安裝GRUB,以重新生成包含所需模塊的grubx64.efi文件。

安裝[編輯 | 編輯原始碼]

注意:
  • 不同硬件廠商的 UEFI 實現方式不一樣,下面描述的步驟應該可以在大部分 UEFI 系統上面正常應用。對於用了下面的方法卻遇到問題的用户,請將在特定的硬件上所遇到的問題的細節,以及可能的解決辦法分享出來。這些案例可以添加到頁面 GRUB/EFI examples 上面。
  • 本節假設您正在 x64(64位)UEFI系統上安裝 GRUB。對於 IA32 (32 位) UEFI 系統(不要和 32 位 CPU 相混淆), 將x86_64-efi替換成i386-efi。根據UEFI#檢查系統位數中的説明來確定你的UEFI系統位數。
警吿:grub 2:2.06.r566.g857af0e17-1起,無法從IA32 UEFI(i386-efi)系統啟動。參見FS#79098

首先安裝軟件包 grubefibootmgr。其中「GRUB」是啟動引導器,「efibootmgr」被 GRUB 腳本用來將啟動項寫入 NVRAM。

然後按照下列步驟將GRUB安裝到你的硬盤上:

  1. 掛載 EFI 系統分區。需要注意的是在本節的內容裡,把 esp 替換成ESP分區掛載點;
  2. 選擇一個啟動引導器標識,在本例被稱為 GRUB。這將在 esp/EFI/ 中創建一個與標識同名的目錄來儲存 EFI 二進制文件,而且這個名字還會用於在 UEFI 啟動菜單中區分 GRUB 啟動項;
  3. 執行下面的命令來將 GRUB EFI 應用 grubx64.efi 安裝到 esp/EFI/GRUB/,並將其模塊安裝到 /boot/grub/x86_64-efi/
注意:
  • 確保你安裝 GRUB 軟件包和運行命令的系統是你想用 GRUB 引導的系統。也就是説如果你是通過安裝介質引導的,你需要在 chroot 之後再運行 grub-install。如果因為某些原因不得不在安裝的系統之外運行 grub-install,在後面加上 --boot-directory= 選項來指定掛載 /boot 目錄的路徑,例如 --boot-directory=/mnt/boot
  • 某些主板無法處理包含空格的 bootloader-id
# grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB

上述安裝完成後, GRUB 的主目錄將位於 /boot/grub/。注意上述例子中,grub-install 還將在固件啟動管理器中創建一個條目,名叫 GRUB。如果你的啟動項已滿,這個命令會執行失敗。你需要使用 efibootmgr 來刪除不必要的條目。

在配置完成後,記得#生成主配置文件

提示:如果你使用了 --removable 選項,那 GRUB 將被安裝到 esp/EFI/BOOT/BOOTX64.EFI (當使用 i386-efi 時是 esp/EFI/BOOT/BOOTIA32.EFI ),此時即使 EFI 變量被重設或者你把這個驅動器接到其他電腦上,你仍可從這個驅動器上啟動。通常來説,你只要像操作 BIOS 設備一樣在啟動時選擇這個驅動器就可以了。如果設備是同時安裝了Windows的多引導啟動,注意 Windows 通常會在這裏安裝一個 EFI 可執行程序,該程序的目的是僅重建Windows的UEFI啟動項。如果你想在Mac上安裝GRUB,那你必須要使用該選項。 如果你更新了BIOS,啟動項可能會在更新後丟失。因此可以創建一個「removable」啟動項作為後備。
注意:
  • --efi-directory--bootloader-id 是 GRUB UEFI 特有的。--efi-directory 替代了已經廢棄的 --root-directory
  • 您可能注意到在 grub-install 命令中沒有 device_path 選項(例如 /dev/sda)。事實上即使提供了 device_path,也會被 GRUB UEFI 安裝腳本忽略,因為 UEFI 啟動加載器不使用 MBR 啟動代碼或啟動扇區。

如果遇到問題,查看 UEFI 故障排查。參見GRUB/技巧和竅門#UEFI 延伸閱讀

啟用安全啟動[編輯 | 編輯原始碼]

GRUB支持使用CA密鑰或shim進行安全啟動,安裝命令受你選擇的方法而不同。

警吿:
  • 錯誤配置安全啟動會造成你的系統無法啟動。如果啟用安全啟動後系統因某種原因無法啟動,你應該在固件設置中關閉它並重啟系統。
  • 啟動引導器加載不必要的模塊會帶來潛在安全風險,沒有必要不要使用這些命令。

CA密鑰[編輯 | 編輯原始碼]

下列命令使用CA密鑰:

# grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB --modules="tpm" --disable-shim-lock

Shim-lock[編輯 | 編輯原始碼]

注意: 進行下面的操作前,你應該確保已經按照UEFI/安全啟動#shim中的指示完成設置,並已經安裝了sbsigntools用於接收密鑰。

當使用Shim-lock時,只有當GRUB二進制文件包含了全部用於讀取含有vmlinuzinitramfs鏡像的文件系統的必要模塊時,才可以成功進入安全啟動模式。

自GRUB版本2.06.r261.g2f4430cc0起,無法在安全啟動模式下通過insmod加載模塊,因為這違背了不允許側加載任意代碼的要求。如果GRUB模塊沒有嵌入在EFI二進制文件中,而GRUB又通過insmod側加載它們,GRUB會產生啟動失敗的信息:

error: prohibited by secure boot policy

根據Ubuntu的官方構建腳本,整合下列模塊到已簽名的GRUB EFI二進制文件grubx64.efi

  • "基礎"模塊,用於從CD或簡單分區硬盤啟動: all_video, boot, btrfs, cat, chain, configfile, echo, efifwsetup, efinet, ext2, fat, font, gettext, gfxmenu, gfxterm, gfxterm_background, gzio, halt, help, hfsplus, iso9660, jpeg, keystatus, loadenv, loopback, linux, ls, lsefi, lsefimmap, lsefisystab, lssal, memdisk, minicmd, normal, ntfs, part_apple, part_msdos, part_gpt, password_pbkdf2, png, probe, reboot, regexp, search, search_fs_uuid, search_fs_file, search_label, sleep, smbios, squash4, test, true, video, xfs, zfs, zfscrypt, zfsinfo
  • "平台特定"的模塊用於x86_64-efi架構,如:
    • play:啟動時播放聲音
    • cpuid:啟動時檢查CPU功能
    • tpm:提供可度量啟動(Measured Boot) / 可信平台模塊英語TPM支持
  • "高級"模塊,包含以下模塊:
    • cryptodisk:從Dm-crypt加密磁盤啟動
    • gcry_algorithm:支持特定散列和加密算法
    • luks:從LUKS加密的磁盤啟動
    • {{ic|lvm}:從LVM邏輯卷磁盤啟動
    • mdraid09, mdraid1x, raid5rec, raid6rec:從RAID虛擬磁盤啟動

你必須通過設置shell變量的方式構造GRUB模塊列表,我們將變量設置為GRUB_MODULES。你也可以使用最新的Ubuntu腳本作為出發點,然後去除你系統不需要的模塊。去除模塊會讓啟動速度相對更快,並節省一些EFI系統分區的空間。

如果GRUB從UEFI shim 加載器啟動,你還需要一個Secure Boot Advanced Targeting (SBAT) 文件/部分包含在EFI二進制文件中,來提高安全性。這個SBAT文件/部分包含GRUB二進制文件的元數據(版本,維護者,開發者,上游URL),能夠讓shim更容易確認存在安全漏洞的GRUB版本,並拒絕加載[1][2],如UEFI shim 啟動加載器安全啟動生命周期改進文檔所述。

如果grubx64.efi缺少SBAT部分,第一階段UEFI啟動加載器shim會拒絕加載啟動grubx64.efi

GRUB安裝後,會提供一個簡單的SBAT.csv文件在/usr/share/grub/sbat.csv

重新安裝GRUB,使用提供的SBAT文件和包含所有需要模塊的GRUB_MODULES,並簽名:

# grub-install --target=x86_64-efi --efi-directory=esp --modules=${GRUB_MODULES} --sbat /usr/share/grub/sbat.csv
# sbsign --key MOK.key --cert MOK.crt --output esp/EFI/GRUB/grubx64.efi esp/EFI/GRUB/grubx64.efi
# cp esp/EFI/GRUB/grubx64.efi esp/EFI/BOOT/grubx64.efi

重啟,選擇MokManager中的密鑰,安全啟動應該就可以工作了。

使用安全啟動[編輯 | 編輯原始碼]

安裝完成後,參考安全啟動#實施安全啟動來啟用安全啟動。

如果使用CA密鑰,則可以使用 sbctl 自動執行密鑰管理、註冊和文件簽名,有關詳細信息,請參閱安全啟動#sbctl

BIOS 系統[編輯 | 編輯原始碼]

GUID 分區表 (GPT) 特殊操作[編輯 | 編輯原始碼]

使用BIOS引導GPT的分區情況(BIOS/GPT)下,必須使用 BIOS 啟動分區。GRUB將core.img嵌入到這個分區。

注意:
  • 在嘗試這種方法之前請記住不是所有的系統都支持這種分區方案,請參閱 GUID 分區表
  • 此額外分區只由 GRUB 在 BIOS/GPT 分區方式中使用。對於 BIOS/MBR 分區方式,GRUB 會把core.img放到 MBR 後間隙(post-MBR gap)中去,而在 GPT 中並不能保證在第一個分區之前有可以這樣使用的空間。
  • UEFI 系統也不需要這額外分區,因為它不需要嵌入啟動扇區。UEFI 系統需要有 EFI 系統分區

安裝 GRUB 前,在一個沒有文件系統的磁盤上,創建一個1兆字節(使用 fdiskgdisk 和參數+1M)的分區,將分區類型設置為 GUID 21686148-6449-6E6F-744E-656564454649

  • 對於 fdisk,選擇分區類型 BIOS boot
  • 對於 gdisk,選擇分區類型代碼 ef02
  • 對於 parted, 在新創建的分區上設置/激活 bios_grub 標記。

這個分區可以處於磁盤的前 2TB 空間中的任意位置,但需要在安裝 GRUB 之前創建好。分區建立好後,按下面的命令安裝啟動管理器。

第一個分區之前的空間也可以用作 BIOS 啟動分區,但是這會違反 GPT 對齊規範。因為這個分區不會經常訪問,所以性能的影響很小,只不過有些分區工具會發出警吿。可以在 fdiskgdisk 中創建一個從 34 扇區開始,一直到 2047扇區的分區,然後按照上述方式設置類型。為了讓其它分區對齊,可以最後再創建此分區。

主引導記錄 (MBR) 特殊操作[編輯 | 編輯原始碼]

一般來説,如果使用兼容 DOS 的分區對齊模式,主引導記錄 512 字節結束位置和第一個分區之間都有 31KB 的空閒空間。不過,為了提供足夠的空間嵌入 GRUB 的core.img文件,建議將這個空間設置為 1 到 2 MB (FS#24103)。 建議使用支持 1 MB 分區對齊的分區軟件來分區, 因為這樣也能滿足非 512 字節扇區磁盤分區的需求(這一點就與嵌入core.img沒有關係了)。

安裝[編輯 | 編輯原始碼]

(在 archiso 環境下,比如安裝系統時,請記得在 arch-chroot 環境中操作。)安裝軟件包 grub。如果之前安裝過 grub-legacyAUR,安裝完成後 grub 會取代它。然後運行

# grub-install --target=i386-pc /dev/sdX

注意這裏的i386-pc是有意為之,與你機器的實際架構無關, 其中 /dev/sdX 是要安裝 GRUB 的磁盤(不是分區),比如磁盤 /dev/sda/dev/nvme0n1或者/dev/mmcblk0,而 不是 分區 /dev/sda1,你可以查看Device file#Block device names來獲得塊設備命名方案的詳細描述。

現在你需要生成主配置文件

如果你的 /boot 使用了 LVM(邏輯分卷管理器),GRUB 可以安裝到多個物理磁盤上。

提示:對於安裝 GRUB 的其他方式,例如安裝到一個U盤上,可以參考 其它安裝方式

grub-install 命令的詳細信息請參考 grub-install(8)GRUB 手冊

配置[編輯 | 編輯原始碼]

完成安裝之後,GRUB 在每次啟動的時候加載配置文件 /boot/grub/grub.cfg。你可以使用工具來#生成 grub.cfg,或者可以手動#定製 grub.cfg

生成 grub.cfg[編輯 | 編輯原始碼]

本節只講述如何編輯配置文件 /etc/default/grub。更多信息請見 GRUB/技巧和竅門

注意: 請記住,每當修改 /etc/default/grub 或者 /etc/grub.d/ 中的文件之後,都需要再次生成主配置文件
警吿: 如果新版本的GRUB改變了配置文件的句法規則,錯誤的配置文件可能會導致系統無法引導,請更新或重新安裝引導器(見GRUB#UEFI 系統GRUB#BIOS 系統

生成主配置文件[編輯 | 編輯原始碼]

安裝後,需要生成主配置文件 /boot/grub/grub.cfg。配置文件的生成過程受到 /etc/default/grub 中的選項和 /etc/grub.d/ 下腳本的影響。對於/boot/grub/grub.cfg中的選項,GNU的文檔有各個選項的簡明描述。

如果你沒有進行額外配置,自動生成程序會在當前啟動的系統的根文件系統中偵測配置文件。所以請確保系統已經啟動或者已經通過 chroot 進入。

注意:
  • 默認的文件路徑是 /boot/grub/grub.cfg,而非 /boot/grub/i386-pc/grub.cfg
  • 如果你是在 chroot 或者 systemd-nspawn 容器中運行 grub-mkconfig,可能會報 grub-probe 無法獲取 "canonical path of /dev/sdaX" 錯誤而無法正常執行。此時可以嘗試使用 arch-chroot,參見 BBS post

使用 grub-mkconfig 工具來生成 /boot/grub/grub.cfg

# grub-mkconfig -o /boot/grub/grub.cfg

自動生成腳本默認將在生成的配置文件中為所有已安裝的 Arch Linux 內核添加條目。

提示:

如果想要自動為其他作業系統添加條目,請見#探測其他作業系統

如果想要添加自定義條目,你可以編輯 /etc/grub.d/40_custom 文件,然後重新生成 /boot/grub/grub.cfg。或者你可以創建 /boot/grub/custom.cfg 文件然後把條目添加進這裏面。修改 /boot/grub/custom.cfg 文件後不用再運行 grub-mkconfig 程序,因為 /etc/grub.d/41_custom 文件已經在生成的主配置文件中添加了相關的 source 語句來引用 /boot/grub/custom.cfg

提示:/etc/grub.d/40_custom 可以用做創建 /etc/grub.d/nn_custom 文件的模板,其中 nn 為優先級,規定腳本文件的執行順序。而腳本文件的執行順序決定了其所添加的條目在 GRUB 啟動菜單中的位置。nn 應當比 06 大,以此保證重要的腳本能夠優先執行。

如要參考自定義菜單條目的例子,請看#啟動菜單條目示例

探測其他作業系統[編輯 | 編輯原始碼]

想要讓 grub-mkconfig 探測其他已經安裝的系統並自動把他們添加到啟動菜單中,安裝 軟件包 os-prober掛載 包含其它系統引導程序的磁盤分區。然後重新運行 grub-mkconfig。如果你得到以下輸出:Warning: os-prober will not be executed to detect other bootable partitions,你需要編輯/etc/default/grub並取消下面這一行的註釋,如果沒有相應註釋的話就在文件末尾添加上:

GRUB_DISABLE_OS_PROBER=false

然後運行 grub-mkconfig 再試一次。

注意:
  • 分區掛載點並不重要,os-prober讀取mtab信息來確認並搜索引導程序的位置。
  • 記得每次運行 grub-mkconfig 之前都把包含其他作業系統引導程序的分區掛載上,以免這些作業系統的啟動項丟失。
  • os-prober在chroot中可能無法正常運作。如果遇到這種情況,重啟並引導進入系統後再次嘗試。
提示:你可能想讓grub記住你上次選擇的啟動項,參見GRUB/技巧和竅門#調用之前的啟動條目
Windows[編輯 | 編輯原始碼]

對於以 UEFI 模式安裝的Windows,確保含有 Windows Boot Manager (bootmgfw.efi,Windows EFI 引導程序) 的分區被掛載,以root身份運行os-prober來檢測並為其生成啟動菜單項。

對於以 BIOS 模式安裝的 Windows,掛載 Windows 的系統分區 (其文件系統標籤應該為System ReservedSYSTEM),以root身份運行os-prober來檢測並為其生成啟動菜單項。

注意: 對於以 BIOS模式安裝的 Windows:
  • 通過默認 Linux 驅動掛載的 NTFS 分區可能無法被檢測到。如果 GRUB 無法檢測到,嘗試安裝NTFS-3G並重新掛載分區。

本文內容或本節內容已經過期。

原因: 自 Windows 7 起, bootmgr 位於 系統分區,該分區並未加密。 (在Talk:GRUB討論)
  • 加密的 Windows 分區需要在解密之後才能掛載。對於 BitLocker,可以使用 cryptsetupdislockerAUR。這應該足夠
os-prober 來添加正確的啟動條目。

額外的參數[編輯 | 編輯原始碼]

如想為 Linux 鏡像添加額外的參數,你可以在 /etc/default/grub 中設置 GRUB_CMDLINE_LINUXGRUB_CMDLINE_LINUX_DEFAULT 變量。生成普通啟動項時,這兩個參數的值會合併在一起傳給內核。生成 recovery 啟動項時, 僅使用 GRUB_CMDLINE_LINUX 參數。

兩個參數不是一定要一起用。例如要系統支持休眠後恢復,可以使用 GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=uuid-of-swap-partition quiet",其中 uuid-of-swap-partition 是你的交換分區的 UUID。這樣在生成 recovery 啟動項時,將不會啟用 resume 功能,也不會有 quiet 參數來省略啟動時的內核信息。而其他的普通啟動項會包含它們。

grub-mkconfig 默認使用 UUID 定位根文件系統,要禁用此設置,取消 GRUB_DISABLE_LINUX_UUID=true 的註釋。

要生成 GRUB recovery 啟動項,需要確保在 /etc/default/grubGRUB_DISABLE_RECOVERY 沒有設置為 true

更多信息請參考內核參數

設置啟動菜單的頂層啟動項[編輯 | 編輯原始碼]

默認情況下grub-mkconfig使用sort -V對內核進行排序,並把第一個內核作為頂層啟動項。也就是説,如果你同時安裝了linux-ltslinux ,因為/boot/vmlinuz-linux-lts排在/boot/vmlinuz-linux前面,LTS內核會作為頂層啟動項,這可能是不希望的結果。在/etc/default/grub中指定GRUB_TOP_LEVEL=內核路徑可以覆蓋自動排序結果。要讓普通內核作為頂層啟動項,設置為GRUB_TOP_LEVEL="/boot/vmlinuz-linux"

LVM[編輯 | 編輯原始碼]

警吿: GRUB 不支持 thin-provisioned 邏輯卷。

如果你的 /boot 或者 / 分區使用了 LVM,確保 lvm 模塊已經預先加載好。

/etc/default/grub
GRUB_PRELOAD_MODULES="... lvm"

獨立磁盤冗餘陣列(RAID)[編輯 | 編輯原始碼]

GRUB 可以很方便地操作 RAID 卷,你只需加載 GRUB 模塊 mdraid09 或者 mdraid1x 就可以像其他卷一樣進行操作了。

/etc/default/grub
GRUB_PRELOAD_MODULES="... mdraid09 mdraid1x"

例如 /dev/md0 寫成:

set root=(md/0)

而 RAID 卷上的分區(如 /dev/md0p1)則是:

set root=(md/0,1)

如要在 /boot 分區使用 RAID1 時(或者 /boot 位於使用了 RAID1 的根分區之中)安裝 GRUB,對於 BIOS 系統,直接在各個驅動器上運行 grub-install 即可,就像這樣:

# grub-install --target=i386-pc --debug /dev/sda
# grub-install --target=i386-pc --debug /dev/sdb

上例中 /boot 所在的 RAID 1 序列位於 /dev/sda/dev/sdb 上。

注意: GRUB 支持從 Btrfs RAID 0/1/10 啟動,但 不支持 RAID 5/6。對 RAID 5/6,你可以使用 mdadm,這個 GRUB 是支持的。

加密的/boot[編輯 | 編輯原始碼]

GRUB 還專門支持從加密的 /boot 啟動。這需要解鎖一個 LUKS 塊設備,來讀取配置文件以及加載 initramfs內核。這個選項試圖解決未加密的 boot 分區問題。

提示:/boot 不需要 專門放到一個單獨的分區,它也可以就留在系統的根目錄 / 下面。
警吿: GRUB 2.12rc1 僅對 LUKS2 提供了有限的支持,詳情請見#LUKS2節。

要啟用這個功能,使用 LUKS/boot 所在的分區加密,然後在 /etc/default/grub 中添加如下選項:

/etc/default/grub
GRUB_ENABLE_CRYPTODISK=y

grub-install 使用這個選項來生成 core.img,所以在修改這個選項或加密分區之後要重新安裝 grub

如果沒有進一步的修改,你需要兩次輸入一個密碼:第一次是為了讓 GRUB 在啟動伊始解鎖 /boot 的掛載點,第二次是在 initramfs 的要求下解鎖根文件系統。你可以用 keyfile 來避免密碼輸入過程。

警吿:
  • 如果你想要 生成主配置文件,確保 /boot 已經掛載好了。
  • 為了進行與 /boot 的掛載點有關的系統更新,確保在進行更新之前已經對加密的 /boot 進行了解鎖和掛載。如果使用了獨立的 /boot 分區,這個可以通過使用 crypttab 和一個 keyfile 在啟動的時候自動完成。
注意:
  • 如果你使用了特別的鍵盤映射,默認安裝的 GRUB 是不知道的。這關係到如何輸入密碼來解鎖 LUKS 塊設備。請查閱 GRUB/技巧和竅門#為早期啟動手動配置核心映像
  • 如果你遇到問題沒法顯示輸入密碼的界面(與 cryptouuid, cryptodisk相關的錯誤,或者 "device not found"),可以試着重新安裝 GRUB,並在 grub-install 命令的尾部加上 --modules="part_gpt part_msdos"
提示:你可以使用 pacman hooks 來在升級時涉及到 /boot 中的文件的時候自動掛載它。
LUKS2[編輯 | 編輯原始碼]

根據#安裝一節的內容,使用grub-install創建支持LUKS的可引導GRUB鏡像。請注意下面的事項:

  • GRUB 2.06 添加了對 LUKS2 的初步支持,GRUB 2.12rc1 也只是部分解決了一些限制,參見 GRUB bug #55093
  • GRUB 2.12rc1 版本的grub-install可以創建一個解鎖LUKS2的鏡像。但是僅支持PBKDF2,不支持Argon2。
  • Argon2id (cryptsetup 默認) 和 Argon2i PBKDFs是不支持的,僅支持 PBKDF2 。
提示:你可以使用 grub-improved-luks2-gitAUR ,該包為LUKS2和Argon支持打了補丁。但請注意該包的Argon支持需要UEFI系統。[3]
注意: 早於 GRUB 2.12rc1 的版本需要配合一個定製GRUB配置文件,使用grub-mkimage手動創建一個EFI二進制文件。例如,通過/boot/grub/grub-pre.cfg調用cryptomountinsmod normalnormal。這在新版裡不再需要,grub-install 已經足夠了。但是從2.06版升級後,你可能需要至少運行grub-mkconfig -o /boot/grub/grub.cfg一次。

如果在啟動過程中遇到密碼無效(invalid passphrase)的提示並最後進入GRUB救急模式,嘗試運行命令:cryptomount -a來掛載所有加密分區,或者使用cryptomount -u $crypto_uuid掛載指定分區,接下來和平常一樣,運行insmod normalnormal

如果確定輸入的密碼正確,但密碼輸入後立刻返回密碼無效(invalid passphrase)的錯誤,檢查是否指定了正確的加密模塊。使用cryptsetup luksDump /dev/nvme0n1p2檢查 hash function(SHA-256, SHA-512)是否匹配鏡像安裝的模塊(gcry_sha256gcry_sha512),PBKDF算法是否為pbkdf2。可以使用 cryptsetup luksConvertKey --hash sha256 --pbkdf pbkdf2 /dev/nvme0n1p2更改加密分區的 hash 和 PBDKDF 算法。正常情況下,輸入密碼後需要花費幾秒時間處理,而不是立刻返回結果。

定製 grub.cfg[編輯 | 編輯原始碼]

這篇文章的某些內容需要擴充。

原因: 添加指導如何編寫一個定製的 /boot/grub/grub.cfgUser:Eschwartz/Grub 中有一個草稿可以查閱。 (在 Talk:GRUB#Manually generate grub.cfg 中討論)

這一節講述如何在 /boot/grub/grub.cfg 中手工創建 GRUB 啟動條目,而非使用 grub-mkconfig。

基礎的 GRUB 配置文件使用如下的設置:

  • (hdX,Y) 為磁盤 X 上的分區 Y,分區編號從 1 開始,磁盤編號從 0 開始。
  • set default=N 為在用户選擇時間內沒有進行選擇時的默認啟動條目。
  • set timeout=M 即在使用默認條目啟動前,等待用户自行選擇的時間為 M 秒。
  • menuentry "title" {entry options} 為一個標題為 title 的啟動條目。
  • set root=(hdX,Y) 設置 \boot 分區,即內核和 GRUB 模塊存儲的位置。(\boot 不一定要位於一個獨立的分區,可能是根分區(/) 下面的一個目錄。)

LoaderDevicePartUUID[編輯 | 編輯原始碼]

GPT分區自動掛載使用的systemd-gpt-auto-generator(8)需要LoaderDevicePartUUIDUEFI變量以正常工作。要使GRUB設置該變量,在grub.cfg中加載bli模塊:

if [ "$grub_platform" = "efi" ]; then
  insmod bli
fi

啟動菜單條目示例[編輯 | 編輯原始碼]

提示:在使用由 grub-mkconfig 所生成的 /boot/grub/grub.cfg 時,這些啟動條目仍然是可以用的。將它們添加到 /etc/grub.d/40_custom 中然後重新生成主配置文件,或者將它們添加到 /boot/grub/custom.cfg中。

若要管理多個 GRUB 條目,比如既使用 linux 又使用 linux-lts 內核,相關的提示可以參見 GRUB/技巧和竅門#多個啟動條目

對於 ArchisoArchboot 啟動菜單條目,參見 Multiboot USB drive#Boot entries.

GRUB 命令[編輯 | 編輯原始碼]
"關機" 菜單項[編輯 | 編輯原始碼]
menuentry "System shutdown" {
	echo "System shutting down..."
	halt
}
"重啟" 菜單項[編輯 | 編輯原始碼]
menuentry "System restart" {
	echo "System rebooting..."
	reboot
}
"UEFI固件設置" 菜單項[編輯 | 編輯原始碼]
if [ ${grub_platform} == "efi" ]; then
	menuentry 'UEFI Firmware Settings' --id 'uefi-firmware' {
		fwsetup
	}
fi
EFI 可執行文件[編輯 | 編輯原始碼]

在啟用了 UEFI 模式時,GRUB 可以 chainload 其它 EFI 可執行文件。

提示:如要讓這些啟動條目僅在 GRUB 處於 UEFI 模式的時候顯示,只需把它們放到下面的 if 語句中:
if [ ${grub_platform} == "efi" ]; then
	放入僅 UEFI 顯示的啟動條目
fi
UEFI Shell[編輯 | 編輯原始碼]

要啟動 UEFI Shell,你可以將它放在 EFI 系統分區的根目錄裡,然後添加如下菜單條目:

menuentry "UEFI Shell" {
	insmod fat
	insmod chain
	search --no-floppy --set=root --file /shellx64.efi
	chainloader /shellx64.efi
}
gdisk[編輯 | 編輯原始碼]

下載 gdisk EFI application 然後複製 gdisk_x64.efiesp/EFI/tools/

menuentry "gdisk" {
	insmod fat
	insmod chain
	search --no-floppy --set=root --file /EFI/tools/gdisk_x64.efi
	chainloader /EFI/tools/gdisk_x64.efi
}
Chainload 一個統一的內核鏡像[編輯 | 編輯原始碼]

如果你有一個按照 Secure Boot 或者其他方法生成的 .efi 文件,你可以把它添加到啟動菜單裏。例如:

menuentry "Arch Linux " {
	insmod fat
	insmod chain
	search --no-floppy --set=root --fs-uuid FILESYSTEM_UUID
	chainloader /EFI/Linux/arch-linux.efi
}
多系統啟動[編輯 | 編輯原始碼]
GNU/Linux[編輯 | 編輯原始碼]

假設另一個發行版位於 sda2

menuentry "Other Linux" {
	set root=(hd0,2)
	linux /boot/vmlinuz (add other options here as required)
	initrd /boot/initrd.img (if the other kernel uses/needs one)
}

或者讓 GRUB 根據 UUID 或文件系統標籤查找正確的分區:

menuentry "Other Linux" {
        # 假設 UUID 為 763A-9CB6
	search --no-floppy --set=root --fs-uuid 763A-9CB6

        # 按照 label OTHER_LINUX 來搜索(確保分區 label 是精確的)
        #search --no-floppy --set=root --label OTHER_LINUX

	linux /boot/vmlinuz (按需求在這裏添加其他的選項,例如: root=UUID=763A-9CB6 )
	initrd /boot/initrd.img (如果其他的內核需要的話)
}

如果其他發行版已經有一個有效的/boot文件夾,並安裝了GRUB、grub.cfg、kernel和initramfs,可以指示GRUB在啟動時即時加載這些其他grub.cfg文件。例如,對於hd0和第四個GPT分區:

menuentry "configfile hd0,gpt4"  {
    insmod part_gpt
    insmod btrfs
    insmod ext2
    set root='hd0,gpt4'
    configfile /boot/grub/grub.cfg
}

選擇此條目時,GRUB會從另一卷加載grub.cfg文件並顯示該菜單。在configfile返回後,文件中的命令所做的任何環境變量改變將不會被保留。按Esc返回到第一個GRUB菜單。

UEFI/GPT 模式下安裝的 Windows[編輯 | 編輯原始碼]

這個模式尋找 Windows 的啟動加載器的位置,然後當用户選擇了相應的菜單條目的時候,通過鏈式加載的方法在 GRUB 之後加載它。這裏主要的任務是找到 EFI 系統分區然後從上面運行啟動加載器。

注意: 這個啟動項僅在 UEFI 模式下才起作用,而且 Windows 和 UEFI 的位數必須相同。如果 GRUB 是 BIOS 模式,這個方法無效。參考 Arch + Windows 雙系統#Windows 在 UEFI 和 BIOS 上的限制Arch + Windows 雙系統#UEFI 和 BIOS 引導加載程序的限制
if [ "${grub_platform}" == "efi" ]; then
	menuentry "Microsoft Windows Vista/7/8/8.1 UEFI/GPT" {
		insmod part_gpt
		insmod fat
		insmod chain
		search --no-floppy --fs-uuid --set=root $hints_string $fs_uuid
		chainloader /EFI/Microsoft/Boot/bootmgfw.efi
	}
fi

其中 $hints_string$fs_uuid 由下述兩個命令得到。

$fs_uuid 命令檢測 EFI 系統分區的 UUID:

# grub-probe --target=fs_uuid esp/EFI/Microsoft/Boot/bootmgfw.efi
1ce5-7f28

或者你可以運行 blkid --fs 然後從結果中找到 EFI 系統分區的 UUID。

$hints_string 命令可以確定 EFI 系統分區的位置,在當前的例子中是 harddrive 0:

# grub-probe --target=hints_string esp/EFI/Microsoft/Boot/bootmgfw.efi
--hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1

這兩個命令都是假設 Windows 使用的 ESP 是掛載在$esp上的。當然,Windows的 EFI 文件路徑可能有變,因為這就是Windows....

BIOS/MBR 模式下安裝的 Windows[編輯 | 編輯原始碼]
注意: GRUB 支持直接啟動 bootmgr,如今啟動 BIOS/MBR 模式下安裝的 Windows 時不再需要鏈式加載分區啟動扇區了。
警吿: bootmgr 位於系統分區(system partition),而不是 Windows 系統所在的分區(通常為 C: 盤)。系統分區的文件系統標籤System Reserved 或者 SYSTEM 而且這個分區的容量只有大概 100 到 549 MB。詳情參考 Wikipedia:System partition and boot partition

本節假設你的 Windows 分區是 /dev/sda1。如果分區不同,需要對每一處 hd0,msdos1 進行修改。

注意: 這些菜單條目僅在 BIOS 啟動模式下可用,不能在 UEFI 模式下安裝的 GRUB 上使用。參考 Arch + Windows 雙系統#Windows 在 UEFI 和 BIOS 上的限制Arch + Windows 雙系統#UEFI 和 BIOS 引導加載程序的限制

在所有例子裏,XXXX-XXXX是指文件系統的 UUID,可以通過 lsblk --fs 命令得到。

對於 Windows Vista/7/8/8.1/10:

if [ "${grub_platform}" == "pc" ]; then
	menuentry "Microsoft Windows Vista/7/8/8.1/10 BIOS/MBR" {
		insmod part_msdos
		insmod ntfs
		insmod ntldr
		search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 XXXX-XXXX
		ntldr /bootmgr
	}
fi

對於 Windows XP:

if [ "${grub_platform}" == "pc" ]; then
	menuentry "Microsoft Windows XP" {
		insmod part_msdos
		insmod ntfs
		insmod ntldr
		search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 XXXX-XXXX
		ntldr /ntldr
	}
fi
注意: 在某些情況下,可能在安裝 Windows 8 之前就已經安裝了GRUB。啟動 Windows 時可能會出現\boot\bcd 報錯(錯誤代碼為 0xc000000f)。要修復這個問題,可以進入 Windows Recovery Console(安裝磁盤中的 cmd.exe)然後運行:
X:\> bootrec.exe /fixboot
X:\> bootrec.exe /RebuildBcd

不要 使用 bootrec.exe /Fixmbr,因為那會將 GRUB 清除掉。或者你可以用 Troubleshooting 菜單裏的 Boot Repair 函數,它不會清除 GRUB 而且可以修復大部分錯誤。而且最好是保證連接電腦的介質 只有 目標硬盤和你的可啟動介質,如果你連接了其他的設備,Windows 很可能會沒法修復啟動信息。

使用標籤[編輯 | 編輯原始碼]

通過使用search--label選項,可以使用人類易於閱讀的文件系統標籤。首先請確保你的文件系統有唯一標籤

然後你就可以使用標籤來添加一個條目:

menuentry "Arch Linux, session texte" {
  search --label --set=root archroot
  linux /boot/vmlinuz-linux root=/dev/disk/by-label/archroot ro
  initrd /boot/initramfs-linux.img
}

使用 GRUB 命令行[編輯 | 編輯原始碼]

MBR 太小,不足以存儲所有的 GRUB 模塊,所以 MBR 裏面只有啟動目錄和一些很基本的命令。GRUB 的主要功能通過 /boot/grub 裡的模塊實現,按需加載。出現錯誤時,GRUB 可能不能引導啟動(比如磁盤分區發生了變化)。這時候,一般會出現命令行界面。

GRUB 不止提供一個 shell,如果 GRUB 不能讀取到啟動目錄配置,但是能找到磁盤,你很可能會進入 "正常" shell:

grub>

如果有更嚴重的問題(比如 GRUB 找不到必須的文件了),GRUB 就可能會讓你進入 "救急" shell:

grub rescue>

救急模式下的 shell 是正常 shell 的一個嚴格的子集,其支持的功能更少。如果不幸進入了救急模式的 shell 裡,首先嘗試加載 normal 模塊,然後啟動正常 shell:

grub rescue> set prefix=(hdX,Y)/boot/grub
grub rescue> insmod (hdX,Y)/boot/grub/i386-pc/normal.mod
rescue:grub> normal

分頁支持[編輯 | 編輯原始碼]

GRUB 支持對長輸出進行分頁(比如運行 help 的輸出)。不過只能在正常 shell 中支持,在救急 shell 中則不支持。開啟分頁支持需要在 GRUB 命令行中鍵入:

sh:grub> set pager=1

使用命令行引導作業系統[編輯 | 編輯原始碼]

grub> 

可以使用 GRUB 命令行引導作業系統,一個典型的應用場景是通過「chainloading」來引導儲存在一個驅動器或者分區中的 Windows 或 Linux 系統。

ChainLoading 的意思是用當前的啟動加載器去加載另一個啟動加載器,所以叫做鏈式加載。

要被加載的另一個啟動加載器可能嵌入在一個有分區表的磁盤的頭部 (MBR),或在一個未分區磁盤或者一個分區的頭部 (VBR),也可能在使用 UEFI 的情形下是一個 EFI 可執行文件。

鏈式加載一個分區的 VBR[編輯 | 編輯原始碼]

set root=(hdX,Y)
chainloader +1
boot

X=0,1,2... Y=1,2,3...

比如鏈式加載一個位於首磁盤,首分區上的 Windows:

set root=(hd0,1)
chainloader +1
boot

同樣也可以使用 GRUB 鏈式加載另一個分區引導扇區上的 GRUB。

鏈式加載磁盤的 MBR 或未分區磁盤的 VBR[編輯 | 編輯原始碼]

set root=hdX
chainloader +1
boot

鏈式加載 UEFI 模式下安裝的 Windows/Linux[編輯 | 編輯原始碼]

insmod fat
set root=(hd0,gpt4)
chainloader (${root})/EFI/Microsoft/Boot/bootmgfw.efi
boot

insmod fat 用來加載 FAT 文件系統模塊,以訪問 EFI 系統分區上的 Windows 啟動加載器。 (hd0,gpt4)/dev/sda4 是該示例中的 EFI 系統分區。 chainloader 一行中的條目用來指定需要被鏈式加載的 .efi 文件。

正常加載[編輯 | 編輯原始碼]

請參考#使用救急控制台中的例子。

使用救急控制台[編輯 | 編輯原始碼]

請先閱讀#使用 GRUB 命令行。如果無法進入正常的命令行,請嘗試使用 Live CD 或者其他救急磁盤引導,然後修正配置錯誤,重新安裝 GRUB。不過有些時候我們手上沒有此類救急磁盤,這時救急控制台就可以派上用場了。

GRUB 應急控制台裡可用的命令有 insmodlssetunset。這個例子裏用了 setinsmodset 用來修改變量,insmod 用來加載模塊以添加功能。

首先,用户必須知道啟動分區 (/boot) 所在位置(是一個獨立的分區或者是根目錄下的子目錄),然後設置:

grub rescue> set prefix=(hdX,Y)/boot/grub

其中 X 是物理驅動器的編號,而 Y 是分區的編號。

注意: 如果啟動分區是個獨立的分區,要在路徑中省略 /boot(例如鍵入 set prefix=(hdX,Y)/grub)。

通過加載 linux 模塊來擴展命令行的功能:

grub rescue> insmod i386-pc/linux.mod

或者直接

grub rescue> insmod linux

這個模塊會啟動對我們熟悉的 linuxinitrd 命令的支持。

比如要啟動 Arch Linux:

set root=(hd0,5)
linux /boot/vmlinuz-linux root=/dev/sda5
initrd /boot/initramfs-linux.img
boot

如果 /boot 在單獨分區上(例如在用 UEFI 的時候),適當地進行修改:

注意: 因為 boot 是一個單獨的分區而不是根分區的一部分,你得手動把它的地址寫清楚,格式和前面的 prefix 一樣。
set root=(hd0,5)
linux (hdX,Y)/vmlinuz-linux root=/dev/sda6
initrd (hdX,Y)/initramfs-linux.img
boot
注意: 如果你在執行 linux 命令的時候遇到了 error: premature end of file /YOUR_KERNEL_NAME,你可以嘗試用 linux16 來替代。

成功啟動 Arch Linux 後,用户可以修正 grub.cfg 然後重新安裝 GRUB。

為了完全修正錯誤和重新安裝 GRUB,可能需要修改 /dev/sda。詳情請參考#安裝(BIOS)或者#安裝 2(UEFI)章節。

移除 GRUB[編輯 | 編輯原始碼]

UEFI系統[編輯 | 編輯原始碼]

刪除grub前,確保安裝了其它啟動加載器並配置其接管啟動引導工作。

$ efibootmgr
BootOrder: 0003,0001,0000,0002
Boot0000* Windows Boot Manager  HD(2,GPT,4dabbedf-191b-4432-bc09-8bcbd1d7dabf,0x109000,0x32000)/File(\EFI\Microsoft\Boot\bootmgfw.efi)
Boot0001* GRUB  HD(2,GPT,4dabbedf-191b-4432-bc09-8bcbd1d7dabf,0x109000,0x32000)/File(\EFI\GRUB\grubx64.efi)
Boot0002* Linux-Firmware-Updater        HD(2,GPT,5dabbedf-191b-4432-bc09-8bcbd1d7dabf,0x109000,0x32000)/File(\EFI\arch\fwupdx64.efi)
Boot0003* Linux Boot Manager    HD(2,GPT,4dabbedf-191b-4432-bc09-8bcbd1d7dabf,0x109000,0x32000)/File(\EFI\systemd\systemd-bootx64.efi)

如果BootOrder第一項是grub,安裝其它啟動加載器並放在其前面(比如上面的systemd-boot),然後grub可以通過使用bootnum刪除:

# efibootmgr --delete-bootnum -b 1

再刪除esp/EFI/grub/boot/grub 目錄。

BIOS系統[編輯 | 編輯原始碼]

要將grub替換為其它BIOS啟動加載器,只需要安裝該加載器,MBR啟動代碼將會被覆蓋。

grub-install還創建了/boot/grub目錄,需要手動刪除。如果你還想再次安裝grub,可以保留該目錄。

在遷移到UEFI/GPT後,使用dd移除MBR啟動代碼英語dd#Remove bootloader

疑難解答[編輯 | 編輯原始碼]

不支持的文件系統[編輯 | 編輯原始碼]

如果根目錄分區是一個GRUB不支持的文件系統,那就需要為 /boot 單獨分區,並使用一個支持的文件系統。某些情況下,GRUB 的開發版 grub-gitAUR 可能已經支持了那個文件系統。

如果將 GRUB 和一個不支持的文件系統一起用,它將無法提取到你的驅動器的 UUID,只能使用傳統的名稱 /dev/sdXx 來代替,而這個名稱是可能會變化的。此時你可能需要手動編輯 /boot/grub/grub.cfg,將 root=/dev/sdXx 改為 root=UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX。你可以使用 blkid 命令來獲取你的設備的 UUID ,參見 Persistent block device naming

儘管 GRUB 自2.0.4起支持 F2FS 文件系統,GRUB還是不能從啟用extra_attr flag 的 F2FS 分區正確讀取引導文件。

啟用調試信息[編輯 | 編輯原始碼]

注意: 每當你#生成主配置文件的時候,這個設定就會被覆蓋掉。

grub.cfg 中添加:

set pager=1
set debug=all

出現 「msdos-style」 錯誤消息[編輯 | 編輯原始碼]

grub-setup: warn: This msdos-style partition label has no post-MBR gap; embedding will not be possible!
grub-setup: warn: Embedding is not possible. GRUB can only be installed in this setup by using blocklists.
            However, blocklists are UNRELIABLE and its use is discouraged.
grub-setup: error: If you really want blocklists, use --force.

這個錯誤可能當你在 VMware 容器裏面安裝 GRUB 的時候出現。請閱讀相關連結。這種情況是因為首分區直接從 MBR 後開始(即第 64 個扇區),而不是和正常的那樣在 MBR 後面有 1MB(2048個扇區)的間隙。請參閱#主引導記錄 (MBR) 特殊操作

UEFI 異常[編輯 | 編輯原始碼]

常見安裝錯誤[編輯 | 編輯原始碼]

  • 一些UEFI設備會遇到Could not prepare Boot variable: Read-only file system錯誤。請通過
    # mount -o remount,rw,nosuid,nodev,noexec --types efivarfs efivarfs /sys/firmware/efi/efivars
    重新掛載/sys/firmware/efi/efivars開啟讀寫權限,參見Gentoo Wiki
  • 如果你在將 sysfs 或者 procfsgrub-install 一起使用的時候,遇到要求你必須運行 modprobe efivarfs 的問題,嘗試 使用上文的命令掛載efivarfs
  • 如果不用 --target 或者 --directory 選項,grub-install 不知道應該安裝哪一個固件。此時 grub-install 會輸出 source_dir does not exist. Please specify --target or --directory
  • 如果在運行 grub-install 以後,被吿知error: esp doesn't look like an EFI partition,那這個分區很可能不是FAT32格式。

在固件啟動管理器中創建一個GRUB條目[編輯 | 編輯原始碼]

grub-install會自動嘗試在啟動管理器中創建一個菜單項。如果沒有,請參見UEFI#efibootmgr,了解使用efibootmgr來創建菜單項的説明。問題也可能在於你沒有以UEFI模式啟動CD/USB,參見UEFI#Create UEFI bootable USB from ISO

另一種在固件引導管理器中創建GRUB條目的方法是使用efibootmgr -c,這個命令默認 /dev/sda1 是EFI系統分區,並且掛載到了/boot/efi,這也是efibootmgr的默認行為。該命令在引導選項表頂部創建了一個名為「Linux」的啟動項目,傳遞其它參數可調整默認行為。生成的OS引導器位於\EFI\arch\grub.efi

啟動時進入了救急控制台[編輯 | 編輯原始碼]

如果 GRUB 直接就啟動到了救急控制台下,而且沒報錯,這可能是因為如下兩種原因:

  • 可能是因為 grub.cfg 丟失或者位置不對。如果 GRUB UEFI 安裝時設定了 --boot-directory 參數,而 grub.cfg 文件卻不在那裏,就會發生這樣的問題。
  • 如果啟動分區的分區號發生了變化(這個分區號會被直接編碼到 grubx64.efi 文件中),也會出現這個問題。

GRUB UEFI 無法加載[編輯 | 編輯原始碼]

下面是一個正常的 UEFI 的示例:

# efibootmgr -u
BootCurrent: 0000
Timeout: 3 seconds
BootOrder: 0000,0001,0002
Boot0000* GRUB HD(1,800,32000,23532fbb-1bfa-4e46-851a-b494bfe9478c)File(\EFI\GRUB\grubx64.efi)
Boot0001* Shell HD(1,800,32000,23532fbb-1bfa-4e46-851a-b494bfe9478c)File(\shellx64.efi)
Boot0002* Festplatte BIOS(2,0,00)P0: SAMSUNG HD204UI

如果啟動後,屏幕直接變黑,幾秒後就跳到了下一個啟動項,根據相關連結的説法是,將 GRUB 移動到 root 分區上可能會解決這個問題。必須先刪除啟動項,然後在移動 GRUB 後重建。操作之後上述命令的輸出中,GRUB 條目應該像這樣:

Boot0000* GRUB HD(1,800,32000,23532fbb-1bfa-4e46-851a-b494bfe9478c)File(\grubx64.efi)

缺省/後備啟動路徑[編輯 | 編輯原始碼]

一些 UEFI 固件在顯示 UEFI NVRAM 啟動條目之前,需要在一個已知的位置上有一個可啟動文件。如果是這種情況, grub-install 會説明 efibootmgr 添加了一個啟動 GRUB 的條目,但這個條目不會在 VisualBIOS 啟動順序選擇器中顯示。解決方法是把 GRUB 安裝到缺省/後備啟動路徑當中:

# grub-install --target=x86_64-efi --efi-directory=esp --removable

或者你可以把已經安裝好的 GRUB EFI 執行文件移動到缺省/後備路徑中:

# mv esp/EFI/grub esp/EFI/BOOT
# mv esp/EFI/BOOT/grubx64.efi esp/EFI/BOOT/BOOTX64.EFI

"Invalid signature"(無效簽名錯誤)[編輯 | 編輯原始碼]

如果在啟動 Windows 時出現了 "invalid signature" 錯誤(比如在重新分區或者添加了新硬盤後),刪除 GRUB 的設備配置,然後讓它重建一個:

# mv /boot/grub/device.map /boot/grub/device.map-old
# grub-mkconfig -o /boot/grub/grub.cfg

grub-mkconfig 此時就應該生成了新的啟動項了,包括 Windows。確認能啟動成功後,再將備份文件 /boot/grub/device.map-old 刪除。

引導過程卡死[編輯 | 編輯原始碼]

如果在 GRUB 加載內核並初始化 ramdisk 後引導過程卡死了,又沒有錯誤信息的話,請嘗試移除 add_efi_memmap 這個內核參數。

其他系統不能自動發現 Arch Linux[編輯 | 編輯原始碼]

有人發現有些發行版不能使用 os-prober 自動發現 Arch Linux。據説如果 /etc/lsb-release 文件存在的話,可以提高探測能力。這個文件和和更新工具可以在 lsb-release 包中找到。

在 chroot 環境下安裝時遇到警吿[編輯 | 編輯原始碼]

當位於 chroot 環境裏,要在 LVM 系統上安裝 GRUB 的時候(比如在安裝系統的時候),你可能會收到一個這樣的警吿:

/run/lvm/lvmetad.socket: connect failed: No such file or directory

或者

WARNING: failed to connect to lvmetad: No such file or directory. Falling back to internal scanning.

這是因為在 chroot 環境裏面 /run 是不可用的。只要每個步驟都做對了,這些警吿不會影響系統啟動,你可以放心繼續進行下一步的系統安裝。

GRUB 加載非常慢[編輯 | 編輯原始碼]

當磁盤空間很小的時候 GRUB 的加載時間可能會很長。如果你遇到了這樣的問題,檢查一下你的 /boot 或者 / 分區是不是有足夠的剩餘空間。

error: unknown filesystem(未知文件系統錯誤)[編輯 | 編輯原始碼]

因某些原因,GRUB 可能會不能啟動並輸出 error: unknown filesystem。如果你確定所有的 UUID 都對了而且所有的文件系統都是有效而且被 GRUB 支持的,問題的原因可能是你的 BIOS 啟動分區不在驅動器的前 2 TB 空間裏 [4]。 選擇一個分區工具調整這個分區,讓它完全在前 2 TB 空間中,然後重新安裝和配置 GRUB。

這個錯誤也可能是因為一個 ext4 文件系統擁有 GRUB 不支持的特性:

  • large_dir - 不被支持。
  • metadata_csum_seed - GRUB 2.11 將會支持(commit)。
警吿: 當你在/boot中啟用文件系統特性時,請確保grub支持你的 文件系統 特性。

grub-reboot 不能重新設定[編輯 | 編輯原始碼]

GRUB 好像不能寫入 Btrfs 格式的根分區[5]。如果你使用 grub-reboot 來啟動到另一個啟動條目,就會沒法更新其 on-disk 環境。要麼換一個啟動條目來運行 grub-reboot(例如在不同發行版之間切換的時候),要麼考慮換個文件系統。你可以通過運行 grub-editenv create 來重設一個 "sticky" 條目,然後在 /etc/default/grub 中設置 GRUB_DEFAULT=0(不要忘了運行 grub-mkconfig -o /boot/grub/grub.cfg)。

不能在舊的 Btrfs 上進行安裝[編輯 | 編輯原始碼]

如果一個驅動器在沒有創建分區表的情形下被格式化成 BTRFS(比如 /dev/sdx),之後又創建了一個分區表,那麼會有部分 Btrfs 格式保留下來。大部分功能和作業系統都不會注意這個,但是 GRUB 則無法安裝,即使使用 --force 參數也不行。

# grub-install: warning: Attempting to install GRUB to a disk with multiple partition labels. This is not supported yet..
# grub-install: error: filesystem `btrfs' does not support blocklists.

你可以把整個驅動器置零來解決問題,但還有一個辦法既簡單又能保留你的數據,那就是用 wipefs -o 0x10040 /dev/sdx 命令來擦掉 Btrfs superblock。

未找到 Windows 8/10[編輯 | 編輯原始碼]

Windows 8/10 如果啟用了 "Hiberboot", "Hybrid Boot" 或 "Fast Boot",可能會導致 Windows 分區無法被掛載。所以 grub-mkconfig 無法找到安裝的 Windows。在 Windows 裡禁用 Hiberboot,然後它就可以被添加到 GRUB 菜單了。


GRUB 救急與加密啟動[編輯 | 編輯原始碼]

在使用加密啟動,而你沒法鍵入正確的密碼的時候,就會進入 GRUB 救急命令行。

這個救急命令行只有有限的功能,可以使用下面的命令來完成啟動:

grub rescue> cryptomount <分區>
grub rescue> insmod normal
grub rescue> normal

更好的介紹參見 這個帖子[失效連結 2023-04-23 ⓘ]

GRUB 已安裝但引導過程沒有顯示菜單[編輯 | 編輯原始碼]

檢查/etc/default/grub中的GRUB_TIMEOUT 是否設置成了0,設置為一個正數來調整GRUB條目加載前的等待時間,按秒計時。另外要檢查GRUB_TIMEOUT_STYLE是否為hidden,設置為menu確保菜單顯示。重新生成主配置文件後,重啟檢查設置是否生效。

如果仍然沒有解決問題,可能存在圖形終端的兼容問題。設置/etc/default/grub中的GRUB_TERMINAL_OUTPUTconsole關閉GRUB圖形終端。

參閱[編輯 | 編輯原始碼]