GRUB 2 命令行实战:5个命令从 UEFI Shell 手动引导 Ubuntu 系统

GRUB 2 命令行实战:5个核心命令从 UEFI Shell 手动引导 Ubuntu 系统

当你的Ubuntu系统突然无法启动,屏幕上只留下冰冷的UEFI Shell或GRUB Rescue提示符时,别急着重装系统。掌握GRUB 2命令行工具,你完全可以在没有图形界面的情况下,像外科手术般精准地手动引导系统。本文将带你深入GRUB 2的底层机制,通过5个关键命令的组合使用,解决各种引导故障场景。

1. 理解GRUB 2引导流程与故障场景

GRUB 2(GRand Unified Bootloader version 2)是现代Linux系统的默认引导加载程序,它负责在系统启动时加载内核和初始化内存盘。与传统BIOS不同,UEFI环境下的引导过程更为复杂,这也导致了更多潜在的故障点。

常见的引导失败场景包括:

  • UEFI Shell直接启动:系统无法找到有效的引导加载程序
  • GRUB Rescue模式:GRUB无法定位其核心模块或配置文件
  • 黑屏或无响应:内核加载失败或初始化内存盘损坏
  • 文件系统错误:根分区损坏或UUID变更

在Intel Atom Z3735等低功耗设备上,问题可能更复杂。这些设备通常只支持32位UEFI固件,却需要引导64位操作系统,导致标准Ubuntu安装介质无法直接工作。

手动引导的关键在于理解GRUB 2的三个阶段:

  1. 引导加载阶段:由UEFI固件执行GRUB的EFI应用程序
  2. 核心映像阶段:加载GRUB核心模块和基本功能
  3. 配置执行阶段:读取grub.cfg并显示引导菜单

当自动引导失败时,我们需要在命令行手动完成这些步骤。下面这个表格对比了自动引导与手动引导的关键差异:

引导方式所需文件用户交互适用场景
自动引导grub.cfg系统正常时
手动引导内核与initrd命令行输入系统故障时

2. 准备工作:定位关键分区与文件

在开始手动引导前,我们需要先找到几个关键组件的位置:

  • Linux内核:通常位于/boot/vmlinuz-版本号
  • initrd镜像:通常位于/boot/initrd.img-版本号
  • 根分区:包含系统文件的挂载点

进入GRUB命令行的方法:

  1. 在引导时按住Shift键(传统BIOS)或Esc键(UEFI)
  2. 出现GRUB菜单时按'c'键
  3. 或者在UEFI Shell中直接输入grubx64.efi

2.1 使用ls命令探索磁盘结构

GRUB的ls命令可以列出所有可识别的设备和分区:

ls

典型输出示例:

(hd0) (hd0,gpt1) (hd0,gpt2) (hd1) (hd1,msdos1) (hd1,msdos2)

这里需要注意:

  • hd0表示第一个硬盘,hd1是第二个,以此类推
  • gpt表示GPT分区表,msdos表示MBR分区表
  • 数字表示分区号(从1开始)

对于eMMC存储的设备(如Z3735平板),可能会显示为(hd0,msdos1)(hd0,gpt1)形式。而SD卡或USB设备通常会被识别为(hd1)等后续编号。

2.2 定位Linux分区

通过以下命令检查各分区内容,寻找包含/boot目录的分区:

ls (hd0,gpt1)/ ls (hd0,gpt2)/boot

成功找到内核的分区会显示类似内容:

vmlinuz-5.15.0-56-generic initrd.img-5.15.0-56-generic grub/

对于不同存储设备,根分区的设备节点名称也不同:

  • SATA硬盘:/dev/sda2
  • eMMC存储:/dev/mmcblk0p2
  • NVMe SSD:/dev/nvme0n1p2

提示:在不确定分区时,可以尝试所有可能的组合。GRUB支持Tab键补全,输入部分路径后按Tab可以显示可用选项。

3. 手动引导五步法

找到必要文件后,按照以下五个步骤完成引导:

3.1 设置根设备

set root=(hd0,gpt2)

这个命令告诉GRUB哪个分区包含内核和initrd。这里的(hd0,gpt2)应替换为你实际找到的分区。

3.2 加载Linux内核

linux /boot/vmlinuz-5.15.0-56-generic root=/dev/mmcblk0p2

参数说明:

  • 第一个参数是内核路径(相对于上一步设置的root)
  • root=指定根文件系统设备
  • 可添加其他内核参数如ro(只读挂载)、quiet(减少输出)等

对于不同设备类型,root参数需要相应调整:

  • SATA硬盘:root=/dev/sda2
  • eMMC:root=/dev/mmcblk0p2
  • LVM卷:root=/dev/mapper/vgubuntu-root

3.3 加载initrd镜像

initrd /boot/initrd.img-5.15.0-56-generic

initrd(初始内存磁盘)包含启动早期所需的驱动和工具。其版本号必须与内核一致。

3.4 启动系统

boot

执行此命令后,GRUB会将控制权交给Linux内核,开始系统启动过程。

3.5 故障排查

如果启动失败,常见问题及解决方法:

  1. 内核panic:检查root参数是否正确,确认文件系统无损坏
  2. 无法挂载根文件系统:确认root设备路径,尝试添加rootfstype=ext4等参数
  3. 卡在initramfs:可能是initrd损坏或缺少关键驱动

4. 针对不同硬件设备的调整

4.1 Intel Atom Z3735等32位UEFI设备

这类设备需要特殊处理:

  1. 使用32位GRUB EFI加载器(bootia32.efi)
  2. 手动引导命令与常规系统相同
  3. 安装系统后需修复引导:
sudo apt-get install grub-efi-ia32-bin sudo grub-install --target=i386-efi --efi-directory=/boot/efi --boot-directory=/boot

4.2 多硬盘系统

当系统有多个磁盘时,GRUB的设备命名可能变化。可以通过以下命令确认:

ls -l /dev/disk/by-id/

然后在GRUB命令中使用UUID指定根分区:

linux /boot/vmlinuz-... root=UUID=5e7e4f8d-3b12-4a8c-9c5d-1e1f3a7b8c9d

5. 永久修复GRUB引导

成功进入系统后,需要永久修复引导问题:

sudo update-grub sudo grub-install /dev/sda

对于EFI系统:

sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu

6. 高级技巧与自动化脚本

对于经常需要手动引导的用户,可以创建自定义GRUB菜单项。编辑/etc/grub.d/40_custom

menuentry "Manual Boot" { set root=(hd0,gpt2) linux /boot/vmlinuz-... root=/dev/mmcblk0p2 initrd /boot/initrd.img-... }

然后更新GRUB配置:

sudo update-grub

7. 安全注意事项

手动引导时需注意:

  • 避免随意修改内核参数,特别是init=参数
  • 不要使用未知来源的内核和initrd
  • 在公共计算机上输入命令时注意隐私保护

掌握这些GRUB命令行技巧后,你将能够应对绝大多数Linux引导故障,无需依赖Live CD或重装系统。记住,每个成功的系统修复都是对技术理解的深化,而这些经验最终会让你成为真正的Linux问题解决专家。