参考: https://blog.csdn.net/kikajack/article/details/79396793

关于 Linux 内核

Linux 内核分两种:官方内核(通常是内核开发人员用)和各大 Linux 发行版内核(一般用户常用)。

官方内核

在使用 Docker 时,发现其对 Linux 内核版本的最低要求是 3.10(这也刚好是 CentOS 7.2 的内核版本),但是在这个版本上有部分功能无法实现。目前 Linux 内核已经发布到 5.X(可以随时在 Linux 内核官网 查看当前版本),为了使用最新版本的内核,只好在安装 CentOS 7 后对内核进行升级。

当然,内核也不能选最新的,防止有尚未发现的 BUG。而且为了减少以后停止维护带来的麻烦,最好安装长期支持版本。各个版本的支持时间在 这个页面 查看。每个版本可能有四种类型,概述如下:

  • Prepatch:Prepatch 或 “RC” 内核是主要的内核预发行版本,主要针对内核开发人员和 Linux 爱好者。必须从源代码进行编译,并且通常包含必须在可以放入稳定版本之前进行测试的新功能。Prepatch 内核由 Linus Torvalds 维护和发布。
  • Mainline:Mainline 主线树由 Linus Torvalds 维护。这个版本的内核会引入所有新功能。新的 Mainline 内核每 2-3 个月发布一次。
  • Stable:每个主线内核被发布后,即被认为是“stable”。任何对 stable 内核的 BUG 修复都会从 Mainline 主线树中回溯并由指定的 stable 内核维护人员使用。 在下一个主线内核可用之前,通常只有几个 BUG 修复内核版本 - 除非它被指定为“longterm maintenance kernel(长期维护内核)”。stable 内核更新按需发布,通常每月 2-3 次。
  • Longterm:通常会提供几个“longterm maintenance”内核版本,用于修复旧版内核的 BUG。这些内核只会修复重大 BUG,并且不会频繁发布版本。

查看内核版本

1
2
3
[root@k3s-prod-master1 ~]# uname -r
# 这里的5.4.210是版本
5.4.210-1.el7.elrepo.x86_64

升级内核

记得首先更新仓库:

1
yum -y update

-y 选项可以在每次需要确认时,自动使用 yes,节省时间。

启用 ELRepo 仓库

ELRepo 仓库是基于社区的用于企业级 Linux 仓库,提供对 RedHat Enterprise (RHEL) 和 其他基于 RHEL的 Linux 发行版(CentOS、Scientific、Fedora 等)的支持。
ELRepo 聚焦于和硬件相关的软件包,包括文件系统驱动、显卡驱动、网络驱动、声卡驱动和摄像头驱动等。

启用 ELRepo 仓库:

1
2
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm

查看可用的系统内核包:

可以看到,只有 5.4 和 5.19 两个版本可以使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@k3s-node1 ~]# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* elrepo-kernel: hkg.mirror.rackspace.com
elrepo-kernel | 3.0 kB 00:00:00
elrepo-kernel/primary_db | 2.1 MB 00:00:01
Available Packages
elrepo-release.noarch 7.0-6.el7.elrepo elrepo-kernel
kernel-lt.x86_64 5.4.210-1.el7.elrepo elrepo-kernel
kernel-lt-devel.x86_64 5.4.210-1.el7.elrepo elrepo-kernel
kernel-lt-doc.noarch 5.4.210-1.el7.elrepo elrepo-kernel
kernel-lt-headers.x86_64 5.4.210-1.el7.elrepo elrepo-kernel
kernel-lt-tools.x86_64 5.4.210-1.el7.elrepo elrepo-kernel
kernel-lt-tools-libs.x86_64 5.4.210-1.el7.elrepo elrepo-kernel
kernel-lt-tools-libs-devel.x86_64 5.4.210-1.el7.elrepo elrepo-kernel
kernel-ml.x86_64 5.19.3-1.el7.elrepo elrepo-kernel
kernel-ml-devel.x86_64 5.19.3-1.el7.elrepo elrepo-kernel
kernel-ml-doc.noarch 5.19.3-1.el7.elrepo elrepo-kernel
kernel-ml-headers.x86_64 5.19.3-1.el7.elrepo elrepo-kernel
kernel-ml-tools.x86_64 5.19.3-1.el7.elrepo elrepo-kernel
kernel-ml-tools-libs.x86_64 5.19.3-1.el7.elrepo elrepo-kernel
kernel-ml-tools-libs-devel.x86_64 5.19.3-1.el7.elrepo elrepo-kernel
perf.x86_64 5.19.3-1.el7.elrepo elrepo-kernel
python-perf.x86_64 5.19.3-1.el7.elrepo elrepo-kernel

