GRUB Legacy - Arch Linux 中文维基

跳至內容

# GRUB Legacy

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

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

相關文章

- Arch boot process
- Boot debugging
- 內核參數

GRUB Legacy 是一個原本由 GNU Project 維護的多啟動引導器，其前身為 GRUB (GRand Unified Bootloader), 最初由 Erich Stefan Boleyn 設計和實現。

簡單的說，啟動引導程序是計算機啟動時運行的第一個程序。它可用於選擇作業系統分區上的不同內核，也可用於向這些內核傳遞啟動參數。然後內核逐個初始化作業系統的其餘部分。

警告：上游已停止維護 GRUB Legacy 並且 Arch 官方也停止支持 (見這條新聞). 我們推薦用戶使用 GRUB(2) 或 Syslinux 來替代。見 升級到 GRUB2.
注意：如果你在你的系統裡把 grub-legacy 安裝為包 grub-0.97, 那麼在軟體包升級時會升級為包 grub包-2.xx (GRUB2). 如果你想繼續使用 grub-legacy, 從 AUR 安裝包 grub-legacyAUR 以避免衝突。升級過程中只改變了 `/usr/lib/grub/` 裡的文件，grub-legacy 安裝到 `/boot/grub` 的文件和 `MBR` 並未被移除。 只需重命名 `/boot/grub/menu.lst.pacsave` 為 `/boot/grub/menu.lst` 即可啟動進入 grub-legacy.

## 安裝

GRUB Legacy 已從官方源移除以支持 GRUB version 2.x. 但依然可以通過 grub-legacyAUR 安裝。

另外，若想 GRUB 以引導器工作它必須被安裝到設備或分區的引導扇區。這在安裝啟動器部分有所提及。

## 升級到 GRUB2

### 必須升級嗎?

不是必須的。老 GRUB 不會從系統刪除，照舊工作。

然而，和其它不被支持的軟體包一樣，後續的 bug 將無人修復。所以建議所有的用戶抽時間升級到 GRUB version 2.x, 或其它支持的 Boot loader.

GRUB legacy 不支持 GPT 硬碟，Btrfs 文件系統和 UEFI 固件。

### 如何升級

升級 GRUB Legacy 到 GRUB version 2.x 和在已有 Arch Linux 上安裝 GRUB 一樣。詳細教程見這裡。

### 區別

- GRUB Legacy 和 GRUB 的命令之間有許多區別。執行命令之前請學習 GRUB commands (例如 "find" 被替換為 "search").
- GRUB 現在是模塊化的並再也不需要 "stage 1.5". 因此，引導器本身受到限制 -- 若想擴展功能必須加載模塊 (例如為了添加 LVM 或 RAID 支持).
- GRUB Legacy 和 GRUB 顯示的設備名不同。分區從 1 而不是 0 開始計數，但驅動器依然從 0 開始，並添加了分區表前綴。例如，`/dev/sda1` 會顯示為 `(hd0,msdos1)` (對於 MBR) 或 `(hd0,gpt1)` (對於 GPT).
- GRUB 顯著比 GRUB legacy 大 (占用 `/boot` ~13 MB ). 如果你從單獨的 `/boot` 分區啟動並且它小於 32 MB, 你就會碰到硬碟空間問題，pacman 不會安裝新的內核。

#### 備份重要數據

儘管 GRUB 會平滑地完成安裝，我們依然強烈建議在升級到 GRUB v2 之前備份 GRUB Legacy 的文件。

    # mv /boot/grub /boot/grub-legacy

備份含有引導代碼和分區表的 MBR (把 `/dev/sdX` 替換為你的真實路徑):

    # dd if=/dev/sdX of=/path/to/backup/mbr_backup bs=512 count=1

MBR 只有 446B 包含引導代碼，接下來的 64B 包含分區表。如果你不想在恢復時覆蓋分區表，我們強烈建議只備份 MBR 引導代碼:

    # dd if=/dev/sdX of=/path/to/backup/bootcode_backup bs=446 count=1

如果無法正常安裝 GRUB2 , 見恢復 GRUB Legacy.

