必须先用 uname -r 和 grubby --default-kernel 双重确认当前运行内核,二者版本必须一致;再用 dpkg --list | grep 'linux-image-' | grep '^ii' 列出真正安装的内核包;删除后须手动清理 /lib/modules/、/usr/src/linux-headers- 及头文件包,并执行 update-grub 或 grub2-mkconfig 更新引导配置。

不能直接删 vmlinuz 文件,也不能只跑 apt autoremove 就完事——漏掉 /lib/modules/ 或没更新 GRUB 配置,/boot 空间照样不释放,启动菜单里旧内核也还在。
先确认当前运行的内核,别删错
这是所有操作的前提。执行 uname -r 输出的就是正在加载、正在用的内核,比如 6.8.0-52-generic,这个版本绝对不能删。光看这个还不够,再补一句:
-
grubby --default-kernel查 GRUB 默认项,输出路径如/boot/vmlinuz-6.8.0-52-generic - 两者必须一致;如果不一致,说明系统实际在跑旧内核,但你误以为它已下线——此时删最新版反而会让下次重启进不去系统
Debian/Ubuntu 怎么列出真正安装的内核包
dpkg --list | grep 'linux-image-' | grep '^ii' 才是可靠筛选方式。“^ii” 表示已安装且配置成功,排除了那些半途失败或仅解压未配置的残留包。注意这些变体也得纳入检查:
-
linux-image-extra-(老 Ubuntu 常见) -
linux-image-unsigned-(启用 Secure Boot 时安装) - 包名和
/boot/vmlinuz-文件名必须严格对应,可用ls /boot/vmlinuz-*交叉验证
常见错误是只查 dpkg,结果发现某个 linux-image-* 包早已卸载,但 vmlinuz 和 initrd.img 还占着 /boot 空间。
删完镜像后,这三类残留必须手动清
仅执行 apt purge linux-image-xxx 不等于释放全部空间。以下三类常被忽略:
- 头文件包:
sudo apt purge $(dpkg --list | grep 'linux-headers-' | awk '{print $2}' | grep -v "$(uname -r)") - 模块目录:
sudo rm -rf /lib/modules/6.5.0-44-generic(版本号替换成你要删的) - 源码头文件:
sudo rm -rf /usr/src/linux-headers-6.5.0-44-generic
这些不会被 apt autoremove 自动处理,不手动删,/boot 空间基本释放不了多少。
RHEL/CentOS/Fedora 删除旧内核的坑点
这类系统内核是 installonly 类型包,不能用 rpm -e 直接卸载。正确命令是:
- 保留最新 2 个,删其余:
dnf remove --oldinstallonly --setopt installonly_limit=2 kernel - 手动指定删某版:
dnf remove kernel-4.19.90-52.22.v2207.ky10.x86_64 - 删完必须立刻执行:
grub2-mkconfig -o /boot/grub2/grub.cfg—— 这是运维最常忽略的一步,不执行,旧内核仍会出现在启动菜单里
最麻烦的不是命令本身,而是路径匹配:/boot 下的文件名、rpm 包名、/lib/modules/ 目录名、grubby 输出的路径,四者必须版本完全一致,差一个字符都可能白忙活。











