现象描述:启动ubuntu的时候就发现进入到了grub rescue救援模式,无法进入到系统,网上百度了一大堆,都是说在救援模式下ls查看每个分区,直到找出哪个分区下面有/boot/grub,然后再用命令把启动引导分区设置成这个,千篇一律的答案,他们那些适用于启动分区设置错误,但是/boot/grub和vmlinuz等文件本身存在的情况。但是我的情况是:只有一个硬盘和分区,并且压根没有找到grub文件
问题原因:当我在ubuntu里使用yocto为imx8plus构建系统的时候,由于构建过程中会产生大量的中间文件,导致磁盘占用快满了,于是我在windows端的磁盘管理下为ubuntu所在的物理磁盘E拓展了80G的磁盘空间,然后在ubuntu的命令行用fdisk给虚拟机扩容了。中间少了一步,导致分区错乱,文件系统受到损坏
正确的步骤应该是
1.先在windos端为ubuntu所在的磁盘驱动器拓展卷(win+x->磁盘管理->找到ubuntu安装位置所在磁盘->右键->拓展卷)
2.打开虚拟机,在虚拟机设置里为它拓展,如下图:
3.在ubuntu系统里用fdisk或gparted等工具进行扩展(我下面是已经拓展过的,这里只是说明一下操作方法):
上面略微有点啰嗦了,接下来进入正题,看如何解决
解决方案:
第一步:你要知道你的ubuntu是哪个版本的,像我的是18.04,那么就需要准备ubuntu18.04的原生iso镜像,如果没有可以到网上自行下载
第二步:在虚拟机设置里设置成使用ISO映像文件,浏览选中刚才第一部提到的ubuntu18.4镜像,点击确定
第三步:打开虚拟机,启动ubuntu,在启动时迅速按下F2,会出现下列界面。把boot设置下面的四个选项中的优先级调整一下,这是用来配置启动顺序的地方。设备的排列顺序决定了计算机启动时检查启动设备的顺序,这里我们把CD-ROM drive挪到最上面(shift + 加号 代表上移 减号可以下移),按下F10保存,选择yes确定保存,然后重启,这时候会先尝试从CD-ROM驱动器启动
第四步:重启完之后会会正常进入ubuntu的系统里,进去之后会出现一个引导界面,会有两个选项,一个是try ubuntu,另一个是install ubuntu
这里我们选择try ubuntu,耐心等待一会儿,它会自动进入到ubuntu系统桌面,然后这里打开终端,先修复下磁盘sudo fsck -f /dev/sda1
如果显示有error就多执行几次,直到出现/dev/sdxxx:clean
第五步:为/dec/sda1创建grub启动文件
sudo mount /dev/sda1 /mnt
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
sudo chroot /mnt
grub-install /dev/sda
update-grub
Exit
for i in /dev/pts /proc /sys /run; do sudo umount /mnt$i; done
sudo umount -l /mnt
sudo reboot
如果sudo umount /mnt的时候显示umount :/mnt is busy可以换成sudo umount /mnt,或者lsof | grep “/mnt”查看哪些进程在占用它,找到它的进程号杀死它
图片示例:
这些步骤将修复或重新安装GRUB到您的硬盘(/dev/sda),并确保虚拟机可以正常启动Ubuntu系统
第六步:重启,这时就可以正常进入到ubuntu系统里了,并且以前系统里的数据都还在,没有被破坏。如果想把启动引导方式改成物理磁盘驱动器,那就按照上面第二步的示例自行改回来即可,看你个人选择。至此,大功告成。我的方法也不一定适合你们,如果跟我的情况不一样,还是要多自己研究,把这个原理搞清楚。
我这里只是提供了一个方法论,用下面的比喻会更容易理解一些:
通过Live CD/USB进入了系统,相当于拿到了系统的“备用钥匙”,然后进入了系统,就像进入了一座房子一样。我们重新安装了GRUB引导程序,相当于重新贴了一张门牌,告诉系统应该从哪里启动。然后我们更新了一下配置,就像是给系统一份新的地图,让它知道应该怎么启动。
最后,我们收拾了一下,卸载了我们用来进入系统的工具,然后重启了系统。这样系统就能够正常启动了,就像以前一样!
总的来说,我们的做法就是通过一个备用的方式进入你的系统,修复了一些东西,然后再正常地启动。这样你的Ubuntu系统又回来了,一切都像以前一样