CentOS Linux内核升级指南

内核

一个 Linux 操作系统,或者叫做 Linux 发行版,比如常见的:CentOSDebianUnbuntu 等等,都是由如下五部分构成的,如下图所示,Linux发行版在外层封装了了大量的库、包和工具供用户使用,而底层硬件设备控制相关的能力则仍是由内核提供:

image-20210625150638408

为什么要升级版本

内核也是一个软件, 软件在不断的迭代的过程中会开发很多新的特性,当我们不论是主动还是被动的对内核的新特性有需求而当前版本不支持时,我们就需要升级版本,来满足我们的需求了。

我们可以通过 uname -msr命令,来确认当前系统的内核版本。

内核版本的 change log 可以在这个网站很方便的查看:https://kernelnewbies.org/LinuxChanges

一些重大的milestone 版本:

  • 2.4.19namespace 概念引入
  • 2.6.19CUBIC 被拥立为默认TCP拥塞控制算法
  • 2.6.23CFS完全公平调度器支持
  • 3.18eBPF 支持,OverlayFS 合入(4.4才基本完善)
  • 4.5cgroups v2 支持
  • 4.9BBR TCP拥塞控制算法支持
  • 5.6时钟namespace隔离支持
  • 5.7exFAT文件系统支持

Linux内核版本时间线:

img

开始升级

注:

  1. 在开始升级之前最好先对系统或者对重要数据做一个备份,避免可能的风险。
  2. 全程需要系统 root 权限,下文命令均省略 sudo 前缀
  3. 不同发行版具体命令会不一样,下文基于 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

配置好了之后,直接下载官方的源可能会比较慢,我们可以配置使用国内的镜像进行加速,可以选择清华或者中科大等镜像,这里中科大镜像为例:

  1. 注释掉原生的镜像列表
  2. 并将 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
    
  3. 然后更新一下软件包缓存:

    yum makecache
    

安装新内核

配置好了yum源之后我们就可以直接通过 yum 命令来一键安装新内核了,我们可以先通过yum list查看所有可选的版本:

# 只看elrepo-kernel中的包,减少干扰
yum list available --disablerepo='*' --enablerepo=elrepo-kernel

会列出最新可用的内核包,我们可以看到如下两种版本:

  • ltlong 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

image-20211026202133584

重启

修改完启动项之后,我们只需要重启机器,就可以用上新版本的内核了:

reboot

参考文档

  1. https://web.archive.org/web/20181003201630/http://swift.siphos.be/linux_sea/whatislinux.html
  2. https://kernelnewbies.org/LinuxVersions
  3. https://phoenixnap.com/kb/how-to-upgrade-kernel-centos
  4. https://wiki.centos.org/zh/HowTos/Grub2