GRUB Legacy

来自 ArchWiki

GRUB Legacy 是一个由 GNU 项目 维护的 multiboot 引导加载程序。它源自 GRUB,GRand Unified Bootloader,最初由 Erich Stefan Boleyn 设计和实现。

简而言之,引导加载程序是计算机启动时运行的第一个软件程序。它负责加载内核并将控制权转移给 Linux 内核。然后,内核初始化操作系统的其余部分。

警告: GRUB Legacy 不再由上游维护,并且在 Arch 中未获得官方支持(请参阅此处的新闻)。建议用户切换到 GRUB2Syslinux。请参阅 #升级到 GRUB2
注意: GRUB legacy 不支持 GPT 磁盘、Btrfs 文件系统和 UEFI 固件。

支持的文件系统

GRUB legacy 捆绑了对多种文件系统的支持,特别是 FAT32ext2ReiserFSXFS (尽管仅限 v4)。

警告: 文件系统可能具有 GRUB Legacy 不支持的新功能,使其不适合用于 /boot,除非禁用不兼容的功能。这通常可以通过使用单独的 /boot 分区 和普遍支持的文件系统(如 FAT32)来解决。

安装

GRUB Legacy 可以从 grub-legacyAUR 软件包安装

此外,GRUB 必须安装到驱动器或分区 的引导扇区才能充当引导加载程序。这在 #引导加载程序安装 中介绍。

升级到 GRUB2

本文或章节正在考虑移除。

原因: 在 2025 年寻求有关 GRUB Legacy 信息的人无疑不会升级到另一个引导加载程序。(在 Talk:GRUB Legacy 中讨论)

升级是必要的吗?

简短的回答是否定的。GRUB legacy 不会从您的系统中删除,并且将保持完全功能。

但是,与任何其他不再支持的软件包一样,错误不太可能得到修复。因此,您应该考虑升级到 GRUB 版本 2.x,或另一个受支持的 引导加载程序

如何升级

从 GRUB Legacy 升级到 GRUB 版本 2.x 与在运行 Arch Linux 上安装 GRUB 非常相似。详细说明在此处介绍。

