现象
Linux系统启动时,Grub报错找不到设备,如下图:
原因
这一般是由于grub的配置文件错误,找不到/boot分区,从而报错。
解决方法
进入系统,重新生成grub的配置文件即可。grub一般会从当前系统中获取信息,生成正确的配置文件。
1. 进入系统
若因为故障导致无法进入系统,可参考下面的方法进入系统。
重启系统,在grub启动菜单(见下图)出现时按“c”,进入grub shell。
这是grub shell的界面。grub shell是个类似linux shell的环境,可以在这里手动配置,进入系统。
grub> ls # 查看目前都有哪些设备,下面是样例输出
(proc) (hd0) (hd0,gpt5) (hd0,gpt4) (hd0,gpt3) (hd0,gpt2) (hd0,gpt1)
grub> ls (hd0,gpt3)/ # 可以查看文件系统中都有哪些文件,从而找到/boot分区。/boot分区下一般会有vmlinuz-xxx和initramfs-xxx文件
lost+found/ efi/ grub2/ grub/ initramfs-3.10.0-957.el7.x86_64.img System.map-3.
10.0-957.el7.x86_64 config-3.10.0-957.el7.x86_64 symvers-3.10.0-957.el7.x86_64.
gz vmlinuz-3.10.0-957.el7.x86_64 ...
grub> root=(hd0,gpt3) # 设置root变量为/boot分区,后面可避免重复输入/boot分区的位置
grub> linux /vmlinuz-3.10.0-957.el7.x86_64 root=UUID=c74bd658-cd12-414f-80c6-0200fe5a6685 # 指定linux启动用的内核,UUID用来指定根分区。可以ls查看分区内容确定根分区,用ls -l获取分区(或分区上文件系统)的UUID。
grub> initrd /initramfs-3.10.0-957.el7.x86_64.img # 指定linux启动的内存文件系统,需要和内核版本匹配。
grub> boot # 启动系统
需注意,linux/initrd命令最为常用,但有些系统使用linux16/initrd16或linuxefi/initrdefi命令来指定linux内核和内存镜像。如果linux/initrd命令没有用,可以在grub shell中用命令 cat $root/grub2/grub.cfg
查看原grub.cfg,以确定使用何种命令。
2. 更新grub.cfg
linux系统启动后,登录进入系统。执行下面命令重新生成grub.cfg。
## 备份旧grub.cfg文件,以防万一
GRUB_CFG=$(find /boot -name "grub.cfg")
cp -v $GRUB_CFG /root
## 更新grub.cfg
# 对centos/redhat/rocky/openEuler等发行版
grub2-mkconfig $GRUB_CFG
# debian/ubuntu等发行版
update-grub
更新grub.cfg后,请重启测试是否修复了问题。