跳到主要内容

内核升级

更新于:2024年2月25日

实战:centos7升级内核(yum方式)-2023.1.5(测试成功)

目录

[toc]

前言

注意:内核升级可能涉及系统稳定性和兼容性的风险;在进行内核升级之前,请确保了解这些风险并备份重要的数据。

kernel-ml:kernel-ml 中的ml是英文【 mainline stable 】的缩写,elrepo-kernel中罗列出来的是最新的稳定主线版本。

kernel-lt:kernel-lt 中的lt是英文【 long term support 】的缩写,elrepo-kernel中罗列出来的长期支持版本。

ML 与 LT 两种内核类型版本可以共存,但每种类型内核只能存在一个版本。

测试环境

centos7.9
测试环境

1、检查已安装的内核版本

让我们安装了一个发行版,它包含了一个特定版本的内核。为了展示当前系统中已安装的版本,我们可以:

[root@node2 ~]#uname -a
Linux node2 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

2、在 CentOS 7 中升级内核

大多数现代发行版提供了一种使用 yum 等包管理系统和官方支持的仓库升级内核的方法。

但是,这只会升级内核到仓库中可用的最新版本 - 而不是在 https://www.kernel.org/ 中可用的最新版本。不幸的是,Red Hat 只允许使用前者升级内核。

与 Red Hat 不同,CentOS 允许使用 ELRepo,这是一个第三方仓库,可以将内核升级到最新版本。

  • 要在 CentOS 7 上启用 ELRepo 仓库,请运行:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
  • 仓库启用后,你可以使用下面的命令列出可用的内核相关包:
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

kernel-lt.x86_64	5.4.265-1.el7.elrepo  
kernel-ml.x86_64 6.6.9-1.el7.elrepo
  • 接下来,安装最新的主线稳定内核:
# 安装 最新版ML 版本
# yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y
# 安装 最新版LT 版本
# yum --enablerepo=elrepo-kernel install kernel-lt-devel kernel-lt -y

yum --enablerepo=elrepo-kernel install kernel-ml -y

注意:

这个只安装了一个rpm包哦,没其它依赖包哦!


🔰 将内核工具包一并升级**(可选)**(可忽略次步骤,一般也不用配置次步骤。)

  • 默认:
[root@docker ~]#uname -a
Linux docker 3.10.0-1160.102.1.el7.x86_64 #1 SMP Tue Oct 17 15:42:21 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

[root@docker ~]#rpm -qa|grep kernel
kernel-3.10.0-957.el7.x86_64
kernel-tools-libs-3.10.0-957.el7.x86_64
abrt-addon-kerneloops-2.1.11-60.el7.centos.x86_64
kernel-tools-3.10.0-957.el7.x86_64
kernel-3.10.0-1160.102.1.el7.x86_64
kernel-devel-3.10.0-957.el7.x86_64
kernel-headers-3.10.0-957.el7.x86_64
[root@docker ~]#
  • 将内核工具包一并升级
# 删除旧版本工具包
yum remove kernel-tools-libs.x86_64 kernel-tools.x86_64

# 安装新版本工具包
yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-ml-tools.x86_64
  • 验证
[root@docker ~]#rpm -qa|grep kernel
kernel-3.10.0-957.el7.x86_64
kernel-ml-tools-6.6.9-1.el7.elrepo.x86_64
abrt-addon-kerneloops-2.1.11-60.el7.centos.x86_64
kernel-ml-tools-libs-6.6.9-1.el7.elrepo.x86_64
kernel-3.10.0-1160.102.1.el7.x86_64
kernel-devel-3.10.0-957.el7.x86_64
kernel-headers-3.10.0-957.el7.x86_64
[root@docker ~]#

3、设置 GRUB 默认的内核版本并重启

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

为了让新安装的内核成为默认启动选项,你需要如下修改 GRUB 配置:

  • 查看系统上的所有可用内核

方法1:(查看内核启动顺序)

