如何在不使用 LiveCD 的情况下逐步修复 GRUB

最后更新: 1月15,2026
  • GRUB 在分区更改、安装其他系统或更新后经常会损坏,但几乎总是可以恢复的。
  • GRUB 控制台本身允许您找到 /boot/grub,手动加载内核,并在不依赖 LiveCD 的情况下启动。
  • 系统启动后,必须从 Linux 重新安装和更新 GRUB,以防止故障再次发生。
  • 在更严重的情况下,使用 LiveUSB、chroot 和 Boot-Repair 等工具的方法可以提供更深层次的修复。

无需 LiveCD 即可修复 GRUB

如果你曾经打开电脑,看到的不是操作系统徽标,而是黑屏和类似“错误:没有这样的设备”或“grub rescue ”之类的提示信息,你就能体会到那种恐慌的感觉。突然间,你感觉整个系统都崩溃了,不得不格式化硬盘,数据也岌岌可危……但实际上,大多数情况下,无需采取如此极端的措施就能解决问题。

好消息是,虽然这看起来像是个严重的问题,但只要磁盘损坏不是灾难性的,完全可以使用 GRUB 控制台本身,无需 LiveCD 即可修复 GRUB。只需一点耐心,正确输入几条命令,并了解其背后的工作原理,您就可以重启 Linux 系统,重新安装引导管理器,并使其为以后的重启做好准备。

GRUB是什么?为什么它经常崩溃?

GRUB启动错误

在我们开始疯狂敲键盘之前,了解GRUB 在计算机启动过程中扮演的角色至关重要。GRUB 2 是大多数现代 GNU/Linux 发行版使用的引导管理器:它通常安装在 MBR 或分区顶部,负责显示可用操作系统的菜单,并使用相应的参数加载 Linux 内核。

此引导管理器依赖于通常位于安装目录 /boot/grub 目录中的文件:模块、配置文件、内核映像、initrd 等。如果此目录无法访问、被移动、损坏或在 GRUB 未察觉的情况下更改磁盘,您将开始看到诸如“没有这样的设备”、“未知文件系统”或可怕的grub rescue>提示符之类的错误。

导致管理器崩溃的典型原因众所周知:在 Linux 之后安装 Windows并覆盖 MBR,使用 GParted 或类似工具对分区进行操作(调整大小、移动、删除、创建新分区),甚至内核或系统更新由于某种原因在 GRUB 配置中留下不一致的引用。

除此之外,一些用户更喜欢将 /boot 安装在单独的分区上,这在高级配置或磁盘其余部分需要加密的环境中是一种常见做法。在这种情况下,对该分区或其磁盘编号的任何更改都可能导致 GRUB 无法找到自身的模块和配置。

GRUB 错误类型和控制台模式

GRUB启动失败时,通常不会直接消失:它通常会将你引导至某种控制台或救援菜单,你可以使用它来手动启动系统。具体行为会根据问题的严重程度和你安装的GRUB版本略有不同。

在许多发行版中,你会发现系统尝试加载 GRUB 但最终崩溃。 提示文字为 grub rescue>这种模式功能比较有限,但它允许您执行一些关键命令,例如: ls, set o insmod足以找到正确的分区并强制加载 Linux 模块。

在其他情况下,您会看到正常的 GRUB 菜单(操作系统列表),但启动尝试会失败,或者菜单会显示异常。此时,您可以按“c”键进入完整的 GRUB 命令行界面,该界面比救援模式功能更强大,可用命令也更多。

在一些较旧的系统中,例如某些版本的 CentOS 5/6 或其他较早的发行版,仍然使用GRUB Legacy(而非 GRUB 2)。在这种情况下,命令语法略有不同,但基本思路相同:找到 /boot 目录,告诉 GRUB 其根目录的位置,然后手动加载内核和 initrd。

如何在没有 LiveCD 的情况下使用救援模式修复 GRUB

当计算机找不到正确配置的引导管理器时,通常会看到类似“错误:没有这样的设备”的消息,后面跟着“grub rescue>”。这意味着 GRUB 已经运行,但它不知道自己的配置文件或所需模块在哪里。

  用于高通平台 RAS 支持的 Linux 补丁

