GRUB - Arch Linux 中文维基

跳至內容

# GRUB

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 GRUB，最近一次同步於 2024-11-29，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- Arch boot process
- 分區#主引導記錄
- 分區#GUID 分區表
- Unified Extensible Firmware Interface
- GRUB Legacy
- /EFI examples
- GRUB/技巧和竅門
- 多引導USB設備

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

注意：在本文中，`esp` 表示EFI 系統分區（ESP）的掛載點。

## 受支持的文件系統

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

警告：文件系統可能會獲得一些GRUB還未支持的新特性，除非關閉這些不兼容的特性，否則這些特性無法適用於`/boot`。通常規避這個問題的方式是使用一個單獨的/boot分區，並格式化為通用的文件系統，如FAT32。

## UEFI 系統

注意：

- 建議閱讀並理解統一可擴展固件接口 (UEFI)，分區#GUID 分區表 和 Arch 的啟動流程#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。

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

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

1. 掛載 EFI 系統分區。需要注意的是在本節的內容裡，把 `esp` 替換成ESP分區掛載點；
2. 選擇一個bootloader-id，在本例被稱為 `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，那你必須要使用該選項。某些台式機主板只會在此位置尋找 EFI 可執行文件，因此該選項是必需的，尤其是微星（MSI）主板。 如果你更新了UEFI，啟動項可能會在更新後丟失。因此可以創建一個「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二進制文件包含了全部用於讀取含有vmlinuz和initramfs鏡像的文件系統的必要模塊時，才可以成功進入安全啟動模式。

自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） / 可信平台模塊支持
- "高級"模塊，包含以下模塊：
  - `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兆字節（使用 fdisk 或 gdisk 和參數`+1M`）的分區，將分區類型設置為 GUID `21686148-6449-6E6F-744E-656564454649`。

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

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

第一個分區之前的空間也可以用作 BIOS 啟動分區，但是這會違反 GPT 對齊規範。因為這個分區不會經常訪問，所以性能的影響很小，只不過有些分區工具會發出警告。可以在 fdisk 或 gdisk 中創建一個從 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二進制文件不支持的功能，錯誤的配置文件可能會導致系統無法引導，請更新或重新安裝引導器（見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 內核添加條目。

提示：

- 每次安裝或者移除一個內核後，你都需要重新運行一次 grub-mkconfig 命令。
- 若要管理多個 GRUB 條目，比如既使用 linux包 又使用 linux-lts包 內核，相關的提示可以參見 GRUB/技巧和竅門#多個啟動條目。

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

如果想要添加自定義條目，你可以編輯 `/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 Reserved`或`SYSTEM`），以root身份運行os-prober包來檢測並為其生成啟動菜單項。

注意：

- `os-prober` 會嘗試使用 `grub-mount` 來掛載並檢測某個分區中是否存在所必需的 `.efi` 文件。可能需要安裝 fuse3包 以確保 `grub-mount` 正常工作，否則將無法檢測到 Windows 系統。
- 通過默認 Linux 驅動掛載的 NTFS 分區可能無法被檢測到。如果 GRUB 無法檢測到，嘗試安裝NTFS-3G並重新掛載分區。

#### 額外的參數

如想為 Linux 鏡像添加額外的參數，你可以在 `/etc/default/grub` 中設置 `GRUB_CMDLINE_LINUX` 和 `GRUB_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/grub` 中 `GRUB_DISABLE_RECOVERY` 沒有設置為 `true`。

更多信息請參考內核參數。

#### 設置啟動菜單的頂層啟動項

默認情況下grub-mkconfig使用`sort -V`對內核進行排序，並把第一個內核作為頂層啟動項。也就是說，如果你同時安裝了linux-lts包和linux包 ，因為`/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`調用`cryptomount`，`insmod normal`和`normal`。這在新版裡不再需要，`grub-install` 已經足夠了。但是從2.06版升級後，你可能需要至少運行`grub-mkconfig -o /boot/grub/grub.cfg`一次。

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

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

### 定製 grub.cfg

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

原因：添加指導如何編寫一個定製的 `/boot/grub/grub.cfg`。User: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)需要`LoaderDevicePartUUID`UEFI變量以正常工作。要使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/技巧和竅門#多個啟動條目。

對於 Archiso 和 Archboot 啟動菜單條目，參見 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.efi` 到 `esp/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 應急控制台裡可用的命令有 `insmod`，`ls`，`set` 和 `unset`。這個例子裡用了 `set` 和 `insmod`。`set` 用來修改變量，`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

這個模塊會啟動對我們熟悉的 `linux` 和 `initrd` 命令的支持。

比如要啟動 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）。

## 疑難解答

### os-prober 段錯誤

提示：此問題已於 2:2.12.r260.gaae2ea61-1 被修復。

- archlinux/packaging/packages/grub#11
- 論壇主題

在將 grub包 升級到 grub 2:2.12.r212.g4dc616657-2 後，運行 `grub-mkconfig` 時 os-prober包 會出現段錯誤。

`grub-mkconfig` 的輸出類似於：

    Generating grub configuration file ...
    Warning: os-prober will be executed to detect other bootable partitions.
    Its output will be used to detect bootable binaries on them and create new boot entries.
    /usr/lib/os-probes/50mounted-tests: line 72: 164878 Segmentation fault      grub-mount "$partition" "$tmpmnt" 2> /dev/null
    Adding boot menu entry for UEFI Firmware Settings ...
    done

此時嘗試進入 Windows 系統，會顯示：

    Setting partition type to 0x83
    error: invalid signature.

    Press any key to continue..._

這似乎是上游問題[4]，同樣的問題影響了 archlinux/packaging/packages/grub#12。已有部分用戶提供了解決方案：

#### 降級 grub

將 grub包 降級至 2:2.12-3。

#### 自行編寫啟動條目

參照#定製 grub.cfg 一節自行編寫啟動條目。

對於 BIOS/MBR 模式下安裝的 Windows，使用上文提供的示例配置（使用 search 關鍵字）很可能不奏效，對此，請使用以下配置：

    menuentry "Microsoft Windows Vista/7/8/8.1/10 BIOS/MBR" {
        insmod part_msdos
        insmod ntfs
        set root=(hdX,msdosY)
        chainloader +1
    }

### 不支持的文件系統

如果根目錄分區是一個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 或者 procfs 與 grub-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 空間裡 [5]。 選擇一個分區工具調整這個分區，讓它完全在前 2 TB 空間中，然後重新安裝和配置 GRUB。

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

- `large_dir` - 不被支持。
- `metadata_csum_seed` - GRUB 2.11 將會支持(commit)。

警告：當你在`/boot`中啟用文件系統特性時，請確保grub支持你的 文件系統 特性。

### grub-reboot 不能重新設定

GRUB 好像不能寫入 Btrfs 格式的根分區[6]。如果你使用 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

更好的介紹參見這個帖子。

### GRUB 已安裝但引導過程沒有顯示菜單

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

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

### 在舊的 Lenovo 設備上安裝好 GRUB 後依然有「ERROR CODE 1962 - No operating system found」的錯誤消息

參見這個連結。

## 參閱

- Wikipedia:GNU GRUB
- 官方 GRUB 手冊
- GRUB 的 Ubuntu wiki 頁面
- 描述為 UEFI 系統編譯的 GRUB wiki 頁面
- Wikipedia:BIOS Boot partition
- 怎樣配置 GRUB

分類：​

- 啟動加載程序
- GNU

GRUB
新增話題