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的三个阶段:
- 引导加载阶段:由UEFI固件执行GRUB的EFI应用程序
- 核心映像阶段:加载GRUB核心模块和基本功能
- 配置执行阶段:读取grub.cfg并显示引导菜单
当自动引导失败时,我们需要在命令行手动完成这些步骤。下面这个表格对比了自动引导与手动引导的关键差异:
| 引导方式 | 所需文件 | 用户交互 | 适用场景 |
|---|---|---|---|
| 自动引导 | grub.cfg | 无 | 系统正常时 |
| 手动引导 | 内核与initrd | 命令行输入 | 系统故障时 |
2. 准备工作:定位关键分区与文件
在开始手动引导前,我们需要先找到几个关键组件的位置:
- Linux内核:通常位于/boot/vmlinuz-版本号
- initrd镜像:通常位于/boot/initrd.img-版本号
- 根分区:包含系统文件的挂载点
进入GRUB命令行的方法:
- 在引导时按住Shift键(传统BIOS)或Esc键(UEFI)
- 出现GRUB菜单时按'c'键
- 或者在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-genericinitrd(初始内存磁盘)包含启动早期所需的驱动和工具。其版本号必须与内核一致。
3.4 启动系统
boot执行此命令后,GRUB会将控制权交给Linux内核,开始系统启动过程。
3.5 故障排查
如果启动失败,常见问题及解决方法:
- 内核panic:检查root参数是否正确,确认文件系统无损坏
- 无法挂载根文件系统:确认root设备路径,尝试添加
rootfstype=ext4等参数 - 卡在initramfs:可能是initrd损坏或缺少关键驱动
4. 针对不同硬件设备的调整
4.1 Intel Atom Z3735等32位UEFI设备
这类设备需要特殊处理:
- 使用32位GRUB EFI加载器(bootia32.efi)
- 手动引导命令与常规系统相同
- 安装系统后需修复引导:
sudo apt-get install grub-efi-ia32-bin sudo grub-install --target=i386-efi --efi-directory=/boot/efi --boot-directory=/boot4.2 多硬盘系统
当系统有多个磁盘时,GRUB的设备命名可能变化。可以通过以下命令确认:
ls -l /dev/disk/by-id/然后在GRUB命令中使用UUID指定根分区:
linux /boot/vmlinuz-... root=UUID=5e7e4f8d-3b12-4a8c-9c5d-1e1f3a7b8c9d5. 永久修复GRUB引导
成功进入系统后,需要永久修复引导问题:
sudo update-grub sudo grub-install /dev/sda对于EFI系统:
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu6. 高级技巧与自动化脚本
对于经常需要手动引导的用户,可以创建自定义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-grub7. 安全注意事项
手动引导时需注意:
- 避免随意修改内核参数,特别是
init=参数 - 不要使用未知来源的内核和initrd
- 在公共计算机上输入命令时注意隐私保护
掌握这些GRUB命令行技巧后,你将能够应对绝大多数Linux引导故障,无需依赖Live CD或重装系统。记住,每个成功的系统修复都是对技术理解的深化,而这些经验最终会让你成为真正的Linux问题解决专家。