什么是 GRUB:GNU 启动管理器完整指南

最后更新: 十月14 ,2025
  • GRUB 是选择和加载操作系统的 GNU 启动管理器,支持 BIOS/UEFI 和多重启动。
  • GRUB 2 添加了模块、改进的文件系统支持、UUID 搜索和图形菜单/终端。
  • 配置通过 /etc/default/grub 和 40_custom 进行管理,并使用 update-grub 或 grub2-mkconfig 重新生成。
  • 安全性:使用密码保护 GRUB,使用 LUKS 加密,并具有强大的密码策略。

关于 GRUB 的一般说明

如果你在电脑上安装了 GNU/Linux 系统,或者使用多个操作系统,那么你很可能听说过 GRUB。它是一个小巧但功能强大的程序,会在系统启动前显示,允许你选择要加载的组件。虽然它常常被人忽略,但它对于启动操作系统以及将控制权顺利移交给内核至关重要。

在PC启动领域,GRUB凭借其强大的功能和灵活性已成为事实上的标准。它诞生于GNU项目,如今已成为GNU/Linux系统中应用最广泛的启动管理器,兼容多种架构和文件系统,对新手友好易用,同时也是那些追求启动过程细节精细化的用户的瑞士军刀。

GNU GRUB 是什么以及它有什么用途?

GNU GRUB(GNU GRand Unified Bootloader,GNU GRand Unified Bootloader,GNU GRUB)是一个多启动管理器:当计算机开机时,固件(BIOS 或 UEFI)会运行该软件来选择和加载操作系统。它允许用户选择菜单项、向内核传递参数、从网络启动,甚至可以与控制台交互以排查特定问题。

它主要用于 GNU/Linux 发行版,但也曾被其他系统使用,例如 x86 架构的 Solaris。在现代UEFI系统中,固件会直接加载位于 EFI 系统分区 (ESP) 中的 GRUB 可执行文件(前提是该文件已在 NVRAM 中注册);在 BIOS/MBR 系统中,GRUB 会占用磁盘的初始扇区并从那里继续加载。

除了典型的菜单之外,GRUB 还符合多重启动规范,这意味着它可以无缝启动兼容的内核。一旦内核加载到内存中,GRUB 就会交出控制权,它的任务就完成了,这绝非易事。

GRUB 启动选项屏幕

技术表和项目数据

GRUB 是 GNU 生态系统的一部分,并以 GNU GPL v3 或更高版本许可证发布,属于自由软件。它的开发是开源的,拥有官方代码库、错误跟踪系统和网站,以及一个非常活跃的社区。

它主要用 C 语言和汇编语言编写,可在多个平台上运行: IA-32、x86-64 和 PowerPC等等。当前分支是 GRUB 2(历史悠久的“GRUB Legacy”的重新实现)。最新发布的稳定版本是 2.12 (2023 年 12 月 20 日)。如果您想检查本地版本,可以运行: grub-install --version 你就会看到相应的链。

一些历史和演变

GRUB 最初是Erich Stefan Boleyn在 GNU Hurd 和 Mach 微内核框架下提出的一个项目。为了解决启动方式的差异,创建了多重启动规范 (Multiboot Specification),该规范旨在使引导加载程序和内核“使用同一种语言”。1999 年, Gordon Matzigkeit 和 Yoshinori Okuji牵头将其纳入 GNU 项目的官方软件包。

大约在2002年,一群日本研究人员启动了PUPA(Preliminary Universal Programming Architecture,初步通用编程架构)项目,旨在重写GRUB,使其更加健壮和模块化。这项工作最终催生了GRUB 2,而之前的版本则被称为“GRUB Legacy”(其0.97版本最后一次更新是在2005年)。从2007年开始,一些发行版迁移到了GRUB 2,到2009年底,绝大多数发行版都默认包含了GRUB 2 。

GRUB启动过程图

如何使用 GRUB(BIOS 和 UEFI)启动计算机

当你打开电脑时,固件会运行检查(RAM、时钟、设备、启动顺序)并查找引导加载程序。在具有 BIOS/MBR 的系统上,控制权会转移到 主引导记录 (MBR),磁盘的初始 512 字节GRUB 分为几个阶段:阶段 1(MBR 中的最小代码)、阶段 1.5(位于后续扇区,用于理解文件系统)和阶段 2(菜单和高级功能)。在 GRUB 2 中,“1.5”不再存在;现在有具体的映像,例如 boot.img, core.img 以及根据安装组合的模块(*.mod)。

  Windows 系统中 Run 和 CMD 的隐藏命令

