15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
26.12.2023

更新 Linux 内核:各发行版完整指南

Linux内核是硬件与系统上运行的每个进程之间的基础层。它管理CPU调度、内存分配、设备驱动程序、系统调用和安全执行。对于生产系统来说,保持内核更新不是可选项——过时的内核会使服务器暴露于权限提升漏洞、内存损坏漏洞以及新版本已解决的性能退化问题。

本指南为在Ubuntu、Debian、CentOS、RHEL和Arch Linux上更新Linux内核提供详尽、技术精确的说明——包括引导加载程序配置、initramfs重新生成、版本固定以及大多数指南完全省略的回滚程序。

为什么内核更新是关键维护任务

每个内核版本都解决了安全补丁(CVE)、硬件兼容性改进、调度器优化以及新文件系统或网络功能的组合。运行过时内核的后果包括:

  • 未修补的CVE:Dirty COW(CVE-2016-5195)、Spectre/Meltdown缓解措施以及更近期的权限提升漏洞等漏洞是内核级问题,任何应用层安全工具都无法完全弥补。
  • 性能下降:旧内核缺少对CFS调度器、内存压缩和NVMe队列深度处理的改进,这些改进直接影响服务器吞吐量。
  • 驱动程序不兼容:新硬件,包括现代NVMe控制器和网络适配器,可能需要公开更新驱动程序接口的内核版本。
  • 缺少系统调用支持:容器化运行时(Docker、Podman、containerd)和安全框架(eBPF、seccomp)依赖于特定版本中引入的内核功能。

VPS托管环境中,内核还控制着客户操作系统与虚拟机监控程序的交互效率——这意味着具有最新virtio驱动程序和半虚拟化支持的当前内核直接转化为更低的延迟和更好的I/O吞吐量。

开始之前:更新前检查清单

无论使用哪种发行版,在操作内核之前请执行以下步骤:

  1. 对系统进行快照或备份。如果您的提供商支持快照,请立即创建一个。在裸机上,确保您的备份是最新的。
  2. 检查当前内核版本:uname -r
  3. 验证/boot中的可用磁盘空间:df -h /boot——/boot分区已满将导致基于Debian的系统上的内核安装静默失败。
  4. 确认您的引导加载程序:ls /boot | grep -E 'grub|efi'——了解您使用的是GRUB2、systemd-boot还是GRUB旧版会影响安装后的步骤。
  5. 检查保留或固定的软件包:在Debian/Ubuntu上,运行apt-mark showhold。在RHEL/CentOS上,检查/etc/yum.conf中的exclude=kernel*
  6. 准备好控制台访问。如果新内核无法启动,SSH将不可用。在重新启动之前,确保您有带外访问(VNC、IPMI或您的提供商的紧急控制台)。

在Ubuntu和Debian上更新内核

Ubuntu和Debian使用APT包管理器,并以linux-image-*命名约定将内核镜像作为标准软件包提供。内核、其模块和initramfs都通过此系统管理,使更新相对简单——但有一些重要的细节需要注意。

步骤1:同步软件包存储库

sudo apt update

这会根据所有已配置的存储库刷新本地软件包索引。不要跳过此步骤——在没有事先执行apt update的情况下运行apt upgrade可能会安装过时的软件包版本。

步骤2:应用完整系统升级

sudo apt upgrade

这会升级已安装的软件包,但如果安装新内核需要删除现有软件包,则不会安装新内核。对于内核过渡(例如,从5.15迁移到6.1),请使用:

sudo apt full-upgrade

旧的dist-upgrade命令在功能上等同于full-upgrade并且仍然可用,但full-upgrade是当前的规范形式。

步骤3:安装内核元软件包

sudo apt install linux-image-generic linux-headers-generic

元软件包linux-image-generic)始终跟踪您架构的最新推荐内核。明确安装它可确保软件包管理器知道您希望将来进行内核更新。如果您编译外部内核模块(例如,DKMS管理的驱动程序,如ZFS或专有GPU驱动程序),则需要linux-headers-generic软件包。

对于Ubuntu系统,您还可以安装HWE(硬件支持)内核,它将较新的内核向后移植到LTS版本:

sudo apt install linux-generic-hwe-22.04

步骤4:验证新内核是否已暂存

dpkg --list | grep linux-image

您应该看到新内核版本以ii状态(已安装)列出。旧内核仍作为备用保留安装——这是有意为之的。