在这种情况下,您可以使用一个小型命令解释器来发现分区、找到 /boot/grub 并手动加载内核。这个过程听起来可能很冗长,但实际上非常系统化。

列出可用磁盘和分区

第一步是找出 GRUB 在你的机器上识别到的磁盘和分区。为此,请在grub rescue>提示符下输入:

ls

该命令将显示类似以下内容: (hd0) (hd0,1) (hd0,2) (hd0,3) (hd1) (hd1,1) (hd1,2)。 每 hdX 代表不同的硬盘: hd0 是第一张实体光盘,hd1 是第二张。以此类推。带有逗号的变体,例如 (hd0,1),表示该磁盘的编号分区。

根据您的计算机配置,您可能会看到一个类似 (hd0) 的磁盘,其中包含两到三个分区;或者看到多个磁盘:​​(hd0,1) (hd1,1) (hd1,5) (hd2,1) (hd3,1)。无论如何,现在的目标很简单:打开每个分区,直到找到包含/boot/grub目录的分区。

使用 /boot/grub 定位分区

要检查分区的内容,我们再次使用 ls 但需添加分区名称和尾部斜杠。例如: 检查内容 它能帮助你判断它是否是正确的。

ls (hd0,1)/

如果该分区的文件系统能够被 GRUB 识别,它会显示目录列表:你会看到诸如bin、home、boot、root等名称。在这种情况下,该分区可能是你的根目录 (/),也可能是独立于 /boot 的分区,具体取决于你安装系统时的系统结构。如果列表显示GRUB 能够识别该文件系统,那么你就找对了方向。

如果在运行上述命令时看到名为boot 的目录,您可以深入查看该目录是否包含 grub 文件夹:

ls (hd0,1)/boot/grub

当您找到包含linux.mod等模块或其他典型 GRUB 文件的文件列表时,就找到了您要查找的分区。如果没有任何结果或出现错误,请继续尝试其他分区:ls (hd0,2)/ls (hd1,1)/等,直到找到正确的分区为止。

告诉 GRUB 你的文件位于哪里。

一旦确定了正确的分区,就需要告诉 GRUB 其模块和配置的位置。假设我们已经发现 /boot 位于 (hd0,1)。下一步是设置前缀:

set prefix=(hd0,1)/boot/grub

通过这条指令,系统管理器就能知道它的支持文件位于该路径下。我们还需要告诉它使用哪个根分区来查找内核和其余系统数据:

set root=(hd0,1)

正确书写这对词组很重要。 (磁盘,分区) 并且始终使用尾部斜杠 / 当我们列出内容时 ls另请注意,GRUB 控制台键盘布局通常是美式布局,因此括号和斜杠键可能与您看到的按键标识不符。一个好习惯是确保…… 设置前缀 在尝试加载模块之前,请正确操作。

加载 GRUB 模块和 Linux 内核

配置好前缀后,下一步是强制加载GRUB Linux 模块。在许多指南中,你会看到类似这样的内容:

insmod (hd0,1)/boot/grub/linux.mod

在许多现代系统中,合适的模块可能是 正常.mod 或其他名称,但思路是一样的:如果您不确定确切的名称,请使用该命令。 ls (hd0,1)/boot/grub 要列出文件,请根据您的 GRUB 版本选择相应的模块。 insmod 这涉及到加载必要的模块以继续启动过程。请注意: insmod的 这条指令实际上将模块集成到了加载器中。

接下来,您将必须 加载 Linux 内核映像 指示其在文件系统中的路径。 创业公司示例: linux /boot/vmlinuz-4.13.3-generic root=/dev/sda1

确切的内核名称会因机器而异(可能是……) vmlinuz-2.6.32-23-generic, vmlinuz-6.1.0-10-amd64 或任何其他版本)。您可以再次使用, ls /boot 查看有哪些图片可用,并选择最新的一张。重要的是不要忘记这个参数。 root=/dev/sdXn 使用正确的根分区。

为了避免与 GRUB 和 Linux 命名规则的对应关系混淆,请记住hd0 对应 /dev/sda,hd1 对应 /dev/sdb,hd2 对应 /dev/sdc,依此类推。分区号格式也会改变:(hd0,1) 变为 /dev/sda1,(hd1,2) 变为 /dev/sdb2,等等。