在 UEFI 中,这个过程更为直接:固件会从 EFI 分区执行 GRUB EFI 二进制文件(前提是 GRUB EFI 已正确安装和注册)。无论哪种情况,GRUB 都会显示一个菜单或控制台,加载选定的内核,然后将执行权限移交给该内核。

多重引导规范和兼容性

GRUB 实现了多重启动,允许无需特殊“技巧”即可启动兼容的内核。此外,对于不支持多重启动的系统(例如Windows 或 DOS),它提供了链式加载,目标指向其引导加载程序所在的分区的第一个扇区。

它的文件系统兼容性非常广泛:包括Btrfs、ext2/3/4、FAT12/16/32、exFAT、HFS/HFS+、ISO9660、Nilfs2、NTFS、ReiserFS、ZFS、ROMFS、JFS 和 XFS等。它还可以读取 LVM 卷和 RAID 阵列中的数据,这在存储结构复杂时是一个显著的优势。

特色和功能

  • 菜单界面 可配置且高度灵活的交互式终端,具有 Tab 自动完成功能和 Bash 风格的快捷方式。
  • 支持 LBA(逻辑块寻址) 克服经典 BIOS 限制并读取超过 1024 个柱面。
  • 能力 网络启动 (PXE/TFTP)和远程终端,在集中管理场景中很有用。
  • 自动解压缩和识别多种可执行格式。
  • 持久存储变量 保存环境/加载环境 y grub-editenv (当平台允许时)。
  • 所有 RAM 检测、磁盘几何独立性以及 通过标签和 UUID 进行搜索的机制.
  • 菜单和背景的图形支持,以及维护的模块化设计 核心映像 很小,并根据需要加载模块。

关键术语:设备、分区和路径

GRUB 以自己的方式命名磁盘和分区。第一个磁盘通常是 (hd0),第一个分区 (hd0,1) 在 GRUB 2 中(记住:在 GRUB 2 中,编号从 1 开始;在 Legacy 中,编号从 0 开始)。要指代整个磁盘,请省略分区: (hd0).

为了指示文件,设备与路径相结合: (hd0,1)/ruta/al/archivo。它还支持 屏蔽名单 (阻止列表)当需要指示文件系统中不可见的文件在磁盘上的确切位置时,例如 (hd0,1)+1 对于分区的第一个扇区,有用 chainloader +1.

GRUB 中的“根文件系统”与 Linux 中的“/”并不相同。它只是GRUB 读取文件的根分区;一旦 Linux 内核获得控制权,它会定义自己的实际根目录,GRUB 中的其他一切都将变得无关紧要。

GRUB 接口

GRUB 提供三种主要视图。最熟悉的是菜单,其中包含预配置的条目;您可以使用箭头键导航,按 Enter 键启动,按“e”键编辑条目,或按“c”键打开控制台。

输入编辑器允许您即时修改行(使用“o/O”添加,使用“e”编辑,使用“d”删除),如果一切正常,则使用“b”启动。它非常适合在不修改文件的情况下测试内核参数。

控制台模式功能最强大:它支持上下文自动补全、编辑快捷键,以及GRUB所有用于定位磁盘、加载内核/initrd 或链式加载的内部命令。如果配置文件丢失或损坏,GRUB 会将您引导至此模式,以便您手动解决问题。

常见错误消息