### 把 GRUB Legacy 的配置文件轉換為新格式

如果 `grub-mkconfig` 失敗，如下轉換你的 `/boot/grub/menu.lst` 為 `/boot/grub/grub.cfg`:

    # grub-menulst2cfg /boot/grub/menu.lst /boot/grub/grub.cfg

注意：該選項僅在 BIOS 系統有效，UEFI 系統則不。

例如:

    /boot/grub/menu.lst

    default=0
    timeout=5

    title  Arch Linux Stock Kernel
    root   (hd0,0)
    kernel /vmlinuz-linux root=/dev/sda2 ro
    initrd /initramfs-linux.img

    title  Arch Linux Stock Kernel Fallback
    root   (hd0,0)
    kernel /vmlinuz-linux root=/dev/sda2 ro
    initrd /initramfs-linux-fallback.img

    /boot/grub/grub.cfg

    set default='0'; if [ x"$default" = xsaved ]; then load_env; set default="$saved_entry"; fi
    set timeout=5

    menuentry 'Arch Linux Stock Kernel' {
      set root='(hd0,1)'; set legacy_hdbias='0'
      legacy_kernel   '/vmlinuz-linux' '/vmlinuz-linux' 'root=/dev/sda2' 'ro'
      legacy_initrd '/initramfs-linux.img' '/initramfs-linux.img'
    }

    menuentry 'Arch Linux Stock Kernel Fallback' {
      set root='(hd0,1)'; set legacy_hdbias='0'
      legacy_kernel   '/vmlinuz-linux' '/vmlinuz-linux' 'root=/dev/sda2' 'ro'
      legacy_initrd '/initramfs-linux-fallback.img' '/initramfs-linux-fallback.img'
    }

如果你忘了創建 GRUB `/boot/grub/grub.cfg` 配置文件然後啟動進了 GRUB Command Shell, 輸入:

    sh:grub> insmod legacycfg
    sh:grub> legacy_configfile ${prefix}/menu.lst

啟動進 Arch 重新創建 GRUB `/boot/grub/grub.cfg` 配置文件。

### 恢復 GRUB Legacy

- 移除 GRUB v2 的文件:

    # mv /boot/grub /boot/grub.nonfunctional

- 複製 GRUB Legacy 到 `/boot`:

    # cp -af /boot/grub-legacy /boot/grub

- 從備份恢復 sda 的 MBR 以及接下來的 62 扇區

警告：該命令也恢復了分區表，所以以舊版覆蓋修改過的分區表時請小心，它將會導致系統混亂。

    # dd if=/path/to/backup/first-sectors of=/dev/sdX bs=512 count=1

以下是一個更安全的，只恢復 MBR 引導代碼的方法:

    # dd if=/path/to/backup/mbr-boot-code of=/dev/sdX bs=446 count=1

## 配置

配置文件位於 `/boot/grub/menu.lst`。按照你的要求編輯這個文件。

- `timeout #` -- 默認作業系統被自動加載前的等待時間(單位是秒)。
- `default #` -- 超時時默認的啟動項。

一個範例配置文件(`/boot` 位於獨立分區中):

    /boot/grub/menu.lst

    # Config file for GRUB - The GNU GRand Unified Bootloader
    # /boot/grub/menu.lst

    # DEVICE NAME CONVERSIONS
    #
    #  Linux           GRUB
    # -------------------------
    #  /dev/fd0        (fd0)
    #  /dev/sda        (hd0)
    #  /dev/sdb2       (hd1,1)
    #  /dev/sda3       (hd0,2)
    #

    #  FRAMEBUFFER RESOLUTION SETTINGS
    #     +-------------------------------------------------+
    #          | 640x480    800x600    1024x768   1280x1024
    #      ----+--------------------------------------------
    #      256 | 0x301=769  0x303=771  0x305=773   0x307=775
    #      32K | 0x310=784  0x313=787  0x316=790   0x319=793
    #      64K | 0x311=785  0x314=788  0x317=791   0x31A=794
    #      16M | 0x312=786  0x315=789  0x318=792   0x31B=795
    #     +-------------------------------------------------+
    #  for more details and different resolutions see
    #  https://wiki.archlinux.org/index.php/GRUB#Framebuffer_Resolution

    # general configuration:
    timeout   5
    default   0
    color light-blue/black light-cyan/blue

    # boot sections follow
    # each is implicitly numbered from 0 in the order of appearance below
    #
    # TIP: If you want a 1024x768 framebuffer, add "vga=773" to your kernel line.
    #
    #-*

    # (0) Arch Linux
    title  Arch Linux
    root   (hd0,0)
    kernel /vmlinuz-linux root=/dev/sda3 ro
    initrd /initramfs-linux.img

    # (1) Windows
    #title Windows
    #rootnoverify (hd0,0)
    #makeactive
    #chainloader +1