在某些情况下,加载内核镜像后,如果您的发行版需要,建议加载 initrd 镜像(初始 RAM 磁盘)。典型的命令是:

initrd /initrd.img

与内核一样,您可以使用以下命令检查哪些 initrd 文件可用: ls / o ls /boot 并使用 制表键 自动补全姓名,避免拼写错误。

  如何在 Linux 中重命名文件

启动系统并从 Linux 重新安装 GRUB。

内核和 initrd 加载完毕后,您只需告诉 GRUB 启动引导过程。为此,只需输入:

破面: boot

如果一切顺利,内核将接管控制权,操作系统将正常启动,您就可以登录到您的 Linux 系统。此时,您无需使用 LiveCD 就成功挽救了局面,但还有一个重要的步骤:重新安装 GRUB,以防止下次重启时再次出现问题

进入系统后,以超级用户权限(root 或使用 )打开终端。 sudo)并运行:
grub-install /dev/sdX

其中/dev/sdX是您要放置引导管理器的磁盘(不是分区),例如,如果您位于不同的磁盘上,则可以是 /dev/sda/dev/sdb。请记住,您不应在此处指定分区号:该命令会将引导管理器写入整个磁盘的 MBR 或引导区域。

在许多基于 Debian 或 Ubuntu 的发行版中,强烈建议重新生成 GRUB 配置文件,以确保它能正确检测到所有已安装的系统。您可以使用以下命令执行此操作:

跑: update-grub o update-grub2

此外,如果您还想更新初始启动映像,请使用以下命令更新 initramfs

命令: update-initramfs -u

从启动菜单使用 GRUB 控制台

在其他情况下,GRUB 的问题并不那么严重,您确实可以看到启动菜单,但某些系统无法启动,选择特定条目时出现错误,或者您只是怀疑菜单配置错误。

在这种情况下,当您打开计算机时看到 GRUB 菜单,您可以按方向箭头(向上或向下)停止自动启动倒计时,然后按c键访问完整的命令行。

从那台先进的控制台开始, 这些命令基本相同。 与救援模式相比,您将拥有更多工具来检查系统。例如,您可以使用 ls 列出磁盘和分区, set 查看和修改 GRUB 环境变量, insmod 加载其他模块,甚至是诸如此类的命令 cat 读取文本文件的内容。

按照同样的步骤,您首先需要确定您拥有哪些磁盘和分区:

ls

您将看到类型为(hd0) (hd0,msdos1) (hd0,msdos5)(hd0,1) (hd1,1) (hd1,5) (hd2,1)的输出,具体取决于您的分区表是 MBR (msdos) 还是 GPT,以及计算机中存在的磁盘数量。

然后,您可以使用如下命令检查每个分区:

ls (hd0,msdos1)/

直到找到启动目录及其中的grub文件夹。找到后,您将重复设置前缀和根目录的过程:

set prefix=(hd0,msdos1)/boot/grub
set root=(hd0,msdos1)

接下来,您可以通过列出 /boot 目录的内容来查找可用的内核:

/boot 列表: ls /boot

然后您将选择其中一个进行加载:

linux /boot/vmlinuz-6.1.0-10-amd64 root=/dev/sda1

请根据您的具体情况调整内核版本和根分区。请记住磁盘映射:hd0 → /dev/sda,hd1 → /dev/sdb,hd2 → /dev/sdc,等等。您可以使用 Tab 键自动补全路径和文件名。

最后,如有必要,您将加载 initrd 并执行该命令。 启动系统。登录后,要执行的操作与之前的场景相同: 在磁盘上重新安装 GRUB 并更新其配置 运用 grub-install /dev/sda y update-grub.

修复带有 GRUB Legacy 的系统上的 GRUB

虽然现在大多数发行版都采用了 GRUB 2,但你仍然可以找到一些使用GRUB Legacy 的老旧机器或特定系统。这些情况下界面略有不同,但基本概念仍然相同:你可以使用交互式引导加载程序 shell 来重启系统。

启动时,这个经典的 GRUB 通常允许 访问命令行 按下特定键(通常是按键) c 或钥匙 e (用于编辑条目)。出现提示符后,您可以使用如下命令: find 这些尤其有用。

