Ubuntu 如何更换内核##
作者最近在装OAI,需要频繁更换内核。网上更换内核的方法参差不齐,在经历了各种失败和尝试后,分享以下两种方式。第一种synaptic属于图形化一键更换,第二种改grub属于绝对可行方法。建议初次尝试顺序是 1 -> 2。因为1不会出任何问题,2虽然保证能完成任务,但是一定要细心才行。不过我现在更换内核都是直接用2,比较直接有效和方便。注:我不是IT专业的,所以不会手动编译内核,有需求可以参考其他文章。
警告:内核一般是涉及进程调度、内存管理等等比较核心的东西,更换不合适的内核可能会导致无法上网(驱动不兼容的原因),甚至重启后无法识别鼠标与键盘导致系统直接崩溃,请做好心理准备,谨慎操作!
BTW,换内核之前,可以查询一下自己已经安装的所有内核,一般来说,如果没有自己后来装内核,这里查到的内核都是系统预装好的,可以直接切换,不会出任何问题:
sudo dpkg --get-selections |grep linux-image
在进入本文前,先试试可否用 apt-get 一键更换:
apt install linux-image-*****
例子:
sudo apt-get install linux-image-3.19.0-61-lowlatency linux-headers-3.19.0-61-lowlatency
如果成功可忽略本文下面内容。
1、使用synaptic 一键更换内核
使用条件:需要更换的内核比default的内核版本更高。
举个例子,当前的内核是4.7-generic,需要更换为4.15-generic,完全没问题。而如果当前是4.15,需要更换成4.7,就不适用了,因为启动的时候自动选择更新的版本。这种情况就需要直接用第二种方法改grub了。
synaptic完全是个图形化界面,大部分是傻瓜操作。接下来进入教程,以需要更换4.15.0-13-generic内核为例:
(1)安装synaptic
sudo apt-get install synaptic
(2)安装好之后,打开界面
sudo synaptic
(3)搜索需要更换的内核名
点击search,搜索需要更换的版本号,如图所示:
值得一提的是,这里只能搜出来该系统可(一键使用synaptic)更换的内核版本号。
(4)选择内核
一般来说普通电脑需要更换的为headers和image,不要选错了。请直接找到需要更换的headers,如:需要更换 linux-headers-4.15.0-13-generic,右击选择“Mark for Installation”。可以看到 linux-headers-4.15.0-13也被顺便勾起来了,这个也是必要的,请不要取消。往下找,找到linux-image-4.15.0-13-generic,右击同样“Mark for Installation”。请注意务必和前面的headers对应。现在我们有三个勾选选项了。注:建议连带linux-image-extra-4.15.0-13-generic一起安装,虽然不一定用得上,还会让你的kernel列表更臃肿,但是这可以修复潜在的驱动不兼容问题 。
(5)下载内核
点击上方的Apply,展开 To be installed,可以看到选择到的三个选项(带extra就是四个),再次确认image和前面的headers是对应的。
确认后Apply,进入下载,安装,重启的傻瓜操作,重启以后输入uname -a查询内核就可以发现内核已经更换了。
2、通过更改grub更换内核
最靠谱的方法,肯定能换掉内核。操作过程:
(1)安装内核
在www.bing.com里面直接搜索内核名字,如:linux-image-4.15.0-13-generic,第一个就是了。
在download里头可以下载到deb。双击就可以用软件中心安装了(当然用dkpg -i 安装也是非常优秀的),如下:
sudo dpkg -i ***.deb
***换成实际下载的deb的名字。依次安装内核的image和headers。
此外,推荐使用方法一中的synaptic也可以下载内核包,同样安全可靠。
(2)查询可更换内核的序号
gedit /boot/grub/grub.cfg
查询已安装的内核和内核的序号。找到文件中的menuentry (图中在一大堆fi-else底下)
仔细观察图中,menuentry底下还有submenu,submenu底下就包含了 带有缩进的 menuentry。以下是计数规则:
- 第一个menuentry 的序号是0,第二个submenu的序号是1,以此类推
- 在submenu中,第一个menuentry的序号是0,第二个是1,以此类推
我摘录图中submenu中的第一个menuentry如下:
menuentry 'Ubuntu,Linux 4.15.0-34-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-34-generic-advanced-261d46dc-b223-49ee-a561-439009b15519' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
set root='hd0,gpt2'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 261d46dc-b223-49ee-a561-439009b15519
else
search --no-floppy --fs-uuid --set=root 261d46dc-b223-49ee-a561-439009b15519
fi
echo '载入 Linux 4.15.0-34-generic ...'
linux /boot/vmlinuz-4.15.0-34-generic root=UUID=261d46dc-b223-49ee-a561-439009b15519 ro quiet splash $vt_handoff
echo '载入初始化内存盘...'
initrd /boot/initrd.img-4.15.0-34-generic
意思是,这个menuentry就是内核 Linux 4.15.0-34-generic 的序号菜单了。这里就假设我需要把内核更换为它。它在submenu 的第一个menuentry。记住它,下一步要用。
(3)修改grub更换内核
sudo gedit /etc/default/grub
打开grub的编辑窗,如图所示:
如果没有使用grub修改过内核,除注释第一行应该显示的是
GRUB_DEFAULT=0
0就是默认的kernel了。我们要做的就是把GRUB_DEFAULT=0 改成
GRUB_DEFAULT=“1 >0”
即可。请注意在(2)中提到的需要更换的内核Linux 4.15.0-34-generic在 submenu 的第一个menuentry,因此是“1 >0“。如果它在submenu的第5个,那么就是 ”1 >4“,唯一需要的就是数好这个!
同时,请注意一对英文分号""和1后面的空格也是必须的,万万不可少,也不可多!
(4)更新内核和重启
sudo update-grub
sudo reboot
重启完可以用uname -a查询内核已更换。
3、预防万一
我没有尝试过,大家自己判别。如果驱动不兼容怎么办: