前言
最近这段时间又有兴趣开始使用Ubuntu系统了,但之前为了和某些学长项目统一,使用的是Ubuntu14.04。最近Ubuntu18.04出了之后,就想着重新装一个Ubuntu系统(其实也是之前ubuntu14是刚接触ubuntu时安装的,配置很乱想重新开始),但在安装完后遇到了启动就进入grub命令行的问题。按照一些网上的教程安装Win10,ubuntu16.04 LTS双系统 莫名进入grub命令行 - CSDN博客,我成功进入了ubuntu系统,但重启之后发现又出现了命令行,这与教程中的结果不一致。后来研究了一下,发现了我的问题,记录在此,可能会对一些人有帮助。
安装过程简介
我是采用rufus制作的启动盘,因为我的BIOS中选择boot启动项时,只能添加.efi文件作为启动项,因此说明主板是支持BIOS的,所以rufus中的分区方案选择的是支持GPT分区。因为我的笔记本是SSD+机械硬盘,所以我在机械硬盘上预留了80G的空间用来安装ubuntu。然后就是照常进行安装,挂载分区有/,/home,/boot,交换空间,这些具体大小按照个人喜好来分配,网上也有很多教程(这步的教程还算靠谱)。然后在分配完后,最底下会提示安装启动引导器的设备:
在这里,为了防止我以前的windows启动项被刷掉,我选择了安装在挂载/boot的设备下,但与上面这幅图不同的是,因为我是将ubuntu安装在机械硬盘下,所以/boot分区也会在机械硬盘中,但它并不是efi类型的分区,然而grub因为选择了是UEFI引导,就会安装到efi分区,因此就出现了grub安装与boot启动分离的原因,进而grub无法找到启动项。
问题分析
首先要知道为什么会出现这个问题,否则就会像我一样在网上找了很多教程结果却没有任何效果。根据安装过程我们可以知道,问题大概就出在我的硬盘并不能够支持efi启动,但我却安装了efi启动的ubuntu导致。我在安装之前就想到了这个问题。
根据Windows10+Ubuntu18.04双系统安装成功心得(理清网上杂乱无章的教程) - CSDN博客,可以先对自己的硬盘有初步的印象。我硬盘的情况如下:
可以看到只有SSD才是GPT分区,因此我需要把ubuntu启动项安装在此。进入BIOS后也发现了boot启动项只能在SSD的范围内找到。所以最简单的解决办法就是给SSD中分配一个单独的空间,作为ubuntu启动点,但很可惜我电脑中对C盘的可压缩空间为0。
那么现在就应该能够理清问题了:
1.BIOS中需要UEFI启动,并且启动项只能够在磁盘0(SSD)中
2.ubuntu安装在机械硬盘中,/boot也被安装在机械硬盘中
3.ubuntu自动安装grub到了efi分区中,也就是磁盘0,grub无法再磁盘0中找到相应启动项,因此会进入rescue模式
那为什么在rescue中输入命令就能够正常启动ubuntu呢?这是因为人为的指定了启动路径,这样grub就能够找到启动点。
那么问题又来了,为什么重启之后就又会重新进入rescue模式呢?
这就要理解教程每一步的意义了。在最后两步,我们运行了
sudo update-grub
...
sudo grub-install /dev/sdb7
因为我将boot挂载在/dev/sdb7中,所以把grub安装在此。但是这其实并没有更新grub,因为刚刚说到了,BIOS只会找SSD(磁盘0,ubuntu中为sda)中的启动项,而sdb是磁盘1,也就是在机械硬盘中,就算写出花来,BIOS还是找不到改正后的grub.efi,而还是会启动最原始的存在磁盘0的那个grub,然后报错找不到。
问题解决
知道了问题所在,那解决起来就很简单了,只要把SSD中的grub.efi换成更新后的efi不就ok了吗?事实也正是如此。不过还是有两个坑。
1.efi启动分区受系统保护,需要使用root挂载这个分区
2.修改grub.cfg这个文件
先说第一个问题。这个问题很简单,先用sudo passwd命令更改当前密码,这样root密码就和改后密码一致,然后su root进入root用户,强制挂载efi启动分区。我的电脑中,是
mount /dev/sdb1 /boot/efi(某个文件夹)
注意这个挂载到哪是无所谓的,不一定非要挂载在/boot下,完全看个人喜好。进入到挂载路径后,应该能看到一个文件夹叫做EFI,再打开后:
会看到类似于上面的启动项,那个Microsoft就是win10的启动项,ubuntu是我自己建的目录,那个最原始的就是grub文件夹,为了保险,我没有删除原来的,而是在自己建的目录下把原本在/dev/sdb7中更新过的文件拷贝过来:
把x86-64-efi文件夹中与efi启动有关的项目拷贝到刚刚说的ubuntu文件夹中,这样更新后的文件就能够被BIOS找到了,然后只要在BIOS中添加了这个启动项(如何在BIOS中添加启动项每个电脑具体操作不同,所以不提供教程),再重启后就能正常引导了!
但等等,为什么有些人还是不能够成功?这就是我刚说了还有第二个问题,我个人觉得比较奇葩,应该比较难遇到。那就是在更新了grub.cfg后(运行sudo update-grub就会更新),我打开看了一下其中的内容
这是就是grub可视化菜单的代码表示,注意set root='hd2,msdos7'这行,上图是我更改后的结果。在之前默认的是'hd1,msdos7',但是根据教程安装Win10,ubuntu16.04 LTS双系统 莫名进入grub命令行 - CSDN博客,进行查询后,只有hd2有第七个分区,说明我的/boot分区也就是/dev/sdb7在grub中显示的是(hd2,msdos7),所以需要把grub.cfg中与ubuntu引导有关的都改成hd2,msdos7。注意你应该用ls命令查到自己/boot对应的是哪个分区,然后看是否与grub.cfg中设置一致。
至此,就解决了所有问题,我第一次写博客,可能会写的不清楚,如果有疑问或者我写的不对的地方,可以写到评论中,也可以直接给我发邮件:[email protected]