### 尋找 GRUB 的根分區

GRUB 必須被告知它的文件位於文件系統的位置。因為可能有多個系統存在 (也就是在多啟動環境中)。 GRUB 文件總是位於`/boot`，它有可能在一個獨立的分區中。

注意：GRUB 定義的存儲設備的方式與傳統的內核命名方式不同。

- 硬碟定義為 (hdX)；這也可以用來指定任何 USB 存儲設備。
- 設備和分區的編號從0開始。例如，BIOS 識別出的第一個硬碟被定為 (hd0)。第二個設備被叫做 (hd1)。這也應用到分區。因此第一個硬碟上的第二個分區叫做 (hd0,1).

如果你不知道 `/boot` 的位置，使用 GRUB shell `find` 命令來定位 GRUB 文件。以 root 身份進入 GRUB shell:

    # grub

下面的例子適用於沒有獨立 `/boot` 分區的系統。此時 `/boot` 只是 `/` 下的一個目錄:

    grub> find /boot/grub/stage1

下面的例子適用於有獨立的 `/boot` 分區的系統:

    grub> find /grub/stage1

GRUB 會找到這個文件，然後輸出 `stage1` 文件的位置。例如:

    grub> find /grub/stage1

     (hd0,0)

這個返回值需要輸入到配置文件的 `root` 行。輸入 `quit` 退出這個 shell.

### 雙啟動到 Windows

添加以下內容到你的 `/boot/grub/menu.lst` 末尾 (假設你的 Windows 分區是第一個設備的第一個分區):

    /boot/grub/menu.lst

     title Windows
     rootnoverify (hd0,0)
     makeactive
     chainloader +1

注意：

- 如果你嘗試雙啟動到 Windows 7，你需要注釋掉 `makeactive` 行。
- Windows 2000 和之後的版本不需要在第一個分區就可以啟動(與通常認為的不同)。如果 Windows 分區改變了 (也就是說，如果你在 Windows 分區的前面添加了一個分區)，你需要編輯 Windows 的 `boot.ini` 文件來應對改變。(參見本文獲取更多細節。

如果 Windows 位於另一塊硬碟，需要使用 map 命令。這會欺騙你的 Windows 安裝程序，讓它以為自己在主硬碟上。假設你的 Windows 分區是在第二塊硬碟上的第一個分區:

    /boot/grub/menu.lst

     title Windows
     map (hd0) (hd1)
     map (hd1) (hd0)
     rootnoverify (hd1,0)
     makeactive
     chainloader +1

注意：如果你嘗試雙啟動到 Windows 7，你需要注釋掉 `makeactive` 行。

### 雙啟動到 GNU/Linux

和Arch linux的加載方式一樣。例如:

    /boot/grub/menu.lst

     title Other Linux
     root (hd0,2)
     kernel /path/to/kernel root=/dev/sda3 ro
     initrd /path/to/initrd

注意：也許需要額外的選項，同時也可能不需要使用初始化內存檔。檢查一下另一個發行版的 `/boot/grub/menu.lst` 來得到啟動選項，或者參考 #chainloader 和 configfile (推薦)。

### chainloader 和 configfile

為了方便系統維護，應該使用 `chainloader` 和 `configfile` 命令以啟動提供了」自動化「引導機制的其他 Linux 作業系統(例如： Debian, Ubuntu, openSUSE),這樣就允許每個發行版自行維護各自的 `menu.lst` 啟動選項。

- `chainloader`命令能裝載其他的啟動引導器（而不是內核鏡像)； 當其他的啟動引導器安裝在一個分區的啟動扇區(例如：GRUB)時就有用了. 這樣就可以實現在 MBR 安裝一個「主」GRUB 和在每個分區的引導記錄區 (PBR) 安裝一些分散的 GRUB.

