菜鸟科技网

grub find命令

GRUB find 命令是什么?

find 是 GRUB 提供的一个命令行工具,用于在硬盘的分区中搜索指定的文件,它的主要作用是:

grub find命令-图1
(图片来源网络,侵删)
  1. 定位文件系统:找到你的 Linux 系统安装所在的分区。
  2. 定位核心文件:找到启动 Linux 所必需的内核文件(如 vmlinuz)和初始内存盘(如 initrd.img)。

当你的系统因为配置文件(如 /boot/grub/grub.cfg)损坏、MBR/GPT 引导扇区错误或硬盘分区表变化而无法自动启动时,你就可以进入 GRUB 命令行,使用 find 命令手动告诉 GRUB 内核和 initrd 文件在哪里,从而完成手动引导。


基本语法

find 命令的基本语法非常简单:

find [选项] 文件名

常用选项

  • (hd0)(hd0,gpt1):这是 GRUB 中表示硬盘和分区的格式。

    • hd 代表 Hard Disk (硬盘)。
    • 后面的数字 0 代表第 0 块硬盘(在 GRUB 中计数从 0 开始,hd0 是第一块硬盘,hd1 是第二块,以此类推)。
    • ,gpt1 代表 GPT 分区表下的第 1 个分区(同样从 1 开始计数),如果是 MBR 分区表,则使用类似 (hd0,msdos1) 的格式。
    • 你可以省略分区号,直接写 (hd0),GRUB 会在该硬盘的所有分区中搜索。
  • --set=root:这是一个非常有用的选项,当 find 命令成功找到文件后,它会将该文件所在的分区设置为 GRUB 的根设备 (root),后续的 linuxinitrd 命令就会默认在这个根设备下寻找文件,省去了你手动输入完整路径的麻烦。

    grub find命令-图2
    (图片来源网络,侵删)

常用搜索文件名

  • /boot/vmlinuz-*:内核文件, 是通配符,可以匹配内核版本号。
  • /boot/initrd.img-*:初始内存盘文件,用于加载驱动模块。
  • /boot/grub/grub.cfg:GRUB 的主配置文件。

使用场景和示例

假设你的系统无法启动,你进入了 GRUB 的命令行界面(通常按 c 键)。

示例 1:查找内核文件并设置根设备

这是最常见的用法,目的是找到内核并启动它。

  1. 启动 GRUB 命令行 在 GRUB 菜单出现时,按 c 键。

  2. 使用 find 命令 我们尝试在第一块硬盘 (hd0) 的所有分区中查找内核文件。

    grub find命令-图3
    (图片来源网络,侵删)
    find --set=root /boot/vmlinuz
    • 命令解释find 会在 (hd0), (hd0,1), (hd0,2) ... 等分区中搜索 /boot/vmlinuz
    • 成功输出:如果找到了,GRUB 会返回类似下面的信息,并且自动将 root 变量设置为找到文件的分区。
      Found linux image: /boot/vmlinuz-5.15.0-88-generic

      这行输出不仅告诉你找到了,还告诉你 root 变量已经被设置为了这个文件所在的分区((hd0,gpt2))。

  3. 加载内核和 initrd root 已经设置好了,你可以直接加载内核和 initrd 文件,使用 Tab 键可以自动补全文件名,非常方便。

    linux /boot/vmlinuz-5.15.0-88-generic root=/dev/sda2 ro
    initrd /boot/initrd.img-5.15.0-88-generic
    • 注意root=/dev/sda2 这里的设备名是 Linux 内核能识别的设备名(如 /dev/sda2),而不是 GRUB 的 (hd0,gpt2),你需要将 find 找到的分区号对应到 Linux 的设备名上。(hd0,gpt1) 对应 /dev/sda1(hd0,gpt2) 对应 /dev/sda2
  4. 启动系统 执行 boot 命令启动。

    boot

示例 2:查找 GRUB 配置文件

grub.cfg 文件丢失或损坏,导致 GRUB 无法显示菜单,你可以手动找到它并加载。

  1. 查找 grub.cfg

    find --set=root /boot/grub/grub.cfg
  2. 手动配置并启动 找到后,root 已经设置,你可以手动指定内核和 initrd 的完整路径(虽然 root 已设,但明确写出更清晰)。

    linux /boot/vmlinuz-5.15.0-88-generic root=/dev/sda2 ro
    initrd /boot/initrd.img-5.15.0-88-generic
    boot

示例 3:在特定分区中查找

如果你大概知道系统安装在哪个分区,可以直接指定,提高搜索效率。

# 在第一块硬盘的第二个 GPT 分区中查找
find (hd0,gpt2) /boot/vmlinuz
# 在第二块硬盘的第一个分区中查找
find (hd1,1) /boot/initrd.img

search 命令的对比

GRUB 还有一个类似的命令叫做 searchsearch 功能更强大,它不直接搜索文件,而是通过文件系统属性来查找。

  • find:通过文件名在文件系统中搜索。
  • search:通过文件系统标签、UUID 等唯一标识符来查找分区。

search 命令通常被认为更可靠,因为它不依赖于文件路径,即使你 /boot 分区被挂载到其他地方(/home/boot),只要标签或 UUID 不变,它就能找到。

search 命令示例:

# 通过文件系统标签查找
search --label --set=root my_root_partition
# 通过文件系统 UUID 查找
search --fs-uuid --set=root 1234abcd-56ef-7890-1234-567890abcdef
  • 快速修复:在大多数情况下,使用 find --set=root /boot/vmlinuz 是最快、最直接的方法。
  • 更健壮的修复:如果文件路径可能有问题,使用 search --labelsearch --fs-uuid 是更可靠的选择,因为它与挂载点无关。

对于日常的应急修复,find 命令因其简单直观而广受欢迎,理解它的用法是掌握 GRUB 手动引导的关键一步。

分享:
扫描分享到社交APP
上一篇
下一篇