Ubuntu/Debian 默认不自动删除旧内核,因需保留至少一个备用内核防启动失败;apt autoremove 仅清理被标记为自动安装且无依赖的包,而旧内核常被 meta 包依赖,故需手动确认后执行 apt purge 并 update-grub。

为什么 apt autoremove 不删旧内核?
Ubuntu/Debian 系统默认不会自动清理旧内核,哪怕你跑过 apt autoremove。原因很实在:系统要留至少一个备用内核,防止新内核启动失败——这是安全策略,不是 bug。
但问题在于,这个“留一个”的逻辑有时失效:比如你手动装过多个内核、升级中断过、或 /boot 分区太小(常见于 512MB 或更小的分区),就容易卡住更新,报错 Not enough space in /boot。
-
apt autoremove只清理被标记为“自动安装且不再被依赖”的包,而旧内核常被linux-image-generic这类 meta 包间接依赖,没被标记为可删 - 真正生效的是
apt-get autoremove --purge,但必须先确认哪些内核确实不用了,否则可能删掉正在运行的内核 - 别信“删所有非当前内核”这种脚本,
uname -r返回的才是当前运行内核,其他未必都安全可删
怎么安全列出并删除旧内核?
先看清楚自己在用哪个内核、哪些是真旧的,再动手。别跳过这步,误删 linux-image-5.15.0-xx-generic 导致无法启动的事真发生过。
- 查当前内核:
uname -r - 查已安装的所有内核:
dpkg --list | grep 'linux-image-[0-9]' | awk '{ print $2 }' | sort -V - 只保留最新两个(含当前):比如当前是
6.5.0-1020-oem,那6.5.0-1018可留,6.2.0-36-generic就该删 - 批量卸载(示例删两个旧版):
sudo apt purge linux-image-6.2.0-36-generic linux-modules-6.2.0-36-generic - 执行后必须跑
sudo update-grub,否则重启进不了系统
/boot 分区只剩几十 MB 怎么办?
这时候 apt 命令会直接失败,提示 Unable to install new kernel: Not enough space。得先腾出一点空间,才能继续清理。
- 先删旧内核的
vmlinuz和initrd.img文件(仅临时救急):sudo rm /boot/vmlinuz-5.4.0-42-generic /boot/initrd.img-5.4.0-42-generic—— 注意:这只是删文件,对应包仍存在,后续要补apt purge,否则apt autoremove会报错 - 检查
/boot下残留的abi-、config-、System.map-文件,它们也按内核版本命名,一并删掉(和上面删的版本号一致) - 别碰
/boot/grub里的东西,尤其是grub.cfg;也别删efi/下的文件(UEFI 系统) - 腾出 100MB 后,立刻运行
sudo apt autoremove --purge+sudo update-grub,把状态拉回正常
CentOS/RHEL 用 dnf 清理的坑
Red Hat 系发行版逻辑不同:它靠 installonly_limit 控制最多保留几个内核,默认是 3。但很多人改过这个值,或用过 yum 时代遗留的包,导致规则失效。
- 查当前设置:
dnf versionlock list | grep kernel或看/etc/dnf/dnf.conf里的installonly_limit= - 删旧内核命令是:
sudo dnf remove $(dnf repoquery --installonly --latest-limit=-2 -q)—— 这条会留最新两个,删其余 - 如果报错 “no matches found”,说明系统里有非 installonly 类型的 kernel 包(比如手动 rpm -i 装的),得单独
dnf remove kernel-4.18.0-305.19.1.el8_4.x86_64 -
grubby --default-kernel必须指向还在磁盘上的内核路径,删完记得验证,否则下次重启可能 fallback 到不存在的 kernel
最麻烦的其实是双系统或 LVM+UEFI 环境,/boot 在独立分区但挂载点被覆盖、或 /boot/efi 权限异常——这种时候 df 和 ls 看起来有空间,实际写不进去。得盯紧 df -h /boot 和 mount | grep boot 的输出。











