服务器内核升级这件事,大多数个人站长只有两种处理方式:一种是装机时装什么内核就一直用到报废,另一种是看到有新版本就 `apt upgrade` 一把梭。前者会错过安全补丁,后者在我自己的经历里出过一次很典型的故障——升级后重启,机器没起来,因为新内核不认识旧的软 RAID 配置。
这篇文章讲的是「跨大版本」的内核升级,也就是 Debian 11 到 12、Ubuntu 22.04 到 24.04 这种,而不是同版本内的补丁更新。补丁更新只用 `apt upgrade` 加重启就行,风险很低;跨大版本则涉及内核、initramfs、引导器、内核模块和用户态工具链的联动,任何一个环节没准备好都会变成「远程连不上、现场又没人」的窘境。
一、先分清三种「内核升级」
很多人把这三种混为一谈,导致评估风险时完全错位:
- 同版本补丁(如 5.10.0-20 到 5.10.0-26):只是安全修复,配置和模块都不变,重启即可,风险极低。
- 同发行版跨大版本(如 Debian 11 的 5.10 到 Debian 12 的 6.1):本文重点,需要走发行版升级流程。
- 自编译内核(主线或第三方源):完全自己负责,模块签名、引导项、配置项都要手工处理,个人站除非有明确需求(比如要某个文件系统特性),否则不建议。
判断当前状态只需要一条命令:
uname -r
cat /etc/debian_version
dpkg -l | grep linux-image三行输出分别告诉你「现在跑的内核」「发行版版本」「装了哪些内核包」。如果 `uname -r` 显示的内核不在 `dpkg -l` 的列表里,说明当前跑的是手工编译或已被卸载的内核,这种情况升级前要格外小心。
二、升级前必须确认的五件事
我把这一步做成清单,逐条打勾才动手。跳过任何一条都可能变成深夜救火。
第一,有没有带外管理。这是最关键的一条。云服务器有 VNC 控制台,物理机有 IPMI 或 KVM,只要有其中之一,最坏情况还能进控制台修。如果只有 SSH,那么整个升级过程必须在你能物理接触到机器的时间窗口内进行,并且要假设「重启后可能起不来」。
第二,引导方式是什么。BIOS + GRUB 和 UEFI + GRUB 的故障表现完全不同,UEFI 下引导项写错会直接进固件设置界面:
[ -d /sys/firmware/efi ] && echo UEFI || echo BIOS
efibootmgr -v # UEFI 下看引导项
lsblk -f # 看分区与文件系统第三,根文件系统是什么。ext4 几乎没有风险,XFS 在跨大版本时要注意内核版本是否支持当前特性,Btrfs 和 ZFS 则必须确认新内核有对应模块。用 ZFS 的机器,升级内核前一定要确认 `zfs-dkms` 能在新内核上编译成功,否则重启后根文件系统挂不上——这是最经典的翻车场景之一。
第四,有没有第三方内核模块。DKMS 模块、厂商驱动(网卡、RAID 卡)、虚拟化增强工具都属于这一类。它们在新内核上编译失败时,`apt upgrade` 只会打一行警告,然后你重启,然后网卡不见了:
dkms status
lsmod | head -30第五,有没有远程不可恢复的操作。比如升级过程会自动改网络配置(从 ifupdown 换成 systemd-networkd 或 netplan),这类变更在重启后才会暴露,而那时你可能已经连不上了。
三、备份:不是备份数据,是备份「能启动的状态」
数据备份大多数人都做,但内核升级真正需要的是能回退的引导状态。三样东西必须在动手前留好:
/etc整个目录的打包:tar czf /root/etc-$(date +%F).tar.gz /etc。升级过程中被改坏最多就是它。- 当前内核包名记下来:
dpkg -l | grep linux-image的输出存一份,出问题时能用 `apt install` 精确装回。 - 引导器配置备份:
cp -a /boot/grub/grub.cfg /root/grub.cfg.bak,UEFI 下还要efibootmgr -v > /root/efi.txt。
如果机器是虚拟机或云主机,最省事的做法是先打一个快照。快照的价值在于它把「回退」从半小时的手工操作变成一次点击。花五分钟打快照,比任何备份脚本都值。
四、升级流程:五步,每步都要验证
Debian 系的标准流程是改源、更新、升级、重启。但真正决定成败的是每一步之间的验证。
第一步,改软件源并只做 update。把 `/etc/apt/sources.list` 里的版本代号改掉(bullseye 换成 bookworm,jammy 换成 noble),然后只执行 `apt update`,不执行 upgrade。这一步能提前暴露镜像源问题、GPG 密钥过期问题。
sed -i 's/bullseye/bookworm/g' /etc/apt/sources.list
apt update
apt list --upgradable | wc -l如果 `apt update` 报 GPG 错误,说明 keyring 需要更新,先解决它再往下走。带着错误继续升级是最常见的起因。
第二步,先升最小集合。不要直接 `apt full-upgrade`。先升 `apt`、`dpkg`、`debconf` 这几个基础包,再升 `systemd` 和 `initramfs-tools`,最后才全量升级。这样中途失败时,系统仍处于可修复状态。
apt install --only-upgrade apt dpkg
apt install --only-upgrade systemd initramfs-tools第三步,全量升级时看住交互提示。`apt full-upgrade` 过程中会弹出配置文件冲突(conffile prompt)和服务重启确认。默认选项通常是安全的,但有两类必须人工确认:一是 sshd 配置,二是网络配置。前者选错会锁死自己,后者选错会断网。遇到不确定的,一律选「保留当前配置」,升级完再单独比对。
第四步,重启前先 dry-run 一次 initramfs。这一步能救回很多机器:
update-initramfs -u -k all
lsinitramfs /boot/initrd.img-$(uname -r) | grep -c ''如果 `update-initramfs` 报错(常见是模块缺失或空间不足),说明新内核的 initramfs 根本没生成成功,此时绝对不要重启。先解决错误,确认 `/boot` 下每个内核都有对应的 `initrd.img` 文件且大小正常(通常 20MB 以上)。
第五步,重启并立刻验证。重启后不要等别人报告问题,自己按顺序验证:
uname -r # 是不是新内核
systemctl --failed # 有没有失败的单元
ip -br addr # 网络是否正常
df -h /boot # 引导分区是否被旧内核塞满
journalctl -b -p err --no-pager | tail -30五、出不来怎么办:GRUB 与救援模式
如果重启后进不了系统,按现象分三种处理:
现象一:卡在 GRUB 菜单。这是最好的情况。在 GRUB 里按 `e` 编辑启动项,把 `linux` 那行的内核版本改回旧版本,或者直接在菜单里选「Advanced options」进旧内核。进系统后 `grub-install` 加 `update-grub` 重新生成配置。
现象二:卡在 initramfs 的 `(initramfs)` 提示符。通常是根文件系统没挂上,常见原因是 RAID 或 LVM 模块没进 initramfs。在这个提示符下可以手工挂载排查:
ls /dev/mapper/
blkid
mount /dev/mapper/vg-root /root 2>&1 || echo 挂载失败能挂上就说明数据没事,问题在引导链;挂不上则要怀疑文件系统损坏,走 fsck。
现象三:完全没有输出。这时只能走带外管理或救援盘。云主机用控制台进 rescue 模式,物理机用 Live USB 挂载原系统后 chroot 修复。这一类故障的修复时间通常以小时计,这也正是为什么第一步要确认「有没有带外管理」。
六、升级之后的两件收尾工作
清理旧内核,但别清太干净。`/boot` 分区通常只有 512MB,积累几个内核就满了,满了会导致下一次升级失败。保留当前内核和上一个可用的内核,其余删掉:
dpkg -l | awk '/^ii linux-image-[0-9]/ {print $2}'
apt purge linux-image-5.10.0-20-amd64 # 例:删掉确定不用的旧版删之前务必确认留下的那个版本在 GRUB 菜单里,并且 `ls /boot` 能看到它的 `vmlinuz` 和 `initrd.img` 两个文件。
确认 DKMS 模块已为所有内核编译。`dkms status` 的输出里,每个模块后面都应该有 `installed`,如果某个模块只对新内核编译成功、旧内核显示 `built` 但未安装,那么回退到旧内核时该模块就不可用,回退等于失败。
七、小结
内核跨大版本升级的风险不在升级本身,而在「升级之后起不来、又没法现场处理」。把顺序理清楚就能大幅降低风险:先确认带外管理和引导方式,再确认模块和文件系统兼容,备份能回退的状态,按最小集合分步升级,重启前 dry-run 一次 initramfs,重启后立刻五项验证。真正需要记住的只有一条:不要在没有回退路径的情况下重启。只要旧内核还在、GRUB 还能选、带外管理还能进,出多大的问题都只是时间成本。