关于 Linux 内核

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

官方内核版本说明

在使用 Docker 时,发现其对 Linux 内核版本的最低要求是 3.10(这也刚好是 CentOS 7.2 的内核版本),但是在这个版本上有部分功能无法实现。为了使用最新版本的内核,只好在安装 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

内核相关的包说明

  • kernel-lt:The Linux kernel. (The core of any Linux-based operating system.) —— 最核心的包,所有 Linux 系统的基础
  • kernel-lt-devel:Development package for building kernel modules to match the kernel. —— 内核开发包,更多是提供给内核开发人员开发内核的一些功能模块
  • kernel-lt-doc:Various bits of documentation found in the kernel sources. —— 内核包的指引文档
  • kernel-lt-headers:Header files of the kernel, for use by glibc. —— 内核的头文件,一般其他应用需要调用内核能力就要引入这些头文件
  • kernel-lt-tools:Assortment of tools for the kernel. —— 内核级别的一些工具
  • kernel-lt-tools-libs:Libraries for the kernel tools. —— 内核级别工具所依赖的包
  • kernel-lt-tools-libs-devel:Development package for the kernel tools libraries. —— 内核级别工具开发所需的依赖包

升级内核

小版本升级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看当前和可升级版本
[root@localhost-01 ~]# yum list kernel | grep kernel
Repodata is over 2 weeks old. Install yum-cron Or run: yum makecache fast
kernel.x86_64 3.10.0-862.el7 @anaconda
kernel.x86_64 3.10.0-1160.119.1.el7 @updates

# 小版本升级(3.10.0-862.el7 --> 3.10.0-1160.119.1.el7)
[root@localhost-01 ~]# yum update kernel -y

# 验证
[root@localhost-01 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

[root@localhost-01 ~]# uname -r
3.10.0-1160.119.1.el7.x86_64

大版本升级

官方镜像库

历史版本库地址【5.4.x】

清华镜像库【旧】

版本的生命周期

开始升级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 系统信息
[root@localhost-01 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@localhost-01 ~]# uname -r
3.10.0-862.el7.x86_64

# 更新 yum 仓库
# 如果只更新软件包可执行:yum -y update --exclude=kernel*
[root@localhost-01 ~]# yum -y update

# 当前内核信息
[root@localhost-01 ~]# rpm -qa | grep kernel
kernel-3.10.0-1160.119.1.el7.x86_64
kernel-tools-libs-3.10.0-1160.119.1.el7.x86_64
kernel-tools-3.10.0-1160.119.1.el7.x86_64
kernel-3.10.0-862.el7.x86_64

# 由于 ELRepo 仓库的不再支持 CentOS 7,只能手动下载需要版本 rpm 包,这里选择安装版本(kernel-lt-5.4.278)
[root@localhost-01 ~]# wget https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-5.4.278-1.el7.elrepo.x86_64.rpm
[root@localhost-01 ~]# wget https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.278-1.el7.elrepo.x86_64.rpm
[root@localhost-01 ~]# wget https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-headers-5.4.278-1.el7.elrepo.x86_64.rpm
[root@localhost-01 ~]# wget https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-tools-5.4.278-1.el7.elrepo.x86_64.rpm
[root@localhost-01 ~]# wget https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-tools-libs-5.4.278-1.el7.elrepo.x86_64.rpm
[root@localhost-01 ~]# wget https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-doc-5.4.278-1.el7.elrepo.noarch.rpm
[root@localhost-01 ~]# wget https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-tools-libs-devel-5.4.278-1.el7.elrepo.x86_64.rpm

[root@localhost-01 ~]# yum localinstall kernel-lt-*

# 若安装提示冲突,则卸载旧版本 tools
[root@localhost-01 ~]# yum remove kernel-tools-libs-3.10.0-1160.119.1.el7.x86_64 kernel-tools-3.10.0-1160.119.1.el7.x86_64

# 查看当前默认内核启动
[root@localhost-01 ~]# grub2-editenv list
saved_entry=CentOS Linux (3.10.0-1160.119.1.el7.x86_64) 7 (Core)

# 查看当前内核启动可选项
[root@localhost-01 ~]# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (5.4.278-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1160.119.1.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-862.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-c4ad8cdbfdb44ce190f1c662815d35f4) 7 (Core)

# 修改默认启动顺序
[root@localhost-01 ~]# ls -l /etc/grub2.cfg
lrwxrwxrwx 1 root root 22 Jun 17 15:23 /etc/grub2.cfg -> ../boot/grub2/grub.cfg

# 以下两组指令任选其一
[root@localhost-01 ~]# grub2-set-default 'CentOS Linux (5.4.278-1.el7.elrepo.x86_64) 7 (Core)'
[root@localhost-01 ~]# grub2-editenv list
saved_entry=CentOS Linux (5.4.278-1.el7.elrepo.x86_64) 7 (Core)

# 或
[root@localhost-01 ~]# grub2-set-default 0
[root@localhost-01 ~]# grub2-editenv list
saved_entry=0

# 重启生效
[root@localhost-01 ~]# reboot

验证

1
2
3
4
5
# 验证结果
[root@localhost-01 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@localhost-01 ~]# uname -r
5.4.278-1.el7.elrepo.x86_64

删除旧内核(可选)

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

通过 yum remove 命令

查看系统中全部的内核:

1
2
3
4
5
6
7
8
[root@localhost-01 ~]# rpm -qa | grep kernel
kernel-lt-5.4.278-1.el7.elrepo.x86_64
kernel-lt-tools-5.4.278-1.el7.elrepo.x86_64
kernel-3.10.0-1160.119.1.el7.x86_64
kernel-3.10.0-862.el7.x86_64
kernel-lt-tools-libs-5.4.278-1.el7.elrepo.x86_64

[root@localhost-01 ~]# yum remove kernel-3.10.0-862.el7.x86_64 kernel-3.10.0-1160.119.1.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 的时候就不会更新内核了。