- {ic|configfile}}命令能指導 GRUB 裝載確切的配置文件. 這樣就可以引導其他的作業系統的 `menu.lst` 而不需要在引導的作業系統上安裝 GRUB. 這種方法一大缺陷就是其他作業系統的 `menu.lst` 可能和安裝的 GRUB 版本不兼容; 許多版本的作業系統高度依賴於 GRUB 的版本。

例如, GRUB 即將安裝在 MBR (主引導記錄區)上，但是其他的啟動引導器(可能是 GRUB 或者 LILO)已經安裝到了 `(hd0,2)` 啟動扇區。

    ---------------------------------------------
    |   |           |           |   %           |
    | M |           |           | B %           |
    | B |  (hd0,0)  |  (hd0,1)  | L %  (hd0,2)  |
    | R |           |           |   %           |
    |   |           |           |   %           |
    ---------------------------------------------
      |                           ^
      |       chainloading        |
      -----------------------------

你可以在 `menu.lst` 下添加:

    title Other Linux
    root (hd0,2)
    chainloader +1

或者，當 `(hd0,2)` 上的啟動引導器是 GRUB 時:

    title Other Linux
    root (hd0,2)
    configfile /boot/grub/menu.lst

`chainloader` 命令也可以用來裝載第二個驅動器的 MBR:

    title Other drive
    rootnoverify (hd1)
    chainloader +1

### 雙啟動 GNU/Linux (GRUB2)

如果其他 Linux 發行版用 GRUB2 (如：Ubuntu 9.10或者更高版本)，而且你在它的/分區安裝了啟動裝載程序, 你可以添加如下條目到你的 `/boot/grub/menu.lst`:

    /boot/grub/menu.lst

     # other Linux using GRUB2
     title Ubuntu
     root (hd0,2)
     kernel /boot/grub/core.img

在啟動時選擇這個條目就可以引導其他發行版的 GRUB2 菜單 (假設安裝在 `/dev/sda3`)。

## 安裝啟動器

### 手動恢復 GRUB 庫

`*stage*` 文件在 `/boot/grub` 目錄下, 但是在如下情況下沒有：啟動裝載程序在系統安裝時沒有安裝或者/分區的文件系統損壞，意外刪除等。

使用如下的命令手動複製 GRUB 的庫文件:

    # cp -a /usr/lib/grub/i386-pc/* /boot/grub

