一、出现问题的原因
今天自己给ubuntu16.04换一个高版本的linux内核,从4.4.4换到了4.15.0。换内核的过程中,我直接将低版本内核的编译配置文件直接复制到了高版本的内核代码中,直接进行编译,虽然在编译过程中有一些warning,但是编译还是顺利通过了。然后就内核安装,命令行设置为了默认启动内核高版本;然后将电脑重启,等了很久ssh都连不上,然后一看发现没有进入系统,高版本的内核没有正常启动。原因是根目录 / 所在的磁盘分区无法正常识别,说并不存在。(outlook518)结果见图1
图1
出现这种的结果可能的原因是:initrd是旧版本mkinitrd生成的,所以导致文件系统无法正常挂载[1]。先不管以后编译不同版本的内核源码,应该怎么配置,现在需要解决的问题就是如何正常的进入系统,而不是采用重装系统的办法来解决问题。
我查了很多帖子,都没有很直接的说明该怎么解决这个问题。有的帖子说直接在initramfs进行启动盘修复[2];还有的帖子说进入ubuntu的recovery模式[3][4]。等等还有其他的一些解决方案,比如说在启动时选择其他版本的内核,但是对于设置了默认linux内核系统启动的情况,并不适用。
二、对应的解决办法
出现这种情况时,也就是系统无法正常引导进入系统,那么需要手动引导进入系统,也就是用grub来引导进入系统。出现我这种情况的时候,先关机,然后开机后一直按着esc键,就能进入如下的界面:
grup >
grup >
grup >
grup >
小插曲:当进入initramfs,台式机的USB键盘不好用,没有反应。我找了一个带有PS/2接口[5][6]的键盘插上去,重启之后就可以识别了。
大家可以参考这篇写在简书上的文章《Ubuntu开机进入GRUB手动引导》[7],(outlook518)需要注意一点就是一般来说,对于自己安装的ubuntu系统,自己没有对系统目录进行额外的mount分区的话,根目录和/boot是在一个分区上。故在进行用grup进行引导的时候,需做一下简单的修改:(注:UUID=xxxxxx,与/dev/sdxxx是一致的,均代表同一个分区。)
grub > set root=hd0,A #此处不需要括号,注意A的实际值(参前)
grub > set prefix=(hd0,A)/boot/grub
grub > linux /boot/vmlinuz.xxx root=UUID=xxxx #vmlinuz必须使用TAB补全(可能有后缀)
grub > initrd /boot/initrd.img-xxx #TAB补全,此处应该与vmlinuz.xxx统一。
grub > boot
参考文献:
[1]. 创e下载园, http://www.7edown.com/ceping/4947_1.html
[2]. tgcity, 简书, https://www.jianshu.com/p/d9414a5c448a
[3]. wozhaosini, CSDN, https://blog.csdn.net/wozhaosini/article/details/11932099
[4]. Daixyz, CSDN, https://blog.csdn.net/u012725714/article/details/38897493
[5]. 百度百科, https://baike.baidu.com/item/PS/2%E6%8E%A5%E5%8F%A3
[6]. 百度知道, https://zhidao.baidu.com/question/96444754.html
[7]. hwrenx, 简书, https://www.jianshu.com/p/708f12472b85