差异

  • GRUB Legacy 和 GRUB 的命令存在差异。在继续操作之前,请熟悉 GRUB 命令(例如,“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 中只有 446 字节包含引导代码,接下来的 64 字节包含分区表。如果您不想在恢复时覆盖分区表,强烈建议仅备份 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 命令行 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
  • 将 MBR 和 sda 的后 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 操作系统之前等待的时间(以秒为单位)。
  • default # -- timeout 过期时选择的默认启动项。

示例配置(/boot 在单独的分区上)随软件包提供

查找 GRUB 的根目录

必须告知 GRUB 其文件在系统上的位置,因为可能存在多个实例(即,在多启动环境中)。GRUB 文件始终位于 /boot 下,/boot 可能位于专用分区上。

注意: GRUB 定义存储设备的方式与传统的内核命名不同。
  • 硬盘定义为 (hdX);这也指任何 USB 存储设备。
  • 设备和分区编号从零开始。例如,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 双启动

本文或章节已过时。

原因: 关于删除“makeactive”的评论可能不再必要,示例应简单地删除它,因为它是在 Windows 7 发布几个月后添加的。同样,关于 Windows 2000 的信息在今天也无关紧要。(在 Talk:GRUB Legacy 中讨论)

将以下内容添加到您的 /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 文件以反映更改(请参阅 本文[死链接 2024-07-30 ⓘ],了解有关如何执行此操作的详细信息)。

如果 Windows 位于另一个硬盘上,则必须使用 map 命令。这将使您的 Windows 安装认为它实际上在第一个驱动器上。假设您的 Windows 分区在第二个驱动器的第一个分区上

/boot/grub/menu.lst
 title Windows
 map (hd0) (hd1)
 map (hd1) (hd0)
 rootnoverify (hd1,0)
 makeactive
 chainloader +1

与 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
注意: 可能需要其他选项,并且可能不使用初始 RAM 磁盘。检查其他发行版的 /boot/grub/menu.lst 以匹配启动选项,或参阅 #chainloader 和 configfile(推荐)。

chainloader 和 configfile

为了方便系统维护,应使用 chainloaderconfigfile 命令来引导另一个提供“自动”GRUB 配置机制的 Linux 发行版(例如 Debian、Ubuntu、openSUSE)。这允许发行版管理其自己的 menu.lst 和启动选项。

  • chainloader 命令将加载另一个引导加载程序(而不是内核映像);如果另一个引导加载程序安装在分区的引导扇区中(例如 GRUB),则很有用。这允许将 GRUB 的“主”实例安装到 MBR,并将特定于发行版的 GRUB 实例安装到每个分区引导记录 (PBR)。
  • 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
注意: 如果您的设置使用单独的引导分区,请不要忘记挂载系统的引导分区!以上假设引导分区位于根文件系统上,或者挂载到根文件系统上的 /boot!

关于引导加载程序安装的通用说明

GRUB 可以从单独的介质(例如 LiveCD)安装,也可以直接从正在运行的 Arch 安装安装。很少需要重新安装 GRUB,并且在以下情况下需要安装

  • 配置文件已更新。
  • grub-legacyAUR 软件包已更新。

在以下情况下需要安装

  • 尚未安装引导加载程序。
  • 另一个操作系统覆盖了 Linux 引导加载程序。
  • 引导加载程序由于某些未知原因而失败。

在继续之前,请注意以下几点

  • 在继续操作之前,请确保您的 GRUB 配置正确 (/boot/grub/menu.lst)。请参阅 查找 GRUB 的根目录 以确保您的设备定义正确。
  • GRUB 必须安装在 MBR(硬盘的第一个扇区)或大多数 BIOS 识别的第一个存储设备的第一个分区上。为了允许各个发行版管理其自己的 GRUB 菜单,可以使用 GRUB 的多个实例,请参阅 #chainloader 和 configfile
  • 对于 RAID 配置等情况,或者如果您忘记/损坏了 GRUB 安装,可能需要从 chroot 环境中(即,通过单独的介质从已安装的环境中)安装 GRUB。您将需要从 LiveCD 或另一个 Linux 安装 切换 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 方法。

技巧与提示

帧缓冲分辨率

可以使用 menu.lst 中给出的分辨率,但您可能希望以 LCD 宽屏的全分辨率使用它。以下是您可以执行此操作的方法

Wikipedia 上,有一个扩展帧缓冲分辨率列表(即超出 VBE 标准中的分辨率)。

如果所需分辨率不适用于从表中获得的代码,通常是因为显卡制造商可以自由选择他们想要的任何数字,因为这不属于 VBE 3 标准的一部分。这些代码可能因卡而异(甚至可能对于同一制造商)。

与其使用该表,不如使用下面提到的工具之一来获取正确的代码

GRUB 识别的值

这是一种仅使用 GRUB 本身即可轻松查找分辨率代码的方法。

在内核行上,指定内核应询问您要使用的模式。

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

现在重启。GRUB 现在将显示一个适合使用的代码列表,以及扫描更多代码的选项。

您可以选择您想要使用的代码(不要忘记它,下一步需要它),并使用它启动。

现在将内核行中的 ask 替换为您选择的正确代码。

例如,[369] 1680x1050x32 的内核行将是

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

hwinfo

  1. 安装 hwinfo 软件包。
  2. 以 root 身份运行 hwinfo --framebuffer
  3. 选择与所需分辨率对应的代码。
  4. menu.lst 中使用带有 0x 前缀的 6 位代码作为 vga= 内核选项。或者将其转换为十进制以避免使用 0x 前缀。

hwinfo 的示例输出

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

以及内核行

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

分区命名

按标签

如果您不时更改(或计划更改)分区大小,您可能需要考虑按标签定义驱动器/分区。您可以按以下方式标记 ext2、ext3、ext4 分区

e2label /dev/drive|partition label

标签名称最多可以包含 16 个字符,但不能有空格,以便 GRUB 可以理解它。然后在您的 menu.lst 中定义它

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

按 UUID

分区的 UUID(通用唯一标识符)可以使用 blkidls -l /dev/disk/by-uuid 发现。它在 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

然后将您的密码添加到 /boot/grub/menu.lst 的 GRUB 配置文件的开头(密码必须位于配置文件的开头,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 是默认值 (0)。我们想要重启进入 Windows。将 default 0 更改为 default saved -- 这将在每次使用 savedefault 命令时将当前默认值记录在 GRUB 目录中的 default 文件中。现在将行 savedefault 0 添加到 Windows 条目的底部。每当 Windows 启动时,它都会将默认值重置为 Arch,从而使将默认值更改为 Windows 成为临时的。

现在,所有需要的是一种轻松手动更改默认值的方法。这可以使用命令 grub-set-default 完成。因此,要重启进入 Windows,请输入以下命令

# grub-set-default 1

然后重启。

为了易于使用,您可能希望设置 sudo 并将 /sbin/grub-set-default 添加到用户无需提供密码即可发出的命令中。

LILO 和 GRUB 交互

如果您的系统上安装了 LILO 软件包,请卸载它。因为某些任务(例如使用 make all 的内核编译)将进行 LILO 调用,然后 LILO 将安装在 GRUB 之上。根据您的安装程序介质版本以及您在软件包选择阶段是否选择/取消选择它,LILO 可能已包含在您的基本系统中。

注意: 删除 liloAUR 不会从 MBR 中删除 LILO(如果已安装在那里);它只会删除 liloAUR 软件包。当 GRUB(或其他引导加载程序)安装在其上时,安装到 MBR 的 LILO 将被覆盖。

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

故障排除

GRUB 错误 17

注意: 以下解决方案也适用于 GRUB 错误 15

要做的第一个检查是拔下任何外部驱动器。看起来很明显,但有时我们很累 ;)

如果您的分区表搞砸了,那么令人不快的“GRUB error 17”消息可能是您下次重启时迎接您的唯一内容。分区表可能搞砸的原因有很多。通常,使用 GParted 操作分区的用户——尤其是逻辑驱动器——可能会导致分区顺序发生变化。例如,您删除 /dev/sda6 并调整 /dev/sda7 的大小,然后最终重新创建曾经是 /dev/sda6 的内容,但现在它出现在列表的底部,例如 /dev/sda9。虽然分区/逻辑驱动器的物理顺序没有改变,但它们被识别的顺序发生了变化。

修复分区表很容易。从您的 Arch CD/DVD/USB 启动,以 root 身份登录并修复分区表

# fdisk /dev/sda

进入磁盘后,进入 e[x]tra/专家模式,[f]ix 分区顺序,然后 [w]rite 表并退出。

您可以通过发出 fdisk -l 来验证分区表是否确实已修复。现在您只需要修复 GRUB。请参阅 #引导加载程序安装

基本上,您需要告诉 GRUB 您的 /boot 的正确位置,然后将 GRUB 重新写入磁盘上的 MBR

例如

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

有关本节更深入的摘要,请参阅 [1]

/boot/grub/stage1 未正确读取

如果您在尝试设置 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。

如果你更改了分区系统 ID,你应该[v]验证你的分区表,然后[w]写入它。

现在尝试重新设置 GRUB。

另请参阅论坛帖子,其中报告了这个问题。

意外安装到 Windows 分区

如果你意外地将 GRUB 安装到 Windows 分区,GRUB 会将一些信息写入该分区的引导扇区,从而擦除对 Windows 引导加载程序的引用。(对于 Windows XP 及更早版本的引导加载程序 NTLDR 来说是这样,不确定更高版本的情况)。

要修复此问题,你需要使用适用于你的 Windows 版本的 Windows 恢复控制台。由于许多计算机制造商的产品中不包含此工具(许多制造商选择使用恢复分区),Microsoft 提供了下载版本。如果你使用 XP,请查看此页面,了解如何将软盘转换为恢复光盘。启动恢复光盘(或启用 Windows 恢复模式)并运行 fixboot 来修复分区引导扇区。完成此操作后,你将需要再次安装 GRUB——这次安装到 MBR,而不是 Windows 分区——才能启动 Linux。

有关更多信息,请参阅双启动 Windows#恢复 Windows 引导记录

编辑启动菜单中的 GRUB 条目

一旦你在启动菜单中选择了一个条目,你可以通过按键 e 来编辑它。如果你需要发现设备,请使用 Tab 补全,然后按 Esc 退出。之后你可以尝试按 b 启动。

注意: 这些设置不会被保存

device.map 错误

如果在安装或启动期间出现提及 /boot/grub/device.map 的错误,请运行

# grub-install --recheck /dev/sda

以强制 GRUB 重新检查设备映射,即使它已经存在。这在调整分区大小或添加/删除驱动器后可能是必要的。

KDE 重启下拉菜单失败

如果你打开了一个子菜单,其中列出了 GRUB 中配置的所有操作系统,选择了一个,但在重启后,你仍然启动了默认操作系统,那么你可能需要检查你是否具有以下行

default saved

/boot/grub/menu.lst 中。

GRUB 无法找到或安装到任何 virtio /dev/vd* 或其他非 BIOS 设备

在使用 virtio 设备作为硬盘的虚拟 KVM 机器中安装 Arch Linux 时,我在安装 GRUB 时遇到了问题。为了安装 GRUB,我找到了以下方法:通过键入 Ctrl+Alt+F2 或任何其他 F 键进入虚拟控制台。这假设你的根文件系统挂载在 /mnt 文件夹中,而引导文件系统挂载或存储在 /mnt/boot 文件夹中。

1. 确保所有需要的 GRUB 文件都存在于你的引导目录中(假设它挂载在 /mnt/boot 文件夹中),通过发出以下命令

# ls /mnt/boot/grub

2. 如果 /mnt/boot/grub 文件夹已经包含所有需要的文件,请跳到步骤 3。否则,执行以下命令(将 /mntyour_kernelyour_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#准备 Arch Linux 虚拟机

另请参阅