GRUB(Grand Unified Bootloader)是Linux系统中广泛使用的引导加载程序,负责在开机时加载操作系统内核、初始化系统并启动,当系统出现引导问题(如无法进入系统、忘记密码、需要指定启动参数等)时,通过GRUB命令行进行操作是常见的解决方式,以下将详细介绍开机时如何进入GRUB命令行及常用命令的使用方法。
进入GRUB命令行的方法
不同Linux发行版进入GRUB菜单的方式略有差异,但核心逻辑是通过特定按键中断自动启动流程,进入GRUB交互界面后再切换到命令行模式,以下是常见操作步骤:
进入GRUB菜单
- Ubuntu/Debian系统:开机时按住
Shift
键(或连续按Esc
),直到出现GRUB菜单界面。 - CentOS/RHEL/Fedora系统:开机时按
e
键(部分系统需先按Esc
唤醒GRUB菜单后再按e
),进入编辑模式。 - Arch Linux系统:开机时按
Esc
键,进入GRUB菜单后选择“Advanced options”或直接按e
编辑启动项。
切换到命令行模式
- 若在GRUB菜单界面,直接按
c
键即可进入GRUB命令行( grub> 提示符)。 - 若已进入编辑模式(如按
e
后),需先定位到以linux
或linuxefi
开头的内核参数行,将光标移至行尾,删除ro quiet splash
等参数,添加init=/bin/bash
(临时切换为bash环境)或直接按Ctrl+X
进入命令行(部分系统需先按F10
启动,再中断进入命令行)。
GRUB命令行常用命令及示例
进入GRUB命令行后,可通过命令查看设备、加载内核、设置参数等,以下是核心命令及用法(以GRUB2为例,GRUB Legacy命令略有差异):
命令 | 用途 | 示例 |
---|---|---|
help |
显示所有可用命令及帮助信息 | help |
ls |
列出所有存储设备及分区 | ls (显示如(hd0,gpt1) (hd0,gpt2) 等分区) |
set |
查看或设置GRUB环境变量 | set (查看当前变量,如root 、prefix );set root='hd0,gpt1' (设置根分区) |
linux |
加载Linux内核文件 | linux /boot/vmlinuz-5.4.0-91-generic root=/dev/sda2 (指定内核路径和根分区) |
initrd |
加载initrd镜像文件 | initrd /boot/initrd.img-5.4.0-91-generic |
boot |
启动已配置的内核 | boot (执行加载内核和initrd后启动) |
reboot |
重启系统 | reboot |
insmod |
动态加载模块 | insmod ext2 (加载ext2文件系统模块,用于识别分区) |
search |
搜索包含特定文件的分区 | search --set=root --file /boot/grub/grub.cfg (查找grub.cfg并设为根分区) |
GRUB命令行常见操作场景
启动系统(指定内核或根分区)
当系统因根分区参数错误无法启动时,可通过命令手动指定:
# 1. 列出分区,确认内核和initrd路径 ls (hd0,gpt1)/boot/ # 假设系统在hd0,gpt1分区,查看boot目录下的文件 # 2. 加载内核和initrd linux /boot/vmlinuz-5.4.0-91-generic root=/dev/sda2 ro initrd /boot/initrd.img-5.4.0-91-generic # 3. 启动 boot
修复忘记的root密码
- 进入GRUB命令行后,修改内核参数,添加
rd.break
(进入系统初始化的紧急模式):linux /boot/vmlinuz-5.4.0-91-generic root=/dev/sda2 ro rd.break initrd /boot/initrd.img-5.4.0-91-generic boot
- 系统会挂载根分区为
/sysroot
,执行以下命令重置密码:mount -o remount,rw /sysroot # 重新挂载为可读写 chroot /sysroot # 切换到根环境 passwd root # 修改root密码 touch /.autorelabel # (可选)强制下次重启时重新标签文件系统 exit # 退出chroot reboot # 重启系统
无法识别文件系统(如LVM、加密分区)
若GRUB默认无法识别分区文件系统(如LVM、LUKS加密),需先加载对应模块:
# 加载LVM模块(适用于LVM分区) insmod lvm ls # 此时会显示LVM卷组名称(如vg0/root) # 加载加密分区模块(LUKS) insmod cryptodisk insmod luks # 搜索LUKS分区并解锁(需手动输入密码) search --set=root --fs-uuid xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx # LUKS分区的UUID cryptomount uuid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
注意事项
- GRUB版本差异:GRUB Legacy(GRUB 0.97)与GRUB2命令不同,例如GRUB Legacy用
root (hd0,0)
表示第一个分区的第一个扇区,而GRUB2用set root='hd0,gpt1'
。 - 操作前备份:修改GRUB配置前,建议备份
/boot/grub/grub.cfg
文件,避免误操作导致系统无法启动。 - 参数谨慎性:手动指定内核参数时,确保
root=
参数正确(可通过ls
和blkid
命令查看分区UUID或设备名)。
相关问答FAQs
Q1:开机时按Shift/Esc无法进入GRUB菜单怎么办?
A:可能原因及解决方法:
- BIOS/UEFI禁用了快速启动:进入BIOS/UEFI设置,关闭“Fast Boot”或“UEFI Fast Boot”选项。
- GRUB超时时间过短:修改
/etc/default/grub
文件,将GRUB_TIMEOUT
设置为10
(默认可能为0或秒数),然后执行sudo update-grub
更新配置。 - GRUB未安装在主引导记录(MBR)或EFI分区:重新安装GRUB,例如Ubuntu系统执行
sudo grub-install /dev/sda
(MBR模式)或sudo grub-install --efi-directory=/boot/efi
(UEFI模式)。
Q2:使用GRUB命令行启动后,系统报错“kernel panic: not syncing: VFS: Unable to mount root fs on unknown-block(0,0)”怎么办?
A:通常是因为root=
参数错误或内核未找到根分区,解决步骤:
- 确认内核路径:通过
ls (hd0,gpt1)/boot/
查看vmlinuz
和initrd
文件是否存在,路径是否正确。 - 确认根分区:使用
blkid
命令查看分区的UUID(如UUID=xxxx-xxxx / ext4 defaults 0 0
),然后修改linux
行中的root=
参数为root=UUID=xxxx-xxxx
。 - 检查文件系统模块:若使用ext4/xfs等文件系统,确保加载了对应模块(如
insmod ext4
)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/17581.html