步骤5:重新启动并确认

sudo reboot

重新连接后:

uname -r

确认输出反映了新的内核版本。

清理Debian/Ubuntu上的旧内核

旧内核会在/boot中积累并占用磁盘空间。使用以下命令安全地删除它们:

sudo apt autoremove --purge

APT会自动识别被取代的内核软件包并将其删除,但前提是它们不是当前运行的内核或最新的备用内核。

关键陷阱:切勿手动删除当前运行的内核软件包。始终先重新启动到新内核,然后再运行autoremove

在CentOS和RHEL上更新内核

CentOS和RHEL使用基于RPM的软件包管理——yum(CentOS 7、RHEL 7)或dnf(CentOS 8+、RHEL 8+、AlmaLinux、Rocky Linux)。内核更新过程与基于Debian的系统有一个重要区别:RPM系统默认同时保留多个内核版本,由installonly_limit/etc/dnf/dnf.conf中的/etc/yum.conf指令控制。

步骤1:更新所有软件包(包括内核)

# CentOS 7 / RHEL 7
sudo yum update

# CentOS 8+ / RHEL 8+ / AlmaLinux / Rocky Linux
sudo dnf update

这个单一命令在大多数情况下处理内核更新。与Debian不同,没有单独的dist-upgrade等效命令——yum update/dnf update自动处理内核过渡的依赖关系解析。

步骤2:安装特定内核版本(可选)

如果您需要特定的内核版本而不是最新可用版本:

sudo yum install kernel-<version>
# Example:
sudo yum install kernel-5.14.0-284.30.1.el9_2

步骤3:重新生成GRUB2配置

在RHEL/CentOS系统上,必须明确重新生成引导加载程序配置以包含新的内核条目。正确的命令取决于您的系统使用BIOS还是UEFI:

基于BIOS的系统:

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

基于UEFI的系统:

sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
# or for CentOS/AlmaLinux/Rocky:
sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

重要:在RHEL 8+及其衍生版本上,grub2-mkconfig步骤通常由kernel-core软件包脚本通过grubby自动处理。您可以使用以下命令验证默认启动条目:

sudo grubby --default-kernel

手动设置默认内核:

sudo grubby --set-default /boot/vmlinuz-<new-version>

步骤4:重新启动并验证

sudo reboot
uname -r

管理RHEL/CentOS上的内核保留

默认情况下,/etc/dnf/dnf.conf中的installonly_limit=3保留三个最新的内核。如果/boot中的磁盘空间受限,请调整此值:

sudo sed -i 's/installonly_limit=3/installonly_limit=2/' /etc/dnf/dnf.conf

列出所有已安装的内核:

rpm -q kernel

在Arch Linux上更新内核

Arch Linux遵循滚动发布模型,这意味着内核会随着新的上游版本发布而持续更新。没有离散的发布版本——系统始终朝着最新的稳定内核迈进。这使Arch非常适合需要尖端内核功能的开发人员,但需要更细心的维护。

步骤1:完整系统同步和升级

sudo pacman -Syu

-S标志同步软件包,-y刷新数据库,-u升级所有已安装的软件包。在Arch上,您应该始终执行完整系统升级,而不是单独升级单个软件包——部分升级明确不受支持,可能导致库依赖关系损坏。

步骤2:安装或重新安装内核软件包

如果内核未通过pacman -Syu更新(例如,您正在切换内核变体),请明确安装它:

sudo pacman -S linux linux-headers

Arch Linux提供多个官方内核变体:

内核软件包描述
linux稳定内核,最新上游版本
linux-lts长期支持内核,保守更新
linux-hardened带有额外补丁的安全加固内核
linux-zen针对桌面/交互式工作负载优化

对于服务器环境,linux-lts通常更可取——它为DKMS模块提供稳定的ABI,并减少内核更新所需的重启频率。

步骤3:重新生成initramfs

sudo mkinitcpio -p linux

这使用/etc/mkinitcpio.d/linux.preset中定义的预设重新生成初始RAM文件系统。initramfs包含在完整操作系统接管之前挂载根文件系统所需的最小环境。在内核更新后跳过此步骤可能导致系统无法启动,如果根文件系统需要某个模块(例如,ext4btrfs或通过dm-crypt加密的卷)。

如果您安装了linux-lts,请使用相应的预设:

sudo mkinitcpio -p linux-lts