说明:

lt :long term support,长期支持版本;

ml:mainline,主线版本

4.3 安装最新内核:

1
2
3
4
5
# 下载主线版本(通常是开发版本)
yum --enablerepo=elrepo-kernel install -y kernel-ml

# 下载长期lts版本(这里的lts版本是5.4)
yum --enablerepo=elrepo-kernel install -y kernel-lt kernel-lt-devel

--enablerepo 选项开启 CentOS 系统上的指定仓库。默认开启的是 elrepo,这里用 elrepo-kernel 替换。

设置 grub2

内核安装好后,需要设置为默认启动选项并重启后才会生效

查看系统上的所有可以内核:

1
2
3
4
5
6
sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

0 : CentOS Linux (4.15.6-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-514.26.2.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-f9d400c5e1e8c3a8209e990d887d4ac1) 7 (Core)

设置 grub2

我的机器上存在 4 个内核(腾讯云的机器,不知道后面两个干嘛的),我们要使用 4.15 这个版本,可以通过 grub2-set-default 0 命令或编辑 /etc/default/grub 文件来设置。

通过 grub2-set-default 0 命令设置:

其中 0 来自上一步的 awk 命令:

1
grub2-set-default 0

编辑 /etc/default/grub 文件

修改 GRUB_DEFAULT=0,表示使用上一步的 awk 命令显示的编号为 0 的内核作为默认内核:

1
2
3
4
5
6
7
8
9
10
11
12
vi /etc/default/grub

> GRUB_TIMEOUT=5
> GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
> GRUB_DEFAULT=0
> GRUB_DISABLE_SUBMENU=true
> GRUB_TERMINAL_OUTPUT="console"
> GRUB_CMDLINE_LINUX="crashkernel=auto console=ttyS0 console=tty0 panic=5"
> GRUB_DISABLE_RECOVERY="true"
> GRUB_TERMINAL="serial console"
> GRUB_TERMINAL_OUTPUT="serial console"
> GRUB_SERIAL_COMMAND="serial --speed=9600 --unit=0 --word=8 --parity=no --stop=1"

生成 grub 配置文件并重启

下一步,通过 gurb2-mkconfig 命令创建 grub2 的配置文件,然后重启:

1
2
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot

验证

通过 uname -r 查看,可以发现已经生效了。

1
2
# uname -r
5.4.210-1.el7.elrepo.x86_64

删除旧内核(可选)

内核有两种删除方式:通过 yum remove 命令或通过 yum-utils 工具。

通过 yum remove 命令

查看系统中全部的内核:

1
2
3
4
5
6
7
# rpm -qa | grep kernel
kernel-tools-libs-3.10.0-514.26.2.el7.x86_64
kernel-ml-4.15.6-1.el7.elrepo.x86_64
kernel-3.10.0-327.el7.x86_64
kernel-tools-3.10.0-514.26.2.el7.x86_64
kernel-headers-3.10.0-514.26.2.el7.x86_64
kernel-3.10.0-514.26.2.el7.x86_64

删除旧内核的 RPM 包

1
yum remove kernel-tools-libs-3.10.0-514.26.2.el7.x86_64 kernel-3.10.0-327.el7.x86_64 kernel-tools-3.10.0-514.26.2.el7.x86_64 kernel-headers-3.10.0-514.26.2.el7.x86_64 kernel-3.10.0-514.26.2.el7.x86_64

通过 yum-utils 工具

如果安装的内核不多于 3 个,yum-utils 工具不会删除任何一个。只有在安装的内核大于 3 个时,才会自动删除旧内核。

安装

1
yum install yum-utils

删除

1
package-cleanup --oldkernels

禁止内核更新

1
2
3
4
[root@spgpu ~]# vim /etc/yum.conf
在[main]部分加上:
exclude=kernel*
exclude=centos-release*

这样,在yum update的时候就不会更新内核了。