内核
一个 Linux 操作系统,或者叫做 Linux 发行版,比如常见的:CentOS
、Debian
、Unbuntu
等等,都是由如下五部分构成的,如下图所示,Linux发行版在外层封装了了大量的库、包和工具供用户使用,而底层硬件设备控制相关的能力则仍是由内核提供:
为什么要升级版本
内核也是一个软件, 软件在不断的迭代的过程中会开发很多新的特性,当我们不论是主动还是被动的对内核的新特性有需求而当前版本不支持时,我们就需要升级版本,来满足我们的需求了。
我们可以通过 uname -msr
命令,来确认当前系统的内核版本。
内核版本的 change log 可以在这个网站很方便的查看:https://kernelnewbies.org/LinuxChanges。
一些重大的milestone 版本:
2.4.19
namespace 概念引入2.6.19
CUBIC 被拥立为默认TCP拥塞控制算法2.6.23
CFS完全公平调度器支持3.18
eBPF 支持,OverlayFS 合入(4.4才基本完善)4.5
cgroups v2 支持4.9
BBR TCP拥塞控制算法支持5.6
时钟namespace隔离支持5.7
exFAT文件系统支持
Linux内核版本时间线:
开始升级
注:
- 在开始升级之前最好先对系统或者对重要数据做一个备份,避免可能的风险。
- 全程需要系统 root 权限,下文命令均省略 sudo 前缀
- 不同发行版具体命令会不一样,下文基于 CentOS 进行操作
升级依赖
在开始升级内核之前,我们最好先把依赖都更新到最新版本,避免到时候出现软件版本过低不兼容新版内核的情况:
yum -y update
安装ELRepo
ELRepo全称是 Enterprise Linux Repo,是一个包含大量底层驱动的RPM仓库,我们所依赖的内核包也在这个仓库中。
我们可以参考官网的教程来安装这个包,每一个 rpm 包都会附上一个 GPG 签名,默认配置下,CentOS 包管理工具会校验每个 rpm 包的签名,来避免包在分发途中被篡改,所以我们需要导入 ELRepo 的 GPG 公钥,来让 CentOS信任这个包:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
然后,我们就可以通过yum的方式将ELRepo的源配置到我们的系统中了,这步操作会下载一个repo文件到我们的 yum 源目录中:/etc/yum.repos.d/elrepo.repo
:
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
配置好了之后,直接下载官方的源可能会比较慢,我们可以配置使用国内的镜像进行加速,可以选择清华或者中科大等镜像,这里中科大镜像为例:
- 注释掉原生的镜像列表
并将
elrepo.org/linux
地址替换为中科大镜像对应的地址mirrors.ustc.edu.cn/elrepo
(如果是想要使用清华镜像就替换为:mirrors.tuna.tsinghua.edu.cn/elrepo
)sed -i 's/mirrorlist=/#mirrorlist=/' /etc/yum.repos.d/elrepo.repo sed -i 's/elrepo.org\/linux/mirrors.ustc.edu.cn\/elrepo/' /etc/yum.repos.d/elrepo.repo
然后更新一下软件包缓存:
yum makecache
安装新内核
配置好了yum源之后我们就可以直接通过 yum 命令来一键安装新内核了,我们可以先通过yum list
查看所有可选的版本:
# 只看elrepo-kernel中的包,减少干扰
yum list available --disablerepo='*' --enablerepo=elrepo-kernel
会列出最新可用的内核包,我们可以看到如下两种版本:
lt
long term,长期支持版本,更稳定ml
main line,主线版本,特性 更新
可以按照自己的需求选择,选好之后直接安装即可:
yum --enablerepo=elrepo-kernel install kernel-lt
修改引导顺序
Linux 系统启动时会由 grub
引导,来决定具体要启动哪一个操作系统,即哪一个内核。当我们安装完新内核之后,还需要修改 grub
的默认引导项配置,让其下次启动新版本的内核。
参考 centos 的官方grub教程,我们可以先查看一下当前 grub 默认的启动项,这里可以是内核名称的全称也可以是其在 grub 配置中的序号:
grub2-editenv list
同时我们再看一下所有的启动项:
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
理论上来说这个默认启动项仍然是你当前使用的内核版本,我们需要设置成刚刚安装的新版内核:
# 0 为上面 awk 命令输出的新版本内核的序号
grub2-set-default 0
# 设置完成之后可以再确认一下
grub2-editenv list
重启
修改完启动项之后,我们只需要重启机器,就可以用上新版本的内核了:
reboot