Skip to content

内核升级

实战: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 两种内核类型版本可以共存,但每种类型内核只能存在一个版本。

测试环境

bash
centos7.9测试环境

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

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

bash
[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

注意:

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


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

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

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

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

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

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

bash
[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:(查看系统上的所有可用内核)

bash
[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 是上面查询出来的可用内核)
bash
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。

bash
[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的软链接

注意:

bash
[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)"
  • 重启并验证最新的内核已作为默认内核。

需要重启才能生效。

bash
[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、 删除旧内核(可选)

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

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

  • 查看系统中全部的内核:
bash
[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 包

bash
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-514kernel-tools-libskernel-tools即可。

  • 验证
bash
[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 ~]#

image-20240105094834470

方法2、yum-utils工具

未实际测试,仅记录。

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

安装yum-utils

bash
$yuminstallyum-utils

删除旧版本

bash
package-cleanup--oldkernels

升级脚本

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

脚本位置:https:# 载入公钥rpm--importhttps:# 安装ELReporpm-Uvhhttp:# 载入elrepo-kernel元数据yum--disablerepo=\*--enablerepo=elrepo-kernelrepolist# 查看可用的rpm包yum--disablerepo="*"--enablerepo="elrepo-kernel"listavailable# 安装最新版本的lt kernelyum--disablerepo=\*--enablerepo=elrepo-kernelinstallkernel-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-ltif[$?-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


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

image-20240104165257371

FAQ

awk解释

bash
[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 ~]#
bash
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源,更新内核版本。此方法适用于更新内核补丁 。 具体实验步骤:

bash
yumlistkernelyumupdate-ykernel

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

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

安装指定内核版本Rpm

仅做记录,未实际测试。

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

  • 当前内核版本(centos7.9默认内核)
bash
[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

4、确认已安装内核版本

5、设置启动

自编译升级(不推荐)

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

参考链接

https:t="1711730357270" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4392" width="16" height="16" >打赏支持