错误可能出现在初始阶段(较为有限)或加载菜单和模块时(描述更为详细)。以下是 GRUB 可能显示的一些典型错误代码,为了清晰起见,已进行改写:

  • 1:无效或非绝对路径;2:无效文件类型(不是常规文件);3–4:解压缩过程中数据/标头损坏;5: 分区表损坏 或无效。
  • 6:Stage1/Stage2 不兼容;7:不支持加载 1 MB 以下的内容;8:尝试在未加载内核的情况下启动;9:未知的启动失败。
  • 10:不支持多重引导功能;11:无法识别设备;12:无效设备;13:不支持的可执行格式。
  • 14:文件系统阻止读取整个文件;15: 文件未找到;16:文件系统结构不一致。
  • 17:无法挂载所选分区;18:柱面超出 BIOS 支持的范围(旧驱动器上常见);19:Initrd 先于内核。
  • 20:多重引导内核之前的模块;21:选定的磁盘不存在;22:不存在的分区;23:解释数字时出错。
  • 24:访问分区外的块;25:磁盘读取错误;26:符号链接过多;27:未知命令。
  • 28:项目不适合内存;29:磁盘写入错误;30:无效参数;31:文件未按扇区对齐(ReiserFS,使用 无尾).
  • 32:需要身份验证;33:未配置串行设备;34:MBR 后没有用于阶段 1.5 的空闲扇区(与 EZ-BIOS 冲突或分区启动过早)。
  新手如何选择最佳 Linux 发行版的完整指南

基本 GRUB 命令

在控制台中,你可以运行非常有用的交互式命令。例如: boot 启动最后加载的程序(内核或链式加载程序),并且 chainloader <archivo> 从链中加载扇区或文件;Windows 的典型快捷方式是 chainloader +1.

displaymem 根据 BIOS 显示内存使用情况,如果您不确定检测到的 RAM 数量,此功能会非常方便。使用 initrd <archivo> 您指定内核所需的初始 RAM 磁盘映像。

要从 GRUB Legacy 控制台安装到 MBR,您使用了 install 前往 stage1, stage2 以及可选的配置文件。目前在 GRUB 2 中,从系统中使用 grub-install 并使用 update-grub/grub2-mkconfig.

命令 kernel 指定内核二进制文件及其参数,例如: kernel /vmlinuz root=/dev/sda5通常先于 root (hdX,Y) o rootnoverify 设置 GRUB 将从中读取的分区。

配置文件和指令

在 GRUB Legacy 中,菜单位于 /boot/grub/menu.lst o grub.conf,指令如下 color, default, fallback, hiddenmenu, password, timeout, splashimage 和块 title 每个系统的订单。

一个典型的例子(解释如下)包括 Linux 部分 root (hd0,2), kernel 其 根参数=/…,而 boot;另一个适用于 Windows rootnoverify (hd0,1) y chainloader +1.

在 GRUB 2 中,自动生成的文件是 /boot/grub/grub.cfg。不建议手动编辑;而是调整 /etc/default/grub (例如 GRUB_TIMEOUT, GRUB_DEFAULT等)并添加自定义条目 /etc/grub.d/40_custom.然后执行 update-grub o grub2-mkconfig 重新生成菜单。

GRUB Legacy 和 GRUB 2 之间的主要区别

  • 配置文件来自 menu.lst/grub.conf a grub.cfg,使用更新的语法和命令并通过自动生成 grub-mkconfig.
  • 分区编号 始于1 在 GRUB 2 中(在 Legacy 中它从 0 开始)。
  • 变量的持久性 save_env/load_env 在某些配置中。
  • 更好的路线检测和 通过 UUID/标签搜索;支持更多文件系统。
  • 直接读取 LVM 和 RAID.
  • 终端和菜单图形以及重新组织的图像:Stage 1.5 已经消失; boot.img, core.img 和动态模块(*.mod)。

使用 GRUB 实现安全性和强化

安全性差的引导管理器就像一个筛子。如果有人拥有物理访问权限,就能编辑内核参数或启动不同的启动项,那么你的安全措施就形同虚设。因此,建议使用密码保护 GRUB,并实施最佳实践。

建立一个 强密码 限制条目修改或控制台访问。在 GRUB 2 中,使用用户名和密码 grub-mkpasswd-pbkdf2 并在脚本中配置相应的规则 /etc/grub.d/.

它还包含使用 LUKS 的磁盘加密,即使有人窃取了计算机,也无法读取数据。此外,它还确保系统密码策略严格,以减少暴力破解攻击。

明智地管理您的日志历史记录:那些会给攻击者提供线索的日志应该尽量减少或集中管理,并辅以访问控制;那些有助于审计恶意尝试的日志应该汇总并在安全的位置进行分析。

要检测其他已安装的系统并自动生成条目,请安装 os-prober它将节省您的时间并防止重新创建菜单时出现错误。

  Windows 辅助功能:您需要了解的所有关键选项