例如,如果您想找到包含内核镜像和 initrd 的/boot目录,可以使用以下命令:

查找命令: find /boot/grub/stage1 或类似路线

取决于是否 /boot 是一个单独的分区 或者它在根目录下,路径将是 /boot 或者只是 / 以及其他子文件夹。找到正确的分区后,GRUB Legacy 通常会显示类似这样的信息: (hd0,0) 或者使用另一对可以重复使用的磁盘/分区。

  什么是超频?它在电脑中有什么用途?

接下来,您需要使用类似这样的命令来定义 GRUB 根目录:

根示例: root (hd0,0)

然后告诉它内核和 initrd 的位置。同样,通常不需要输入完整的文件名,因为Tab 键会自动补全,帮助你避免长路径中的拼写错误。

要进一步微调,您可以使用以下命令 cat 读取 GRUB 配置文件(例如, /boot/grub/menu.lst并检查根目录上挂载了哪个设备,传递了哪些内核参数等等。这是一种非常实用的方法。 复制系统正常运行时使用的相同配置。.

最后,当你有了这些线条 , 核心 e 初始化 要创建列表,只需运行以下命令 boot 启动系统。进入系统后,最后一步是从 Linux 系统内部重新安装 GRUB。 grub-install 在相应的磁盘上,确保您在后续重启时无需重复手动过程。

其他常用方法(使用 LiveCD、chroot 和 Boot-Repair)

到目前为止,我们已经了解了如何仅使用 GRUB 控制台解决问题,而无需借助任何外部手段。然而,了解使用 LiveCD/LiveUSB 和图形工具的传统方法也十分重要,因为在某些情况下,系统损坏非常严重,以至于从可启动系统启动是唯一的选择。

Debian 和 Ubuntu 发行版常用的一种技术是从 LiveCD 或 LiveUSB(例如 Ubuntu、Linux Mint、Debian Live 镜像等)启动,挂载损坏系统的根分区,如果 /boot 是单独的分区,也将其挂载,然后 chroot到该文件系统上重新安装 GRUB,就像我们从安装本身操作一样。

总的来说,这个过程包括识别分区。 fdisk -l确定根是什么(例如, / dev / sda2)以及如果存在的话,哪个是启动分区(例如, / dev / sda7然后将它们组装在一起:

挂载分区(例如):
sudo mount /dev/sda2 /mnt
sudo mount /dev/sda7 /mnt/boot (如果您有单独的 /boot 文件)

/dev、/dev/pts、/proc 和 /sys 的绑定挂载是在 /mnt 内部完成的:

绑定坐骑:
sudo mount --bind /dev /mnt/dev
sudo mount --bind /dev/pts /mnt/dev/pts
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys

从这里,您可以使用以下命令访问已安装的系统:

登录方式: sudo chroot /mnt

然后,您可以在系统内部运行grub-install 命令,并指向该磁盘:

从 chroot 环境安装: grub-install --boot-directory=/boot/ --recheck /dev/sda

将引导管理器重新加载到 MBR 或等效区域,然后执行以下操作:

生成配置: grub-mkconfig -o /boot/grub/grub.cfg

重新生成配置文件。退出 chroot 时 exit 然后重启电脑(sudo reboot), 通常情况下 GRUB菜单正常重新出现。.

对于不想使用终端的用户来说,Boot-Repair工具是另一个非常便捷的选择。它可以安装在 Ubuntu Live 环境中,并提供图形界面,能够检测操作系统安装并几乎自动修复 GRUB。只需运行该工具,选择“推荐修复”,它就会分析并重写引导加载程序。

虽然基于 LiveCD 或外部工具的解决方案非常实用,但掌握我们一开始介绍的技巧的优势在于,您无需依赖 U 盘或磁盘。在许多情况下,您完全可以使用 GRUB 控制台,尤其是在问题“仅仅”是启动管理器丢失了对 /boot 所在分区的正确引用时。

综上所述,GRUB 损坏并不一定意味着系统丢失:您可以在引导加载程序本身、命令行和 Live 环境中找到正确的分区,手动加载内核,启动 GNU/Linux,并重新安装引导管理器,使其再次像新的一样工作。

Linux Live 模式的优势
相关文章:
Linux Live 模式和 Live USB:优势、用途和局限性