[root@docker ~]#awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (5.4.265-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1160.102.1.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-5987de640e6d4ac9b69d19e0059df86e) 7 (Core)
[root@docker ~]#

方法2:(查看系统上的所有可用内核)

[root@docker ~]#rpm -qa | grep kernel
kernel-3.10.0-957.el7.x86_64
kernel-tools-libs-3.10.0-957.el7.x86_64
abrt-addon-kerneloops-2.1.11-60.el7.centos.x86_64
kernel-tools-3.10.0-957.el7.x86_64
kernel-3.10.0-1160.102.1.el7.x86_64
kernel-lt-5.4.265-1.el7.elrepo.x86_64
kernel-devel-3.10.0-957.el7.x86_64
kernel-headers-3.10.0-957.el7.x86_64
[root@docker ~]#
  • 打开并编辑 /etc/default/grub 并设置 GRUB_DEFAULT=0。意思是 GRUB 初始化页面的第一个内核将作为默认内核。(其中 0 是上面查询出来的可用内核)
GRUB_TIMEOUT=5
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap crashkernel=auto rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
  • 生成 grub 配置文件,执行如下命令。

GRUB2 的配置文件通常为 /boot/grub2/grub.cfg,虽然此文件很灵活,但是我们并不需要手写所有内容。可以通过程序自动生成,或是直接修改生成之后的文件。通常情况下简单配置文件 /etc/default/grub ,然后用程序 grub-mkconfig 来产生文件 grub.cfg。

[root@node2 ~]#grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.6.9-1.el7.elrepo.x86_64
Found initrd image: /boot/initramfs-6.6.9-1.el7.elrepo.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-957.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-957.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-5987de640e6d4ac9b69d19e0059df86e
Found initrd image: /boot/initramfs-0-rescue-5987de640e6d4ac9b69d19e0059df86e.img
done
[root@node2 ~]#

/etc/grub2.cfg 是 /boot/grub2/grub.cfg的软链接

注意:

[root@node2 ~]#ll /etc/grub2.cfg 
lrwxrwxrwx. 1 root root 22 May 30 2021 /etc/grub2.cfg -> ../boot/grub2/grub.cfg

/etc/grub2.cfg 是 /boot/grub2/grub.cfg的软链接。

## 这个是干嘛的呢??
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
  • 重启并验证最新的内核已作为默认内核。

需要重启才能生效。

[root@node2 ~]#uname -a
Linux node2 6.6.9-1.el7.elrepo.x86_64 #1 SMP PREEMPT_DYNAMIC Mon Jan 1 13:50:39 EST 2024 x86_64 x86_64 x86_64 GNU/Linux
[root@node2 ~]#

恭喜你!你已经在 CentOS 7 中升级内核了!

4、 删除旧内核(可选)

**注意:**无法卸载当前在用的内核版本。

建议还是保留旧内核,如果后续发现有问题可以回退。

  • 查看系统中全部的内核:
[root@docker ~]#rpm -qa | grep kernel
kernel-3.10.0-957.el7.x86_64
kernel-tools-libs-3.10.0-957.el7.x86_64
abrt-addon-kerneloops-2.1.11-60.el7.centos.x86_64
kernel-tools-3.10.0-957.el7.x86_64
kernel-3.10.0-1160.102.1.el7.x86_64
kernel-lt-5.4.265-1.el7.elrepo.x86_64
kernel-devel-3.10.0-957.el7.x86_64
kernel-headers-3.10.0-957.el7.x86_64
[root@docker ~]#

方法1、yum remove 删除旧内核的 RPM 包

yum remove -y kernel-3.10.0-957.el7.x86_64 \
kernel-tools-libs-3.10.0-957.el7.x86_64 \
kernel-tools-3.10.0-957.el7.x86_64 \
kernel-3.10.0-1160.102.1.el7.x86_64

只需删除kernel-3.10.0-514kernel-tools-libskernel-tools即可。

  • 验证