{{注意|如果單獨分區的話，不要忘記掛載系統的 {{ic|/boot} 分區!(上文假設 `/boot} 分區既可以掛載在根分區也可以掛載在根分區的/boot目錄下!)`

### 安裝 GRUB 的常識

GRUB 有可以一個單獨的介質安裝(例如:一張 LiveCD),或者直接從運行著的 Arch 中安裝。GRUB 啟動引導器很少需要重新安裝，當遇到如下情況時不需要安裝:

- 更新了配置文件。
- 升級了軟體包 grub-legacyAUR.

遇到如下請況時需要安裝:

- 引導器還沒有安裝。
- 其他的作業系統覆蓋了 Linux 的引導器。
- 引導器因為一些未知的原因未能成功引導系統。

在重裝或安裝之前，請注意以下幾點:

- 在進行操作之前確保你的GRUB配置文件是正確的 (`/boot/grub/menu.lst`)。請參考#尋找 GRUB 的根分區以確認你的設備被正確的定義。
- GRUB 必須安裝在 MBR (硬碟的第一扇區)，或者在能被大多數 BIOS 識別的第一個存儲設備的第一個分區。為了滿足個人的多系統引導需求，GRUB 的多重設置就起作用了，請參考#chainloader 和 configfile.
- 在安裝 GRUB 啟動引導器時可能需要在 `chroot` 過的環境下完成 (例如：通過安裝光碟 chroot 安裝的系統)，比如你編輯RAID的配置文件或者你忘記安裝或者破壞了你的 GRUB, 你都需要通過一張 LiveCD 或者其他的 Linux 作業系統 Change root (即更改root目錄).

首先，進入 GRUB shell:

    # grub

使用 `root` 命令配合 `find` 的輸出 (見 #尋找 GRUB 的根分區)，以告訴 GRUB 哪個分區包含了 stage1 (同理還有 `/boot`):

    grub> root (hd1,0)

提示：GRUB Shell 支持 Tab 補全，如果你鍵入'root (hd'然後連續敲擊 `Tab` 兩次你就可以看見可用的存儲分區設備，在分區下也適用，Tab 補全在 GRUB 引導菜單上也適用，如果你的配置文件有錯誤你可以在引導菜單裡編輯並使用 Tab 補全來協助尋找驅動器和分區。請參考#在引導菜單中編輯 GRUB 條目.

### 安裝到 MBR

下面的例子中把 GRUB 安裝到第一個驅動器的 MBR:

    grub> setup (hd0)

### 安裝到分區

下面的例子中把 GRUB 安裝到第一個驅動器的第一個分區:

    grub> setup (hd0,0)

在運行 `setup` 完成之後, 鍵入 `quit` 退出 shell. 如果你chroot 過，退出 chroot 並卸載分區。現在重啟測試一下。

### 備選方案 (grub-install)

注意：這個方法不怎麼可靠，推薦使用 GRUB shell.

使用 `grub-install` +你安裝啟動裝載程序的分區。例如將 GRUB 安裝到第一個驅動器的 MBR:

    # grub-install /dev/sda

GRUB 會提示它是否安裝成功. 如果沒有安裝成功，你得用 GRUB Shell.

## 小技巧

額外的配置筆記。

### Framebuffer 解析度

我們可以用 `menu.lst` 裡給出的解析度，但也許你想使用 LCD 寬屏的最大原生解析度。如下操作:

在 Wikipedia上，列出了 framebuffer 解析度 (即排除了 VBE 標準中的). 但是，比如我想用 1440x900 (`vga=867`) 卻用不了。這是因為顯卡製造商可以隨便設置並非 VBE 3 標準的數字，這就導致了卡與卡之間編碼不同 (就算是同一個製造商)。

所以除了使用表格以外，你可以使用如下方法得到正確的編碼:

#### GRUB 可識別的值

只使用 GRUB 的話有一個簡單的方法來獲得正確的編碼。

在 kernel 行，讓內核詢問該使用什麼模式。

    kernel /vmlinuz-linux root=/dev/sda1 ro vga=ask

重啟。GRUB 現在會展示一系列可用的編碼以及一個掃描更多的選項。

你可以選擇你想要的編碼 (別把它忘了，下一步還要用) 並在啟動時使用。

在 kernel 行把 `ask` 替換為你選擇的正確編碼。

例如，`[369] 1680x1050x32` 的 kernel 行看起來如下:

    kernel /vmlinuz-linux root=/dev/sda1 ro vga=0x369

#### hwinfo

1. 從官方源安裝 hwinfo包.
2. 以 root 身份運行 `hwinfo --framebuffer`.
3. 選擇代表了你想要的解析度的編碼。
4. 在該6位數字編碼前加上 0x 前綴，並把它加入到 `menu.lst` kernel 行的 `vga=` 選項後。或是轉換為十進制以避免使用 0x 前綴。

hwinfo 輸出樣例:

    Mode 0x0364: 1440x900 (+1440), 8 bits
    Mode 0x0365: 1440x900 (+5760), 24 bits

以及 kernel 行:

    kernel /vmlinuz-linux root=/dev/sda1 ro vga=0x0365

### 給分區命名

#### 按盤符

如果你偶爾會調整 (或準備去調整) 分區大小你可以考慮按盤符給你的分區/驅動器命名。如下命名 ext2, ext3, ext4 分區:

    e2label /dev/drive|partition label

名字可以長達16個字符但不能有空格。在你的 `menu.lst` 裡設置:

    kernel /boot/vmlinuz-linux root=/dev/disk/by-label/Arch_Linux ro

#### 按 UUID

可使用 `blkid` 或 `ls -l /dev/disk/by-uuid` 來獲取分區的 UUID (Universally Unique IDentifier, 通用唯一標識符). 在 `menu.lst` 裡如下設置:

    kernel /boot/vmlinuz-linux root=/dev/disk/by-uuid/uuid_number

或:

    kernel /boot/vmlinuz-linux root=UUID=uuid_number

都可。

### 以 root 身份啟動 (單用戶模式)

在引導器界面，選擇一個條目並編輯 (按 `e`). 加上如下內核參數:

    [...] single init=/bin/bash

然後會以單用戶模式 (init 1) 啟動，即沒有輸入密碼前會停止在 root 提示。 這對設置 root 密碼等恢復操作有用。 然而，如果你沒有為 GRUB 設置#密碼保護的話這是一個巨大的安全漏洞。

### 密碼保護

你可以在 GRUB 配置文件裡為你想要保護的作業系統設置密碼保護。如果 BIOS 沒有此類功能而你又需要額外安保措施的話你可能需要引導器密碼保護。

首先選擇一個你記得住的密碼並加密:

    # grub-md5-crypt

     Password:
     Retype password:
     $1$ZOGor$GABXUQ/hnzns/d5JYqqjw

然後把它加到 GRUB 配置文件 `/boot/grub/menu.lst` 的開頭 (必須加到開頭以便 GRUB 識別):

    # general configuration
    timeout   5
    default   0
    color light-blue/black light-cyan/blue

    password --md5 $1$ZOGor$GABXUQ/hnzns/d5JYqqjw

注意：GRUB 使用 QWERTY 鍵盤布局輸入。

然後為每個你要保護的作業系統加上 `lock` 命令:

    # (0) Arch Linux
    title  Arch Linux
    lock
    root   (hd0,1)
    kernel /boot/vmlinuz-linux root=/dev/disk/by-label/Arch_Linux ro
    initrd /boot/initramfs-linux.img

警告：如果你在 BIOS 禁用了從其他設備啟動 (比如 CD 驅動器) 那麼密碼保護會保護你所有的作業系統，並且如果密碼忘掉的話很難重新進入系統了。

在主板設置跳線來重置 BIOS 永遠都是可能的 (參見你主板的手冊，每個型號都有所不同). 所以別人能夠操作硬體的情況下基本上沒法阻止他們突破啟動密碼。

### 啟動命名過的引導選項

如果你意識到你經常需要切換到其他一些非默認的作業系統 (如 Windows) 中並需要重新啟動，等待GRUB菜單出現是乏味的。 GRUB 提供了一種方法在重新啟動時不用等待菜單，而是使用時指定一個臨時的新的的默認選項，該選項用於記錄您的作業系統選擇。

假設 `menu.lst` 配置如下:

    /boot/grub/menu.lst

    # general configuration:
    timeout 10
    default 0
    color light-blue/black light-cyan/blue

    # (0) Arch
    title  Arch Linux
    root (hd0,1)
    kernel /boot/vmlinuz-linux root=/dev/disk/by-label/ARCH ro
    initrd /boot/initramfs-linux.img

    # (1) Windows
    title Windows XP
    rootnoverify (hd0,0)
    makeactive
    chainloader +1

Arch 是 default (0). 現在我們要重啟進入 Windows. 改變 `default 0` 為 `default saved` -- 不管 savedefault 命令有沒有使用，這將把當前的默認選項記錄到 GRUB目錄下的 `default` 文件。把 `savedefault 0` 添加到 Windows 條目的底部。每當 Windows 啟動時，將會重置默認為 Arch, 如此來臨時指定默認為 Windows.

現在我們需要的是一種能輕鬆改變默認的方式。可通過命令 `grub-set-default` 完成。因此為啟動進入 Windows, 輸入如下命令:

    # grub-set-default 1

    然后重启。

易用起見，你可能希望實現 "Allow users to shutdown 補丁" (包括`/sbin/grub-set-default` 中不需要密碼來執行的命令).

### LILO 和 GRUB 相互配合

如果 LILO 軟體包已經安裝，刪除它。

由於有些任務 (例如使用 `make all` 編譯內核) 會調用 LILO, 並且 LILO 會覆蓋安裝 GRUB. LILO 可能已包含於你的基本系統中，這取決於你的安裝介質版本以及你在軟體安裝階段是否選擇了它。

注意：如果被安裝到 MBR 的話，`pacman -R lilo` 不會把 LILO 從 MBR 移除而僅僅刪除 liloAUR 軟體包。安裝到 MBR 的 LILO 引導器會當 GRUB (或其他引導器) 安裝在 MBR 上時被覆蓋。

### GRUB 啟動盤

首先，你需要格式化一張軟盤:

    # fdformat /dev/fd0
    # mke2fs /dev/fd0

然後掛載它:

    # mount -t ext2 /dev/fd0 /mnt/fl

在上面安裝 GRUB:

    # grub-install --root-directory=/mnt/fl '(fd0)'

複製你的 `menu.lst` 文件到磁碟上:

    # cp /boot/grub/menu.lst /mnt/fl/boot/grub/menu.lst

現在卸載你的軟盤:

    # umount /mnt/fl

這樣就完成了！現在你可以用這張磁碟重啟你的計算機，它應該會用GRUB啟動。當然還需先確認在你的BIOS裡啟動順序中已經將軟盤設為比硬碟更高優先級。

另見: Super GRUB Disk.

### 隱藏 GRUB 菜單

`hiddenmenu` 選項能默認隱藏菜單. 這樣在啟動時沒有菜單顯示但默認的選項會在啟動延時後自動選擇.你仍然可以按 `Esc` 讓菜單顯示出來. 要用這個選項， 只要在 `/boot/grub/menu.lst`文件中添加:

    hiddenmenu

## 進一步排除 bug

見 article.

## 疑難問題

### GRUB Error 17

注意：以下解決方案對 GRUB Error 15 也有效。

第一步是拔下所有外部設備，看起來顯而易見但是經常被忽略 ;)

如果你的分區表混亂了，下一次開機時就只會看到"GRUB error 17". 有許多導致分區表混亂的原因。通常是使用 GParted 操作硬碟 -- 特別是對邏輯分區 -- 造成分區順序改變。例如，你刪除了 `/dev/sda6` 並調整 `/dev/sda7` 的大小，最後在原 `/dev/sda6` 處創建分區，它會顯示到列表底部，比如 `/dev/sda9`. 儘管物理上它們的順序沒有改變，它們被識別的順序改變了。

修復分區表很簡單。從你的 Arch CD/DVD/USB, 啟動，以 root 身份登錄，運行:

    # fdisk /dev/sda

進入硬碟， e[x]tra/expert 模式，[f]ix 分區順序，然後 [w]rite 分區表並退出。

你可通過 `fdisk -l` 來檢查確實已經修復好了。現在只需修復 GRUB. 見引導器的安裝部分。

基本上只要告訴 GRUB 正確的 `/boot` 然後重新寫入 GRUB 到硬碟上的 MBR.

例如:

    # grub

    grub> root (hd0,6)
    grub> setup (hd0)
    grub> quit

更深入的總結見這個頁面。

### /boot/grub/stage1 not read correctly

如果在設置 GRUB 時碰到這個問題並且分區表不是很乾淨時，值得一查。

    # fdisk -l /dev/sda

將會顯示 `/dev/sda` 的分區表。在此檢驗你的分區的"Id"值是否正確。 "System"欄目會給出"Id"值的解釋。

比如你的啟動分區被標記為"HPFS/NTFS", 你得把它改成"Linux". 為此，轉到 fdisk,

    # fdisk /dev/sda

用 `t` 改變分區的系統 id, 選擇新的分區類型和 id (Linux = 83). 也可用 `L` 列出所有的系統 id.

如果你改變了分區系統 id, 你需要 [v]erify 分區表然後 [w]rite.

現在嘗試重新設置 GRUB.

這裡是報告該問題的論壇帖子。

### 意外安裝到了 Windows 分區

如果你意外地把 GRUB 安裝到了 Windows 分區，GRUB 會覆蓋該分區的引導扇區並擦除到 Windows 引導器的引用。 (NTLDR 及更早的確證有此類問題，更新的版本不確定).

你要使用 Windows Recovery Console 來修復此問題。由於許多製造商在他們的產品裡不包含這個 (更多的是使用恢復分區), Microsoft 開放了下載。如果你使用 XP, 參見這個頁面來把軟盤做成 Recovery CD. 啟動 Recovery CD (或啟用 Windows 恢復模式) 並運行 `fixboot` 來修復引導扇區。之後你需要重新安裝 GRUB --- 這次安裝到 MBR, 不是 Windows 分區---來引導 Linux.

更深入的討論見這裡。

### 在引導菜單中編輯 GRUB 條目

你選中了引導菜單中的條目後就可以按 `e` 來編輯。如果要找設備的話使用 Tab 補全，然後 `Esc` 退出。之後按 `b` 來引導。

注意：這些設置不會被保存。

### device.map error

如果安裝或引導時錯誤信息提及 `/boot/grub/device.map`, 運行:

    # grub-install --recheck /dev/sda

以強制 GRUB 再次檢查設備映射，即使之前有過一次。這在調整分區和添加/移除驅動器之後是必需的。

### KDE 重啟後下拉菜單失效

如果你已經打開了一個含有 GRUB 配置的所有作業系統的列表子菜單，在其中選擇一個，並且在重新啟動時，你仍然啟動了默認的作業系統，那麼你可能要檢查你在 `/boot/grub/menu.lst` 裡是否有下面這行:

    default saved

### GRUB 無法找到或安裝到 virtio /dev/vd* 或其他非 BIOS 設備

我曾經在把 virtio 設備作為硬體設備的 KVM 虛擬機裡的 Arch Linux 上安裝 GRUB 時碰到了麻煩。為了安裝 GRUB, 嘗試了以下方案: 按 `Ctrl+Alt+F2` 或其他按鍵進入虛擬終端。 假設你的根文件系統掛載到 `/mnt`，boot 掛載或存儲到 `/mnt/boot`.

1. 通過如下命令確認 GRUB 文件存在於 boot 目錄裡 (假設掛載到 `/mnt/boot`):

    # ls /mnt/boot/grub

2. 如果 `/mnt/boot/grub` 已包含所有需要的文件，跳至第 3 步。否則，運行如下命令 (把 `/mnt`, `your_kernel` 和 `your_initrd` 替換為真實路徑和名稱). 你的 `menu.lst` 也應在這裡:

    # mkdir -p /mnt/boot/grub                # if the folder is not yet present
    # cp -r /boot/grub/stage1 /boot/grub/stage2 /mnt/boot/grub
    # cp -r your_kernel your_initrd /mnt/boot

3. 通過如下命令啟動 GRUB shell:

    # grub --device-map=/dev/null

4. 鍵入以下命令。把 `/dev/vda` 和 `(hd0,0)` 替換為你的設備和分區:

    device (hd0) /dev/vda
    root (hd0,0)
    setup (hd0)
    quit

5. 如果 GRUB 沒有錯誤提示，那麼就差不多完成了。你還要往 ramdisk 加入合適的模塊。更多信息參見 QEMU#Preparing an Arch Linux guest.

## 參閱

- GNU GRUB
- GRUB Grotto
- Boot debugging - Debugging with GRUB, set module values
- Boot with GRUB legacy

分類：​

- 啟動加載程序
- 系統恢復

GRUB Legacy
新增話題