可行但须避开当前内核并至少保留两个版本:先用uname -r确认运行中内核,再用dpkg --list | grep 'linux-image-.*-generic'列出所有已装内核,接着sudo apt purge成套删除旧内核镜像、头文件及模块,最后执行sudo apt autoremove --purge清理残留并手动验证/boot和GRUB菜单。

直接删掉旧内核是可行的,但必须避开 uname -r 显示的当前运行内核,且至少保留两个已安装版本——否则下次重启可能进不了系统。
怎么确认哪些内核能删、哪些绝对不能动
误删正在运行的内核会导致无法启动,所以第一步永远是核对当前版本和所有已装版本:
-
uname -r—— 输出当前运行的内核(比如6.5.0-41-generic),这个版本绝不能删 -
dpkg --list | grep 'linux-image-.*-generic'—— 列出所有已安装的镜像包,注意状态为ii的才是真装了的 -
dpkg --list | grep 'linux-headers-.*-generic'—— 查头文件,通常和镜像一一对应,但有时会多出几个子包(如linux-headers-6.5.0-41-generic和linux-headers-6.5.0-41)
重点看版本号数字大小:最新版一般排最前或最末(取决于排序方式),挑比当前内核老、且不是“上一个稳定版”的那些来删。例如当前是 6.5.0-41-generic,而你还有 6.5.0-37-generic 和 6.5.0-32-generic,后者更旧,优先删。
为什么只用 apt remove 会留一堆垃圾
apt remove 只卸载二进制,不清理配置和关联文件,/boot 里残留的 vmlinuz-*、initrd.img-* 依然占空间,甚至可能干扰下次内核更新。
- 必须用
apt purge,它会连配置文件一起删干净 - 要成套删:一个内核至少涉及
linux-image-*、linux-headers-*、linux-modules-*,缺一不可;否则/boot不会真正释放空间 - 如果系统有
linux-image-unsigned-*(常见于 6.0+ 内核),也得加进purge命令里,否则vmlinuz文件还在
示例命令:sudo apt purge linux-image-6.5.0-32-generic linux-headers-6.5.0-32 linux-modules-6.5.0-32-generic linux-image-unsigned-6.5.0-32-generic
apt autoremove --purge 看似省事,但容易漏掉什么
这个命令确实能自动识别并删掉“不再被依赖”的旧内核包,但它默认只清理 linux-image-* 和 linux-headers-* 的主包,常忽略以下残留:
- 单独安装的
linux-headers-*.generic子包(状态可能是rc,即配置已删但包记录还在) - 旧内核对应的
linux-firmware版本(虽然极少需要单独删) -
/lib/modules/下残留的模块目录(ls /lib/modules/对比dpkg --list结果就能发现)
所以跑完 apt autoremove --purge 后,建议再执行:sudo dpkg --purge $(dpkg -l | awk '$1=="rc"{print $2}')
清理那些“已卸载但配置残留”的包。
删完必须手动验证 /boot 和 GRUB 是否真干净
哪怕 apt purge 和 update-grub 都跑过了,/boot 分区仍可能卡着旧文件,导致下次 apt upgrade 失败(报空间不足)。
- 检查
/boot:ls -lh /boot/vmlinuz-* /boot/initrd.img-* /boot/System.map-* /boot/config-*
输出里只该出现你明确保留的那两三个内核版本,其他全删干净才算成功 - GRUB 菜单未必实时同步:
sudo update-grub必须手动再跑一次,别信“自动触发” - 重启后进 GRUB 高级选项,确认旧条目已消失——这是最终验证
最容易被忽略的是 /boot 下的 abi- 和 memtest86+ 相关文件,它们不随内核 purge 自动清理,但一般不影响启动,可暂不处理。


















