事件概述
我在电脑上使用安装ubuntu时默认使用的grub2 (2.02)来管理双系统的启动,我只有一块nvme的固态盘,磁盘做的是gpt分区,两个系统分别是Windows 10和Ubuntu18.04,两个系统启动应该都是用的uefi引导(上述的一些东西我也不是很了解,姑且记之)。
一次,当我在ubuntu中执行一个比较大的任务时,系统崩掉了,除了鼠标之外什么都动不了,我遂长按开机键来关机,关机后再次启动,我已经见不到grub2正常的引导页面了(就是那个可以选择是进入windows还是ubuntu的界面),而是看到了一个grub的命令行,也就是说,我现在啥系统都无法直接进了。
解决方案
直接先说我最终的解决办法吧。
先想办法启动ubuntu,做法是:
- set root=(hd0,gpt6) (在输到"("之后,按一下tab,我的能自动填充hd0,之后,再按一下tab键,可以显示出磁盘分区,在我的电脑上显示出了6个gpt分区,以及这些分区的基本信息,我判断出我的ubuntu应该是安装在gpt6的)
- linux /boot/vmlinuz-*****-generic root=UUID=****** (第一处靠tab补全,第二处填写在第一步中看到的ubuntu系统所在的磁盘分区的uuid)(需要记住这个uuid,记前几位即可,稍后还会用到)
- initrd /boot/initrd***** (还是按tab补全)
- boot
成功启动后需要修复grub2
- sudo update-grub
- sudo grub-install /dev/disk/by-uuid/***** (此处填写在之前记下来的安装了ubuntu的gpt分区的uuid的前几位,按tab补全)(如果安装正常的话,应该会显示“安装完成,没有报告错误”)
这样便算是成功恢复了,看起来还挺顺利,但实际从头开始摸索的时候远远没有这么简单,下边,我简单地记录一些我踩过的坑。
踩坑记录
和解决很多其他的问题一样,我在处理这个问题的过程中也走了不少的弯路,其中有很多是我到现在也搞不明白的,我将其记录在这里,说不定还能用上。
-
尝试进入Windows,并在Windows完成修复。我成功地进入了Windows10,但我未能完成修复工作。
- set root=(hd0, gpt2) (这一个root的地址也和上文一样,是通过tab键加载选项,并观察而得出的,我的第二个gpt分区就是一个引导分区)
- chainloader /efi/Windows/Boot/bootmgfw.efi
- boot
- 成功进入Windows,但是接下来我实在是没找到一个能修复grub2或代替其来完成引导工作的方法,遂放弃。
-
在尝试进入ubuntu时,使用"linux"命令加载镜像时,没有在其后加上"root=UUID=*****"这条命令,进入到了initramfs中
initramfs,应该可以被理解为init ram file system吧,直观地来看,在这里边可以执行一些linux命令,可以查看存在磁盘上的文件,以及可用的设备等。网上有很多博客介绍在linux开机如果进入到了这里边,需要用fsck命令来检查和修复磁盘之类的,我也试了试,不过我的磁盘并没有问题,之后我使用reboot命令,不出意外地,我又会进入到grub2的界面。随着后边我的启动成功,我便也没有深入地探索这个系统。
后记
最后,解释一下我用到过的那几条grub命令吧,参考官方解释。
-
set: 设置环境变量,如果不带参数,则是显示当前所有的环境变量。
-
linux: 从文件中加载Linux内核image。该行的其余内容则直接作为内核的命令传递,在使用了这个命令之后必须使用initrd命令。
-
intird: 为Linux内核image加载初始的ramdisk,并在内存中的Linux安装区域中设置适当的参数,这只能在linux命令后使用。
-
boot: 引导已经加载的操作系统或链式加载程序。
-
chainloader: 作为一个链式加载程序来加载一个文件,如我在前文所述,当我用此命令加载了一个windows的efi文件之后,便能顺利地引导win10系统的启动了。