[root@docker ~]#awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (5.4.265-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (0-rescue-5987de640e6d4ac9b69d19e0059df86e) 7 (Core)
[root@docker ~]#rpm -qa | grep kernel
kernel-ml-tools-6.6.9-1.el7.elrepo.x86_64
abrt-addon-kerneloops-2.1.11-60.el7.centos.x86_64
kernel-ml-tools-libs-6.6.9-1.el7.elrepo.x86_64
kernel-lt-5.4.265-1.el7.elrepo.x86_64
kernel-devel-3.10.0-957.el7.x86_64
kernel-headers-3.10.0-957.el7.x86_64
[root@docker ~]#

image-20240105094834470

方法2、yum-utils工具

未实际测试,仅记录。

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

安装yum-utils

$ yum install yum-utils

删除旧版本  

package-cleanup --oldkernels

升级脚本

UpdateKernel-v1-2023.11.24.sh(yum升级到最新长久支持版-亲测成功)(最新)

脚本位置:https://onedayxyy.cn/scripts/linux_kernel_update/UpdateKernel-v1-2024.1.9.sh

可一键粘贴使用!

uname -a

# 载入公钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安装ELRepo
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm


# 载入elrepo-kernel元数据
yum --disablerepo=\* --enablerepo=elrepo-kernel repolist
# 查看可用的rpm包
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
# 安装最新版本的lt kernel
yum --disablerepo=\* --enablerepo=elrepo-kernel install kernel-lt -y
#如果是安装指定版本
#yum --enablerepo=elrepo-kernel install kernel-lt-devel-5.4.225-1.el7.elrepo.x86_64 kernel-lt-5.4.225-1.el7.elrepo.x86_64 -y #注意包的个数

#yum install -y kernel-lt
if [ $? -eq 0 ];then
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
fi
echo 'Please reboot your system quick !!!'

reboot
uname -a

🔰 开始测试:(测试成功)2024.1.5

  • 升级前内核
[root@node2 ~]#uname -a
Linux node2 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
  • 开始升级
uname -a

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

yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
yum --enablerepo=elrepo-kernel install kernel-lt -y
if [ $? -eq 0 ];then
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
fi
echo 'Please reboot your system quick !!!'

reboot
uname -a

  • 升级后测试

image-20240104165257371

[root@node2 ~]#uname -a
Linux node2 5.4.265-1.el7.elrepo.x86_64 #1 SMP Wed Dec 20 13:57:20 EST 2023 x86_64 x86_64 x86_64 GNU/Linux
[root@node2 ~]#

FAQ

awk解释

[root@docker ~]#awk -F\'     '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (5.4.265-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1160.102.1.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-5987de640e6d4ac9b69d19e0059df86e) 7 (Core)
[root@docker ~]#
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg  请解释下这条命令?

这条`awk`命令用于解析`/etc/grub2.cfg`文件并提取里面的菜单项(通常是系统启动时的内核启动选项)。命令的具体作用如下:

1. `awk`:是一种编程语言和工具,用于在Linux/Unix中对文本和数据进行处理。

2. `-F'`:设置输入字段分隔符为单引号`'`。这意味着`awk`会将每行文本分隔成多个字段,每个字段之间由单引号分隔。

3. `$1=="menuentry "`:这是一个`awk`的模式,表示只处理那些第一个字段严格等于字符串`menuentry `(后面有一个空格)的行。

4. `{print i++ " : " $2}`:这是对前面模式匹配行的操作,对于每个匹配的行执行花括号中的命令。`print``awk`的内置函数,用于输出文本。
- `i++`:是一个变量`i`的自增操作,它会在打印之前被增加,但是由于`i`在这里未初始化,它会从0开始。
- `$2`:是指当前行的第二个字段,由于字段分隔符被设置为单引号,所以在`menuentry`行中,第二个字段通常是启动菜单项的标题。

5. `/etc/grub2.cfg`:这是`awk`处理的文件路径,`/etc/grub2.cfg`是GRUB2的配置文件,在大多数Linux发行版中包含系统启动时的菜单配置。

