Ubuntu中降级内核版本

  以前用Arch一天不更新就不舒服,后来两个月没更新一滚就把引导滚挂了,所以这次用Ubuntu就有强迫症,看到有更新都会sudo apt upgrade,结果内核版本更新的太高,导致一些工作必要的软件不支持,结果花了一个中午来降内核版本,血崩。

查看内核

  查看当前的内核版本直接使用uname -r就可以了。但是要看你安装了多少个内核就要使用dpkg -l | grep linux-image来查看。

安装内核

  像我这种手贱更新的其实更新之后旧的内核依然是会保留的,当然你也可以选择装其他的版本,拿4.13.0-37来举例:

sudo apt install linux-image-extra-4.13.0-37-generic linux-headers-4.13.0-37-generic

如果找不到包的话可以添加源:

  在/etc/apt/sources.list的最后一行加上deb http://security.ubuntu.com/ubuntu trusty-security main然后sudo apt update再安装。

  注意如果没有装linux-headers的话那么有些软件如virtualbox就可能无法被正常安装,因为virtualbox是依赖linux-headers来编译驱动的,所以在切换内核之后virtualbox和一些依赖linux-headers的软件需要重新安装。

切换内核

  实际上网上有不少有关于切换内核版本的博客,我参考的有Ubuntu 16.04 内核降级Ubuntu16.04切换内核启动这两篇文章,修改grub配置的GRUB_DEFAULT重启之后依然是原来的内核,而直接修改引导配置文件的代码这个行为还是比较的危险,我选择先想其他的办法,所以修改代码这个方法我还没有验证过,不过感觉应该是可行的。

  最后我的解决办法就是安装完旧版本的内核之后直接卸载原来新版本的内核,这样就只剩下旧版本的内核,所以也是必然会启动旧版本的内核。比如新版本的内核是4.13.0-38,那就:

sudo apt remove linux-image-4.13.0-38-generic

来卸载。重启之后应该就是旧版本的内核了,卸载之前要先仔细检查内核的数量,如果不慎把内核都卸载掉的话就进不了系统了。

问题排查

  在修改grub.cfg的时候可能会出现“不允许的操作”或者“Operation not permitted”,即使是root权限居然不能为所欲为?这个确实卡了我很久,通过这些关键词搜索引擎也不能给出很好的结果,最后还是找到了一条博客。博客里十分简要的指出了原因和解决方法,文件不能被操作(修改),是因为文件被加上了“i”属性(attritube),通过lsattr我们可以看到文件或目录的属性,通过chattr我们可以修改文件或目录的属性。所以我们只需要sudo chattr -i /boot/grub/grub.cfg就可以对grub.cfg进行操作了,但是注意在操作完之后要+i把文件的属性设置回去,因为引导配置文件是系统十分关键的文件,所以平时不应该对外暴露修改权限。

总结

  切换内核版本两个方法:一个是修改grub配置,另一个是直接把不要的内核卸了。还有修改grub的方法还要再研究一下,也要学习一下shell脚本才能进一步读懂/etc/default/grub的代码以分析问题所在。

  通过这次踩坑算是知道了版本不一定要最新,但是一定要保持稳定和兼容其他的软件,盲目的追新是不可取的。还有直接sudo apt upgrade的操作不应该有,而是要仔细检查有哪些包要更新,而针对需要更新的包进行更新,这个在之前使用Arch的时候踩过坑但是没养成检查的习惯。这次也学习到了chattr的使用,了解了“i”属性可以保护关键文件不被误操作,通过man chattr可知:

1
A  file  with  the 'i' attribute cannot be modified: it cannot be deleted or renamed, no link can be created to this file and no data can be written to the file.  Only the superuser or a process possessing the CAP_LINUX_IMMUTABLE capability can set or clear this attribute.

十分的实用。