内核升级
实战: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 -aLinuxnode23.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:rpm-Uvhhttp:kernel-ml.x86_646.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 -yyum--enablerepo=elrepo-kernelinstallkernel-ml-y
注意:
这个只安装了一个rpm包哦,没其它依赖包哦!
🔰 将内核工具包一并升级**(可选)**(可忽略次步骤,一般也不用配置次步骤。)
- 默认:
[root@docker ~]#uname -aLinuxdocker3.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|grepkernelkernel-3.10.0-957.el7.x86_64kernel-tools-libs-3.10.0-957.el7.x86_64abrt-addon-kerneloops-2.1.11-60.el7.centos.x86_64kernel-tools-3.10.0-957.el7.x86_64kernel-3.10.0-1160.102.1.el7.x86_64kernel-devel-3.10.0-957.el7.x86_64kernel-headers-3.10.0-957.el7.x86_64[root@docker ~]#
- 将内核工具包一并升级
# 删除旧版本工具包yumremovekernel-tools-libs.x86_64kernel-tools.x86_64# 安装新版本工具包yum--disablerepo=\*--enablerepo=elrepo-kernelinstall-ykernel-ml-tools.x86_64
- 验证
[root@docker ~]#rpm -qa|grepkernelkernel-3.10.0-957.el7.x86_64kernel-ml-tools-6.6.9-1.el7.elrepo.x86_64abrt-addon-kerneloops-2.1.11-60.el7.centos.x86_64kernel-ml-tools-libs-6.6.9-1.el7.elrepo.x86_64kernel-3.10.0-1160.102.1.el7.x86_64kernel-devel-3.10.0-957.el7.x86_64kernel-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.cfg0:CentOSLinux(5.4.265-1.el7.elrepo.x86_64) 7 (Core)1:CentOSLinux(3.10.0-1160.102.1.el7.x86_64) 7 (Core)2:CentOSLinux(3.10.0-957.el7.x86_64) 7 (Core)3:CentOSLinux(0-rescue-5987de640e6d4ac9b69d19e0059df86e) 7 (Core)[root@docker ~]#
方法2:(查看系统上的所有可用内核)
[root@docker ~]#rpm -qa |grepkernelkernel-3.10.0-957.el7.x86_64kernel-tools-libs-3.10.0-957.el7.x86_64abrt-addon-kerneloops-2.1.11-60.el7.centos.x86_64kernel-tools-3.10.0-957.el7.x86_64kernel-3.10.0-1160.102.1.el7.x86_64kernel-lt-5.4.265-1.el7.elrepo.x86_64kernel-devel-3.10.0-957.el7.x86_64kernel-headers-3.10.0-957.el7.x86_64[root@docker ~]#
- 打开并编辑 /etc/default/grub 并设置 GRUB_DEFAULT=0。意思是 GRUB 初始化页面的第一个内核将作为默认内核。(其中 0 是上面查询出来的可用内核)
GRUB_TIMEOUT=5GRUB_DEFAULT=0GRUB_DISABLE_SUBMENU=trueGRUB_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.cfgGeneratinggrubconfigurationfile...Foundlinuximage:/boot/vmlinuz-6.6.9-1.el7.elrepo.x86_64Foundinitrdimage:/boot/initramfs-6.6.9-1.el7.elrepo.x86_64.imgFoundlinuximage:/boot/vmlinuz-3.10.0-957.el7.x86_64Foundinitrdimage:/boot/initramfs-3.10.0-957.el7.x86_64.imgFoundlinuximage:/boot/vmlinuz-0-rescue-5987de640e6d4ac9b69d19e0059df86eFoundinitrdimage:/boot/initramfs-0-rescue-5987de640e6d4ac9b69d19e0059df86e.imgdone[root@node2 ~]#
/etc/grub2.cfg 是 /boot/grub2/grub.cfg的软链接
注意:
[root@node2 ~]#ll /etc/grub2.cfg lrwxrwxrwx.1rootroot22May302021/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 -aLinuxnode26.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 |grepkernelkernel-3.10.0-957.el7.x86_64kernel-tools-libs-3.10.0-957.el7.x86_64abrt-addon-kerneloops-2.1.11-60.el7.centos.x86_64kernel-tools-3.10.0-957.el7.x86_64kernel-3.10.0-1160.102.1.el7.x86_64kernel-lt-5.4.265-1.el7.elrepo.x86_64kernel-devel-3.10.0-957.el7.x86_64kernel-headers-3.10.0-957.el7.x86_64[root@docker ~]#
方法1、yum remove 删除旧内核的 RPM 包
yumremove-ykernel-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-514
、kernel-tools-libs
、kernel-tools
即可。
- 验证
[root@docker ~]#awk -F\''$1=="menuentry "{print i++ ":"$2}'/etc/grub2.cfg0:CentOSLinux(5.4.265-1.el7.elrepo.x86_64) 7 (Core)1:CentOSLinux(0-rescue-5987de640e6d4ac9b69d19e0059df86e) 7 (Core)[root@docker ~]#rpm -qa |grepkernelkernel-ml-tools-6.6.9-1.el7.elrepo.x86_64abrt-addon-kerneloops-2.1.11-60.el7.centos.x86_64kernel-ml-tools-libs-6.6.9-1.el7.elrepo.x86_64kernel-lt-5.4.265-1.el7.elrepo.x86_64kernel-devel-3.10.0-957.el7.x86_64kernel-headers-3.10.0-957.el7.x86_64[root@docker ~]#
方法2、yum-utils工具
未实际测试,仅记录。
如果安装的内核不多于 3 个,yum-utils
工具不会删除任何一个。只有在安装的内核大于 3 个时,才会自动删除旧内核。
安装yum-utils
$yuminstallyum-utils
删除旧版本
package-cleanup--oldkernels
升级脚本
UpdateKernel-v1-2023.11.24.sh(yum升级到最新长久支持版-亲测成功)(最新)
🔰 开始测试:(测试成功)2024.1.5
- 升级前内核
[root@node2 ~]#uname -aLinuxnode23.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-arpm--importhttps:rpm-Uvhhttp:yum--disablerepo="*"--enablerepo="elrepo-kernel"listavailableyum--enablerepo=elrepo-kernelinstallkernel-lt-yif[$?-eq0];thengrub2-set-default0&&grub2-mkconfig-o/etc/grub2.cfggrubby--args="user_namespace.enable=1"--update-kernel="$(grubby--default-kernel)"fiecho'Please reboot your system quick !!!'rebootuname-a
- 升级后测试
[root@node2 ~]#uname -aLinuxnode25.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.cfg0:CentOSLinux(5.4.265-1.el7.elrepo.x86_64) 7 (Core)1:CentOSLinux(3.10.0-1160.102.1.el7.x86_64) 7 (Core)2:CentOSLinux(3.10.0-957.el7.x86_64) 7 (Core)3:CentOSLinux(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源,更新内核版本。此方法适用于更新内核补丁 。 具体实验步骤:
yumlistkernelyumupdate-ykernel
此时,已安装成功,但若想将系统运行在新版本的kernel上,则需要重新启动操作系统。
重启完成,至此,Kernel版本已升级至【3.10.0-693.17.1.el7.x86_64】
安装指定内核版本Rpm
仅做记录,未实际测试。
本次以安装 LT 内核的5.4.230 版本为例。
- 当前内核版本(centos7.9默认内核)
[root@docker ~]#uname -aLinuxdocker3.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|grepkernelkernel-3.10.0-957.el7.x86_64kernel-tools-libs-3.10.0-957.el7.x86_64abrt-addon-kerneloops-2.1.11-60.el7.centos.x86_64kernel-tools-3.10.0-957.el7.x86_64kernel-3.10.0-1160.102.1.el7.x86_64kernel-devel-3.10.0-957.el7.x86_64kernel-headers-3.10.0-957.el7.x86_64[root@docker ~]#
1、查找版本
因 ELRepo 源都是最新版本,所以旧版本内核只能手动下载。查找 kernel rpm 历史版本:http:wgethttp:rpm-ivhkernel-lt-devel-4.4.215-1.el7.elrepo.x86_64.rpm