总结一下,这条命令的作用就是列出GRUB2启动菜单中的所有条目和它们的索引号。对于每个`menuentry`,它会打印一个数字(从0开始的索引),后面跟着`menuentry`的标题。这在调整启动顺序或者设置默认启动项时非常有用。

小版本升级

仅做记录,未实际测试。2024年1月5日

在实验环境下,已安装了最新的CentOS 7.4操作系统,现在需要升级内核版本。

实验环境

CentOS-7-x86_64-Minimal-1708.iso CentOS Linux release 7.4.1708 (Core) Kernel 3.10.0-693.el7.x86_64

连接并同步CentOS自带yum源,更新内核版本。此方法适用于更新内核补丁 。 具体实验步骤:

yum list kernel
yum update -y kernel

此时,已安装成功,但若想将系统运行在新版本的kernel上,则需要重新启动操作系统。

重启完成,至此,Kernel版本已升级至【3.10.0-693.17.1.el7.x86_64】

安装指定内核版本Rpm

仅做记录,未实际测试。

本次以安装 LT 内核的5.4.230 版本为例。

  • 当前内核版本(centos7.9默认内核)
[root@docker ~]#uname -a
Linux docker 3.10.0-1160.102.1.el7.x86_64 #1 SMP Tue Oct 17 15:42:21 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
[root@docker ~]#rpm -qa|grep kernel
kernel-3.10.0-957.el7.x86_64
kernel-tools-libs-3.10.0-957.el7.x86_64
abrt-addon-kerneloops-2.1.11-60.el7.centos.x86_64
kernel-tools-3.10.0-957.el7.x86_64
kernel-3.10.0-1160.102.1.el7.x86_64
kernel-devel-3.10.0-957.el7.x86_64
kernel-headers-3.10.0-957.el7.x86_64
[root@docker ~]#

1、查找版本

因 ELRepo 源都是最新版本,所以旧版本内核只能手动下载。查找 kernel rpm 历史版本:http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/

2、下载内核 RPM

下载rpm:

wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-devel-4.4.215-1.el7.elrepo.x86_64.rpm
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-4.4.215-1.el7.elrepo.x86_64.rpm

3、安装内核

rpm -ivh kernel-lt-4.4.215-1.el7.elrepo.x86_64.rpm
rpm -ivh kernel-lt-devel-4.4.215-1.el7.elrepo.x86_64.rpm

4、确认已安装内核版本

[root@localhost ~]# rpm -qa | grep kernel
kernel-headers-3.10.0-1160.15.2.el7.x86_64
kernel-devel-3.10.0-1160.49.1.el7.x86_64
kernel-tools-libs-3.10.0-957.el7.x86_64
kernel-3.10.0-957.el7.x86_64
kernel-ml-4.9.9-1.el7.elrepo.x86_64
kernel-lt-4.4.215-1.el7.elrepo.x86_64
kernel-tools-3.10.0-957.el7.x86_64
kernel-lt-devel-4.4.215-1.el7.elrepo.x86_64

5、设置启动

<code class="language-text"># 查看启动顺序
[root@localhost ~]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux (4.4.215-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (4.9.9-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-b91f945269084aa98e8257311ee713c5) 7 (Core)

# 设置启动顺序
[root@localhost ~]# grub2-set-default 0
# 生成grub配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg

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

自编译升级(不推荐)

Step1: 下载源码 Step2: 安装gcc bc cmake Step3: 编译源码,安装新内核 自编译升级过程略微复杂,且不便于后期维护,具体操作步骤在此略去不表。

参考链接

https://www.linuxprobe.com/update-kernel-centos7.html

https://www.cnblogs.com/gaoyuechen/p/16848807.html

https://blog.csdn.net/u010674953/article/details/129064085

https://www.zzbaike.com/23045.html

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码

x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号

《云原生架构师实战》

image-20230107215126971

🍀 个人博客站点

https://onedayxyy.cn/

🍀 语雀

https://www.yuque.com/xyy-onlyone

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎

https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!