Linux系统升级及内核版本升级

📅 发布时间:2026/7/8 13:55:17 👁️ 浏览次数:
Linux系统升级及内核版本升级
一、背景工作中有时会遇到系统版本过旧,无法满足安全扫描后的安全要求,系统漏洞数量多,处理难度较大,这时,我们就需要升级OS或Linux内核版本;Linux 内核版本分为主线(mailine)、稳定版(stable )和长期版本(longterm或LTS)。所有内核版本都可以在内核开发官方网站上获取。其中,rc版本为候选版(RC),开发版本可供公众测试主线版本(kernel-ml)代表整个 Linux 内核的一个树干,新的主线版本每 2-3 个月发布一次,所有的新功能及特性都将会包含主线版本中。稳定内核则是在主线版本中,被认为是稳定的那些。稳定内核的任何错误修复都将从主线树中继承,也就是主线内核出现的任何错误 (包括之前的任何旧版本内核的错误和 BUG) 在得到修复之后才会被指定为稳定内核,所以在通常情况下,稳定内核既有内核新功能,同时BUG 也是最少的内核版本。稳定内核的更新发布依赖于主线内核 (直到下一个主线内核可用),稳定的内核更新是根据需要发布的,通常是每 3 个月。而对于长期文档内核版本,通常提供几个长期维护内核版本,用于较早的内核树错误修复后的更新。这些内核只应用重要的错误修复,通常不会有非常频繁的更新。主线、稳定和长期都是活动内核版本,由 Linus Torvalds 及 Linux 内核组织维护和发布。 而我们平时所使用的Linux 发行版的内核都为分发(第三方)内核,许多 Linux 发行版都提供自己的长期维护(Lts)内核版本,这些内核可能是也可能不是基于内核开发人员维护的。因此分发版本的内核版本由发行版的厂商决定并有自己的维护周期,通常由分发版更新时一起发布,其中的ml就是最新的版本。附录:内核版本历史回顾:在2.6x版本以前,torvalds将内核的发展方向分为两类,并根据这两类内核的发展分别给予不同的内核编号,主、次版本为奇数:开发中版本,比如2.5.xx;主、次版本为偶数:稳定版本,比如2.6.xx;不过,这种奇数、偶数的编号格式在3.0版本推出之后就不再使用了。从3.0版本开始,内核主要依据主线版本来开发,开发完毕会往下一个版本进行。参看参看3.x Linux内核:https://github.com/torvalds/linux/tree/2b09d5d364986f724f17001ccfe4126b9b43a0be/drivers;通常新一版的主线版本在2-3个月会被提出,新的主线版本,会加入新功能重新发布。现在最新的主线版本已经是6.4.6版了。Linux内核从最初发布的0.01版直到4.4.x版,经历了史前时代、奇偶时代、快速演进时代和极速演进时代四个阶段;在快速演进阶段,内核版本号的a.b一直保持为2.6没变,完全可以合二为一。与此同时,参与Linux内核开发的个人与单位越来越多,开始进入极速演进时代。在这个阶段,版本号回归a.b.c表示法,a为主版本号,b为次版本号,c为修订号;次版本号b的升级既包括新特性引入,也包括缺陷修订(Bugfix),修订号c的升级只包括Bugfix。在代码仓库管理上,有主线仓库(Mainline)、稳定仓库(Stable)、未来仓库(Linux-next)和子系统仓库(Subsystem,如Linux-mips)4大类。主线仓库是最重要的仓库,其升级规则是在次版本号上面升级演进,两个正式版之间会发布若干个候选版(RC版),比如:3.0→3.1rc1→3.1-rcN→3.1→3.2rc1;稳定仓库基于主线仓库的正式版产生,在修订号上面升级演进,如3.0.x稳定分支仓库中的版本演进关系为:3.0→3.0.1→3.0.2→3.0.3→3.0.N→……;稳定仓库的代码变更全都是缺陷修订(Bugfix),不引入新的特征。未来仓库的版本命名规则是日期,如next-20151212。未来仓库会不定期合并主线仓库的代码,将其作为新一轮添加特性的基础(Base)代码。长期维护稳定版版(Long Term Stable,LTS),实际上是一种特殊的稳定版本(Stable)。普通的Stable版本的维护时间为3个月左右,因此当Mainline仓库中下一版的正式版发布,上一版的Stable分支就不再继续升级(EOL,End Of Life)。而LTS版本的维护时间为2年左右,也可能更长。同时维护的LTS版本为5个左右,最近的显示有6个 LTS,e当一个新的LTS版本被选中时,一般最老的LTS就不再继续升级(EOL)。官方选择长期维护稳定版本的依据大致有几点:具有里程碑意义(如3.0),是过去一段时间内引入的新特性的集大成者,或者是被Redhat、Debian等著名发行版采用的版本。曾经被选为长期维护版本的内核有:2.6.16.x、2.6.27.x、2.6.32.x、2.6.33.x、2.6.34.x、2.6.35.x、3.0.x、3.2.x、3.4.x、3.10.x、3.12.x、3.14.x、3.16.x、3.18.x、4.1.x、4.4.x、4.9.x、4.14.x、4.19.x和5.4.x。注:内核3.10就是一个长期维护版本,这个版本的程序代码会被持续维护很长时间,若程序代码有bug或其他问题,内核程序维护者会持续进行程序代码的更新维护;centos7自带的 3.10 内核已逐渐暴露出两大核心问题:一是与众多现代软件(如新型容器化工具、大数据处理框架、人工智能依赖库等)存在兼容性瓶颈,导致软件无法正常启动或功能受限;二是 3.10 内核在 cgroup 资源管理模块存在已知 bug,当系统采用 xfs 磁盘格式时,会触发内核与文件系统的兼容性问题,表现为磁盘 IO 卡顿、文件读写超时甚至系统 panic,这一问题在数据密集型业务场景中尤为突出,导致集群挂死等严重稳定性事故,给业务连续性带来极大风险。对于国内的龙蜥操作系统(Anolis OS),其附带2个内核版本分别为:RHCK(RHEL Compatible Kernel,RHEL 兼容内核)和 ANCK(Anolis Cloud Kernel,Anolis 云内核)相关资源:Fedora Linux Release Life Cycle、openSUSE:发行计划、Ubuntu release cycle、slackware Linux、openanolis、Anolis OS 内核版本策略、openEuler社区版本生命周期管理规范、fedora docker、debian d、ELRepo Project二、升级操作我们一般使用安装新内核来完成升级而非直接升级内核,安装新内核不会覆盖旧内核,而升级会导致新内核直接替换旧内核,可能会导致系统无法启动,安装也可以让我们在升级后有回滚的选择,确认正常后再删除老内核。对于想直升内核的,升级前必须完成两项核心备份:一是系统重要配置文件(/etc、/boot 目录)备份至异地存储;二是业务数据全量备份,确保升级失败时可快速回滚,且应先在与生产环境配置一致的测试服务器上完成升级验证,重点测试:新内核启动稳定性、业务软件运行兼容性、硬件驱动(如网卡、存储控制器)适配性,确认无异常后再推广至生产环境。升级后切勿立即删除旧内核,建议保留至少 1-2 个 旧内核。若新内核运行过程中出现稳定性问题(如频繁 panic、硬件驱动不兼容),可在开机时通过 GRUB 菜单选择旧内核启动,快速恢复系统。2.1、升级前确认内核版本:uname -r或-a当前使用的版本:awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg#OS发行版本:cat/proc/versioncat/etc/redhat-releasecat/etc/issue 或者rpm-qicentos-release#工具链检查, 后续生成 GRUB 配置、构建 initramfs 镜像需要 grub2-tools 和 dracut 工具,提前确认是否安装;dracut 是 Linux 下生成 initramfs(初始内存文件系统)的工具,负责打包内核启动所需的核心模块、驱动和脚本,确保系统能正常启动#grub2-tools 是 GRUB2 启动引导器的工具集,负责系统启动配置、内核参数管理、启动项编辑等核心功能rpm-qgrub2-tools dracut#查看内核参数cat/proc/cmdline#查看当前 initramfslsinitrd /boot/initramfs-$(uname-r).img#如果想加配置,可放在/etc/dracut.conf.d/下,然后重新生成 initramfs(生效配置)dracut-f/boot/initramfs-$(uname-r).img$(uname-r)升级建议:先升级到小版本最新,再升级大版本;另外3.0以上内核引入签名机制2.2、redhat/CentOS系统1)最简单如果操作系统联网的话,执行:yum update; 执行后,系统会检测是否有可升级的程序,如果有,则会列出详细的升级项,并询问你是否升级,确认后,退出当前命令,执行yum -y update自动升级。注:这种在线升级,往往只能实现内核版本的小版本升级。2)图像界面的OS,可点击菜单“系统”-“管理”-“软件更新”,利用系统自带的系统更新界面更新。之后,系统会自动扫描是否有可用的更新。如果有,则会在屏幕上列出。按需安装即可,yum方式更新内核的优点是:快捷方便,成功率高。3)如果你有自己的yum源:1 yum makecache //更新软件包列表,源信息也可使用以下yum源:rpm--importhttps://www.elrepo.org/RPM-GPG-KEY-elrepo.orgrpm--importhttps://www.elrepo.org/RPM-GPG-KEY-v2-elrepo.org#适配 RHEL-10rpm-ivhhttp://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm 或 yuminstallhttps://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm上面命令可能会因网速的问题报错,可先下载下来:wgethttps://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpmrpm-ivhelrepo-release-7.el7.elrepo.noarch.rpmrpm--importhttps://www.elrepo.org/RPM-GPG-KEY-elrepo.org //导入el源的秘钥linux8的:yuminstallhttps://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm更多详见官网;2yum list available或yum list kernel --showduplicates//查看可安装的内核版本,#kernel-lt:表示longterm,即长期支持的内核;kernel-ml:表示mainline,即当前主线的内核yum list kernel --showduplicates// 查看 yum 可升级的内核版本,有需要的版本可以直接执行 update 升级yum --enablerepo="elrepo-kernel" list --showduplicates | sort -r | grep kernel-ml.x86_64 yum --disablerepo="*" --enablerepo="elrepo-kernel" list available注:lt为长期稳定了能,ml为主线产品,这里我们选lt版;现场实际:yum --disablerepo="*" --enablerepo="elrepo-kernel" list available注:对于centos7,ELRepo 官方 yum 仓库已停止对 CentOS 7 内核包的主动维护,直接通过 yum 安装可能失败,因此采用“手动下载 RPM 包 + 本地安装”的方式,wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-5.4.278-1.el7.elrepo.x86_64.rpm,同样下载devel包,完成后直接rpm -ivh安装;若安装时提示“kernel-tools”“kernel-headers”等包冲突时,可先卸载冲突包(此类包对系统基础运行无影响),再重新安装,yum remove -y kernel-tools kernel-tools-libs kernel-headers;安装完成后,先确认新内核的核心文件已正确写入 /boot 目录,内核源码相关变异目录在/usr/src/kernels/下;yum --disablerepo="*" --enablerepo="elrepo-kernel" install kernel-lt -y安装完成验证:awk-F\''$1=="menuentry " {print i++ ":" $2}'/etc/grub2.cfg //查看现有内核启动顺序注:执行yum list kernel和uname -r看到的还是当前OS使用的kernel版本;从上图我们可以看到新旧版本都存在,是随时可以切换的。3更新安装:yum --disablerepo=\* --enablerepo=elrepo install -y kernel-lt//禁用其他源只用elrepo安装新内核4 更新完成后,查看当前OS启动所用内核版本,执行:cat /boot/grub2/grub.cfg |grep menuentry现场实际更新完成后,就可以看到新的内核版本已经加入到启动列表里了:5设置操作系统从新内核启动grub2-set-default "CentOS Linux (4.4.221-1.el7.elrepo.x86_64) 7 (Core)"//替换为升级后的内核信息,安装对应格式编写,即uname -a显示的:grub2-set-default “BigCloud Enterprise Linux (5.10.0-136.49.0.127.10.oe2203.bclinux.x86_64) 22.10 LTS”或者:vi /etc/default/grub//增加GRUB_DEFAULT=0。指定GRUB 初始化页面的第一个内核将作为默认内核。如果不管用,请编辑/etc/grub2.cfg配置文件,修改set_default=你的启动顺序,0表示第一个;正常无需修改。再执行:mv /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak grub2-mkconfig -o /boot/grub2/grub.cfg//用新的内核信息生成grub启动文件6查看内核启动项是否修改#查看GRUB 菜单,确认新内核已添加到启动列表awk-F\''$1=="menuentry " {print i++ " : " $2}'/boot/grub2/grub.cfg#将第 0 项(新内核)设为默认启动项grub2-set-default 新内核的序号#验证grub2-editenv list#输出saved_entry=0或如下#initramfs 是系统启动时的临时根文件系统,包含内核启动所需的驱动和工具 mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak #备份呢当前启动镜像 #安装新内核后,重新生产对应的根镜像文件 dracut -f /boot/initramfs-$(uname -r).img $(uname -r) #-f 强制覆盖现有的 dracut /boot/initramfs-$(uname -r).img $(uname -r) #建立新镜像 #查看已安装内核清单 rpm -q kernel kernel-lt确认后重启完成升级。Ubuntu的参考:https://www.cnblogs.com/Older-Driver-of-Newer/p/7077150.html2.3、只升级内核(无网)可进入官网离线下载要升级的内核包:最新稳定版5.14.7:wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.14.7.tar.xz;可单击进入此查看包的内容。也可以去git上下载,单击进入;对应的ubuntu,进入。wget http://mirror.centos.org/centos/7/os/x86_64/Packages/kernel-3.10.0-1160.el7.x86_64.rpm也可以去https://mirrors.edge.kernel.org/pub/linux/kernel/下找对应版本的内核。注:生产环境中不推荐编译安装。#依赖yuminstall-ygccmakegitctags ncurses-devel openssl-devel yuminstall-ybison flex elfutils-libelf-develbc#获取源码wgethttps://mirror.tuna.tsinghua.edu.cn/kernel/vxxx.tar.xztar-xvflinux-5.14.7.tar.xzmkdir/usr/local/srcmv./linux-5.14.7 /usr/local/src //或直接解压时-C 指定 yuminstallncurses-devel#升级ncurses,ncurses是字符终端下屏幕控制的基本库makecleanmakemrporper //清理内核源代码树(清理垃圾信息),Make distclean:删除mrproper+编辑文件和补丁文件cp/boot/config-'uname -r'/usr/src/kernels/ linux-5.14.7/.config#使用原来的配置文件makemenuconfig //配置内核以及内核模块(输入y选中,M编译为模块)a、General setup→[*] enable deprecated sysfs features to support old userspace toolsb、Processor type and features→HighMemory Support。c、找到以下选中选项并选中:networking support → networking options → network packet filtering framework(netfilter)(1)Corenetfilter configuration. 勾中"Netfilter connection tracking support" -m state相关模块是依赖它的,不选则没有。. 将netbios name service protocal support(new) 编译成模块,不然后面升级iptables后启动时会出错. 勾中"Netfilter Xtables support (required for ip_tables)"(2)IP: Netfilter Configuration. 将 “IPv4 connection tracking support (require for NAT)” 编译成模块。. 勾中IP tables support (required for filtering/masq/NAT) 。. 将 “Full NAT” 下的 “MASQUERADE target support” 和 “REDIRECT target support” 编译成模块编译并安装内核:确保以下每一步没有显示 error 的字样,如果任何一步报错都要退回到 make mrproper 重来makeclean // 清除下内核编译的目标文件makedep //生成依赖性关系makebzImage // 生成新内核文件makemodules // 编译内核模块makemodules_install // 安装内核模块makeinstall// 安装内核vi/etc/grub.conf //验证,查看是否有新的内核启动项生成ls/boot //查看是否有新的内核文件vmlinuz生成修改grub2配置文件,配置从新内核启动,参考上文步骤5;重启:shutdown -r “now”验证:uname -rs //参考rpm-qa|grepkernel yum remove kernel-3.xxxx2.4、内核包说明#pic_center)kernelLinux 内核软件包,包含单、多核和多处理器系统的内核,是任何 Linux 操作系统的核心,单处理器的系统仅需安装内核包。内核处理操作系统的基本功能: 内存分配、进程分配、设备输入和输出等kernel-devel包含提供足够的针对内核软件包构建模块的内核头文件和 makefile 文件kernel-headers包含指定 Linux 内核、用户空间库文件和程序之间指定接口的 C 头文件。头文件定义了构建大多数标准程序所需的结构和常量,也是重建 glibc 软件包所必需的kernel-doc包含来自内核源代码的文档文件。各种关于 Linux 内核和设备以及驱动程序的信息都记录在这些文件当中kernel-firmware包含对于某些设备及其操作的固件信息文件kernel-debug包含许多对于内核 debug 诊断和调试的启用选项,只有当我们需要尝试收集额外的内核错误信息时才应该安装它。它是以牺牲性能为代价kernel-debug-devel包含内核 debug 诊断和调试的启用选项,以牺牲性能为代价2.5、Ubuntu 内核升级环境:Ubuntu 18.041)检查当前OS内核版本:sudo dpkg -l | grep linux-image,注意架构这里是amd642)查看本地可用的内核升级版本#generic表示通用版内核。lowlatency表示低延迟内核。我们一般选择通用版内核sudoapt-cachesearch linux-image|grepgeneric#升级sudoapt-getinstalllinux-image-$(uname-r)-generic或:联网的话直接升级当前系统所有软件包和内核,升级前先更新升级的软件包和内核明细表,执行sudoaptupdate#完成后aptlist--upgradable//查看哪些软件包需要升级#升级系统所有的软件包sudoaptupgrade-y#重新登录系统,再次检查可升级包sudorebootsudoaptlist--upgradeable//如果执行命令的结果为:Listing… Done,就说明系统组件已经是最新的,没有需要更新的软件。或离线安装:用wget分别下载4个generic版本的内核文件wget--no-check-certificate https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.16.15/amd64/linux-headers-5.16.15-051615-generic_5.16.15-051615.202203161444_amd64.debwget--no-check-certificate https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.16.15/amd64/linux-headers-5.16.15-051615_5.16.15-051615.202203161444_all.debwget--no-check-certificate https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.16.15/amd64/linux-image-unsigned-5.16.15-051615-generic_5.16.15-051615.202203161444_amd64.debwget--no-check-certificate https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.16.15/amd64/linux-modules-5.16.15-051615-generic_5.16.15-051615.202203161444_amd64.deb#安装sudodpkg-i*.debsudodpkg --auto-deconfigure-i*.deb //交互式安装#报错如下dpkg: dependency problems prevent configuration of linux-headers-5.16.15-051615-generic: linux-headers-5.16.15-051615-generic depends on libc6(=2.34);however: Version of libc6:amd64 on system is2.27-3ubuntu1.2. linux-headers-5.16.15-051615-generic depends on libssl3(=3.0.0~~alpha1);however: Package libssl3 is not installed. dpkg: error processing package linux-headers-5.16.15-051615-generic(--install):#验证apt-cachedepends linux-headers-5.16.15-051615-generic注意:Ubuntu内核升级到v5.13或v5.15时,需要升级libc和开发工具gcc,版本 = 2.34:aptlist|greplibgcc|grepinstalled ldd--version//输出如下 ldd(Ubuntu GLIBC2.27-3ubuntu1.2)2.27getconf GNU_LIBC_VERSION //输出如下 glibc2.27find/-namelibc-2.27.so //输出如下 /lib/x86_64-linux-gnu/libc-2.27.so strings /lib/x86_64-linux-gnu/libc-2.27.so|grepGLIBC //如果没有,安装sudoapt-getinstallbinutils //以下命令有坑,请看完测试正常后再执行wget-qhttp://archive.ubuntu.com/ubuntu/pool/main/g/glibc/libc6_2.34-0ubuntu3_amd64.debwget-qhttp://archive.ubuntu.com/ubuntu/pool/main/g/glibc/libc-bin_2.34-0ubuntu3_amd64.debwget-qhttp://ports.ubuntu.com/pool/main/g/glibc/locales_2.34-0ubuntu3_all.debsudodpkg --auto-deconfigure-i*.deb#报错:dpkg: error processing archive libc6_2.34-0ubuntu3_amd64.deb(--install): installing libc6:amd64 wouldbreaklocales, and deconfiguration is not permitted(--auto-deconfigure mighthelp)(Reading database...139800files and directories currently installed.)Preparing to unpack libc-bin_2.34-0ubuntu3_amd64.deb... Unpacking libc-bin(2.34-0ubuntu3)over(2.27-3ubuntu1.2)... dpkg: dependency problems prevent configuration of libc-bin: libc-bin depends on libc6(2.34);however: Version of libc6:amd64 on system is2.27-3ubuntu1.2. dpkg: error processing package libc-bin(--install): dependency problems - leaving unconfigured Processing triggersforman-db(2.8.3-2ubuntu0.1)... Errors were encounteredwhileprocessing: libc6_2.34-0ubuntu3_amd64.deb libc-bin#生产环境备份镜像后再执行如下命令dpkg --auto-deconfigure-ilibc6_2.34-0ubuntu3_amd64.deb执行完上述,死机了重启主机:发现主机无法登录,无法弹出认证(输入密码的响应),重启按ESC键,然后e键访问grub菜单,找到linux开头的行,ctrl+e键导航到行尾,编辑:systemd.unit=rescue.target或systemd.unit=emergency.target,按ctrl + x重启进入救援/紧急模式;说明:1、救援模式(即单用户模式)等效于使用 SysV 作为默认的服务器管理器的单用户(single user)模式。在救援模式中,将挂载所有的本地文件系统,将仅启动一些重要的服务。但是,不会启动一般的服务(例如,网络服务)。救援模式在不能正常引导系统的情况下很有用。2、紧急模式中,不会启动任何的东西。不会启动服务、不会挂载挂载点、不会建立套接字、什么都不会启动。你将所拥有的只是一个原始的 shell。紧急模式多适用于调试目的。mount-oremount,rw /cd/mnt/sysimage/lib64 //救援模式进入到要修复系统的lib64目录rm-rf*2.34* //此操作会删除所有与2.34版本glibc的文件cd/ //回到rescue自带系统的目录mkdirmedia //创建目录mount/dev/cdrom /media //挂载光盘cd/media/Packages //进入到rpm包的目录rpm-ivh--force--root=/mnt/sysimage glibc-* //安装与glibc有关的rpm包 systemctlreboot针对以上Ubuntu内核升级到v5.13或v5.15时,需要升级libc和开发工具gcc,版本 = 2.34:,我们先升级glibc,升级lic6到2.34,但需特别注意:不要在运行中的系统上安装 Glibc,否则将会导致系统崩溃,至少应当将新 Glibc 安装到其他的单独目录,以保证不覆盖当前正在使用的 Glibc ,且强烈建议你使用非 root 身份编译和测试 Glibc。先检查当前的lib版本(Ubuntu 18.04.3 LTS):glibc 2.27-3ubuntu1.6ll /usr/lib/x86_64-linux-gnu/libc.so.6 lrwxrwxrwx1root root12Dec162020/usr/lib/x86_64-linux-gnu/libc.so.6 -libc-2.27.so*aptinstallbinutils-ycd/usr/lib/x86_64-linux-gnu/ strings /lib/x86_64-linux-gnu/libc-2.27.so|grepGLIBC //查看当前lib库支持的GLIBC版本号,如果没有,安装sudoapt-getinstallbinutilsless