安装与维护

如果你在安装发行版时没有安装 GRUB,可以稍后再安装。在 GRUB 2 系统中,运行 sudo grub-install /dev/sdX (用你的磁盘替换)然后 sudo update-grub o sudo grub2-mkconfig -o /boot/grub/grub.cfg您将在下次启动时看到菜单。

从 GRUB Legacy 控制台,经典过程是指示根并运行安装: root (hd1,0) 接下来 setup (hd1,0) 对于第二个磁盘的第一个分区,或者 setup (hd1) 如果您指向第二个磁盘的 MBR。

直接编辑 /boot/grub/grub.cfg 即使从技术上讲这是可行的,但这在 GRUB 2 中并不是一个好主意。 推荐路线 就是要改变 /etc/default/grub, 用 /etc/grub.d/40_custom 为了自己的内容和再生。

实际问题和有用的捷径

如何知道 /dev/sda 上的哪个是启动分区? 在 BIOS/MBR 系统上: sudo fdisk -l /dev/sda (参见“Boot”的星号)。在 GPT/UEFI 中: lsblk -o NAME,FSTYPE,PARTTYPE,PARTFLAGS,MOUNTPOINT 并查找 EFI 分区(FAT32,类型为 EF00/flags esp)。此外 sudo efibootmgr -v 显示记录的启动条目。

如何获取分区的 UUID? 连接器 blkid o lsblk -f。 例如: sudo blkid /dev/sda2 返回其 UUID 和其他元数据。

如何让 GRUB 2 等待 10 秒再进入默认条目? 调整 /etc/default/grub 同 GRUB_TIMEOUT=10 (并且,如果适用, GRUB_TIMEOUT_STYLE=menu)并执行 sudo update-grub o grub2-mkconfig.

GRUB Legacy 命令安装在第二个磁盘的第一个分区上吗? 打开控制台并运行: root (hd1,0) 进而 setup (hd1,0)。如果您想要 MBR,那么 setup (hd1).

更改 GRUB 2 配置的步骤? 1)编辑 /etc/default/grub (例如。, GRUB_DEFAULT, GRUB_TIMEOUT), 2) 添加条目 /etc/grub.d/40_custom 如果你需要它们,3)再生 update-grub/grub2-mkconfig,4)重启并测试。

在 GRUB 2 中将自定义菜单放在哪里? En /etc/grub.d/40_custom (或自己的文件 /etc/grub.d/ 获得适当的权限)。切勿手动编辑 /boot/grub/grub.cfg 除非紧急情况。

GRUB Legacy 中的条目存储在哪里? En /boot/grub/menu.lst o grub.conf,根据分布。

如何从菜单访问 GRUB 控制台?在 GRUB 2 或 Legacy 中,按“c”键。要编辑特定条目,请按“e”键。这两个快捷键在需要快速诊断问题时非常有用。

常见选项示例

默认启动选择: GRUB_DEFAULT=0 第一局开始; GRUB_DEFAULT=saved 记住上次使用的配置。更改后,重新生成配置。

等待时间: GRUB_TIMEOUT=4 调整菜单延迟; 0 无需暂停即可开始;在某些情况下,您可以使用 GRUB_TIMEOUT_STYLE=hidden 为了更清洁的开始。

菜单更新:在 Debian/Ubuntu 及其衍生产品上, sudo update-grub;在其他情况下, sudo grub2-mkconfig -o /boot/grub/grub.cfg。确保你有 os-prober 如果您想自动检测其他系统,请安装。

虽然 GRUB 也出现在 GNU/Linux 以外的系统中,但请记住它并非技术支持服务。如果你的问题与 Windows 系统相关,最实际的做法是前往专门讨论 Windows 系统的论坛寻求帮助。

GRUB 已从一个简单的启动菜单发展成为一个真正的预系统环境,能够启动多个操作系统、管理复杂的磁盘,并只需几个命令即可帮助您恢复系统。通过适当的配置和一些强化措施(例如 GRUB 密码、LUKS 加密、完善的密钥策略和日志管理),您将拥有一个强大、灵活且最重要的是可控的启动过程。

UEFI 启动套件
相关文章:
UEFI Bootkit:Linux 上的 Bootkitty 和 BlackLotus 的遗产