步骤4:更新GRUB引导加载程序配置

sudo grub-mkconfig -o /boot/grub/grub.cfg

请注意,在Arch上,命令是grub-mkconfig(没有2后缀),与RHEL/CentOS不同。如果您使用systemd-boot而不是GRUB(在UEFI Arch安装中很常见),请手动更新启动条目或运行:

sudo bootctl update

步骤5:重新启动

sudo reboot
uname -r

发行版比较:内核更新机制

功能Ubuntu/DebianCentOS/RHELArch Linux
包管理器APT(aptYUM / DNFPacman
发布模型固定发布(LTS/标准)固定发布(主要版本)滚动发布
内核元软件包linux-image-generickernellinuxlinux-lts
需要更新引导加载程序自动(通过postinst脚本)手动(grub2-mkconfiggrubby手动(grub-mkconfig
initramfs重新生成自动(update-initramfs自动(通过dracut)手动(mkinitcpio
保留多个内核是(autoremove清理旧内核)是(由installonly_limit控制)是(保留所有已安装的变体)
LTS内核选项是(HWE堆栈)是(RHEL上的EUS频道)是(linux-lts软件包)
回滚机制启动时的GRUB菜单启动时的GRUB菜单启动时的GRUB菜单

内核回滚:当新内核破坏系统时该怎么做

导致启动失败或硬件不兼容的内核更新是真实的操作风险。以下是恢复程序:

步骤1:在启动时访问GRUB菜单。如果GRUB被隐藏(在VPS环境中很常见),在启动期间按住或反复按Shift(BIOS)或Esc(UEFI),或在更新之前在/etc/default/grub中将GRUB_TIMEOUT配置为非零值。

步骤2:选择”高级选项”并从列表中选择之前的内核版本。

步骤3:启动到正常工作的内核后,执行以下操作之一:

  • 固定正常工作的内核以防止其被删除(Debian/Ubuntu:sudo apt-mark hold linux-image-<version>
  • 将其设置为默认启动条目(RHEL:sudo grubby --set-default /boot/vmlinuz-<version>
  • 删除有问题的内核(Arch:sudo pacman -R linux,然后重新安装LTS变体)

步骤4:在重新尝试更新之前,向您的发行版内核团队提交错误报告或检查上游内核错误跟踪器。

容器化和虚拟化环境中的内核更新

VPS托管环境中,内核更新过程有一个额外的考虑因素:您正在更新客户内核,而不是主机虚拟机监控程序内核。这是标准且预期的——客户操作系统在半虚拟化或完全虚拟化的上下文中运行其自己的内核。

但是,在基于容器的VPS平台(OpenVZ、没有内核命名空间的LXC)上,客户可能共享主机内核。在这些情况下,uname -r反映主机内核版本,尝试在容器内安装新内核软件包不会更改运行中的内核——尽管软件包安装本身是无害的。

在基于KVM的VPS基础设施上(这是现代提供商的标准),您拥有完整的内核控制权。确保您更新的内核包含编译进去或作为模块可用的virtio驱动程序——特别是virtio_netvirtio_blkvirtio_scsi——以在重新启动后保持网络和存储连接。

对于需要最大原始I/O性能的工作负载——例如数据库服务器或ML推理管道——考虑将内核更新与独立服务器环境配对,在那里您拥有完整的硬件控制权且没有虚拟机监控程序开销。

高级:安装主线或自定义内核

对于需要尚未向后移植到其发行版稳定内核的内核功能的用户,可以从源代码或通过特定于发行版的工具安装主线内核。

Ubuntu主线内核安装程序:

# Using the mainline tool (third-party PPA)
sudo add-apt-repository ppa:cappelikan/ppa
sudo apt update
sudo apt install mainline
mainline install-latest

从源代码编译(所有发行版):

# Download from kernel.org
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.x.y.tar.xz
tar -xf linux-6.x.y.tar.xz
cd linux-6.x.y
cp /boot/config-$(uname -r) .config
make olddefconfig
make -j$(nproc)
sudo make modules_install
sudo make install

从源代码编译使您可以精确控制内核配置——启用或禁用特定子系统、应用自定义补丁或启用实验性功能。这对于GPU托管工作负载特别相关,其中可能需要用于NVIDIA驱动程序兼容性或IOMMU配置的自定义内核参数。

安全地自动化内核更新

无人值守的内核更新是一种双刃剑能力。它们减少了暴露于已知CVE的窗口,但引入了无人值守重启到损坏内核状态的风险。

Ubuntu/Debian——unattended-upgrades:

sudo apt install unattended-upgrades
sudo dpkg-reconfigure unattended-upgrades

编辑/etc/apt/apt.conf.d/50unattended-upgrades以包含或排除内核软件包:

Unattended-Upgrade::Package-Blacklist {
    // "linux-image";  // Uncomment to exclude kernel updates
};

RHEL/CentOS——dnf-automatic:

sudo dnf install dnf-automatic
sudo systemctl enable --now dnf-automatic.timer

配置/etc/dnf/automatic.conf以在验证您的回滚策略后仅设置apply_updates = yes

生产环境最佳实践:自动应用内核安全更新,但使用needrestartkured(用于容器化工作负载的Kubernetes重启守护程序)等工具通过维护窗口控制重启。

决策矩阵和关键要点

在每次内核更新之前和之后使用此检查清单:

  • 开始前已完成快照或备份
  • 已记录当前内核版本(uname -r
  • /boot分区有足够的可用空间(df -h /boot
  • 已确认并测试控制台/带外访问
  • GRUB超时设置为非零值以允许恢复启动
  • 新内核已安装并在包管理器中验证
  • initramfs已重新生成(在Arch上至关重要;在所有发行版上验证)
  • 在需要的地方重新生成了GRUB配置(RHEL、Arch)
  • 系统已重新启动并确认新内核版本(uname -r
  • 确认稳定性后清理了旧内核软件包
  • 内核版本已记录在变更日志或监控系统中
  • 对于DKMS模块(ZFS、专有驱动程序):模块已重建并验证

何时使用LTS内核与最新稳定版:

  • 生产数据库服务器、Web服务器、电子邮件基础设施:使用LTS内核。稳定性和可预测的内核模块ABI优于访问最新功能。如果您运行电子邮件托管共享虚拟主机堆栈,LTS是正确的选择。
  • 开发环境、GPU计算节点、边缘网络:使用最新稳定内核以访问新的eBPF功能、更新的调度器算法和当前的硬件支持。
  • 安全关键环境:考虑linux-hardened(Arch)或带有内核实时补丁的RHEL(kpatch)以在不重启的情况下应用CVE修复。

对于SSL/TLS终止和证书管理是堆栈一部分的环境,请记住,内核级TLS(ktls)支持——在4.13+内核中可用——可以将TLS记录加密卸载到内核,从而减少CPU开销。将此与正确管理的SSL证书配对,以获得完整的安全态势。

常见问题

问:更新内核会破坏我正在运行的应用程序吗?

答:内核更新本身不会影响正在运行的进程——它们继续使用旧内核直到重新启动。重新启动到新内核后,依赖于针对旧版本编译的内核模块的应用程序(例如,ZFS或VirtualBox等DKMS模块)可能无法加载。在重新启动之前,始终使用dkms status验证DKMS模块状态。

问:如何在安装之前检查哪个内核版本可用?

答:在Debian/Ubuntu上:apt-cache show linux-image-generic | grep Version。在RHEL/CentOS上:dnf info kernel。在Arch上:pacman -Si linux | grep Version。这让您在提交之前评估更新。

问:我可以在没有控制台访问的情况下在VPS上更新内核吗?

答:技术上可以,但强烈不建议。如果新内核无法启动,您将失去SSH访问且没有恢复路径。在远程执行内核更新之前,始终确认您的VPS提供商提供紧急控制台(VNC或串行)。

问:apt upgradeapt full-upgrade在内核更新方面有什么区别?

答:如果安装新内核需要删除任何当前已安装的软件包,apt upgrade将不会安装新内核。apt full-upgrade(以前称为dist-upgrade)通过允许根据需要删除软件包来解决这些冲突——这通常在Debian/Ubuntu上在主要内核版本之间过渡时需要。

问:如何防止特定内核版本被自动更新?

答:在Debian/Ubuntu上,使用sudo apt-mark hold linux-image-<version>。在RHEL/CentOS上,将exclude=kernel-<version>添加到/etc/dnf/dnf.conf,或在安装python3-dnf-plugin-versionlock软件包后使用dnf versionlock add kernel-<version>。在Arch上,将软件包添加到/etc/pacman.conf中的IgnorePkg

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用