許多 Linux 發行版安裝時會將 /boot 獨立分區(常見 500 MB~1 GB),隨著核心更新累積,舊版 vmlinuz、initrd.img、System.map 等檔案會佔滿空間,導致 apt upgrade 或 dnf update 失敗。本文以 Ubuntu/Debian 為例,示範如何安全移除舊核心並自動更新 GRUB 選單。
# 1. 查看 /boot 使用量
df -h /boot
# 2. 列出 /boot 內容
ls -lh /boot
# 3. 確認目前運行核心(絕勿移除)
uname -r
# 輸出範例:5.15.0-91-generic
# Debian/Ubuntu
dpkg -l 'linux-image-[0-9]*' | grep ^ii
# RHEL/CentOS/Fedora
rpm -qa kernel-core | sort -V
輸出範例(Ubuntu):
ii linux-image-5.15.0-88-generic 5.15.0-88.98 amd64 Linux kernel 5.15.0 on x86_64
ii linux-image-5.15.0-91-generic 5.15.0-91.101 amd64 Linux kernel 5.15.0 on x86_64
ii linux-image-generic 5.15.0.91.96 amd64 Generic Linux kernel image
# 假設當前為 5.15.0-91,決定保留 91 與 88,移除 86、87 等更舊版本
sudo apt-get purge linux-image-5.15.0-86-generic linux-image-5.15.0-87-generic
# 或一次移除多個(謹慎使用)
# sudo apt-get purge linux-image-5.15.0-{86,87}-generic
purge 會同時移除 /boot 對應檔案並觸發 update-grub 重建選單。
# 保留當前核心 + 最新 2 個,其餘全刪(Ubuntu/Debian)
current=$(uname -r | sed 's/-generic//')
dpkg -l 'linux-image-[0-9]*' | awk '/^ii/{print $2}' | grep -vE "$current|linux-image-generic" | sort -V | head -n -2 | xargs -r sudo apt-get -y purge
解析:
sort -V 版本號排序 → head -n -2 取倒數第三行以前(即保留最新兩個) → xargs -r 無輸入不執行。
df -h /boot # 確認可用空間增加
dpkg -l 'linux-image-[0-9]*' | grep ^ii # 僅剩預期版本
ls /boot/ # 檔案列表精簡
| 情況 | 處理方式 |
|---|---|
| 誤刪當前核心 | 立即重開機前先 sudo apt-get install --reinstall linux-image-$(uname -r);若已重開機進入 GRUB 救援模式,從 Live USB 掛載根分區 chroot 修復 |
套件狀態顯示 rc (residual config) | 執行 dpkg -l | grep ^rc | awk '{print $2}' | xargs sudo dpkg --purge 清理殘留設定檔 |
| GRUB 選單未更新 | 手動執行 sudo update-grub 或 grub2-mkconfig -o /boot/grub2/grub.cfg (RHEL系) |
| 使用 LVM/加密 /boot | 操作相同,但確保 /boot 掛載後再執行 |
# /etc/apt/apt.conf.d/01autoremove-kernels
APT::NeverAutoRemove {
// 保留當前與最新 2 個核心
"^linux-image-[0-9]+\\.[0-9]+\\.[0-9]+-[0-9]+-generic$";
};
APT::VersionedKernelPackages "linux-image linux-headers linux-modules";
搭配 sudo apt-get autoremove --purge 即可定期自動清理。
| 發布版 | 核心套件前綴 | 清理指令 | GRUB 更新 |
|---|---|---|---|
| Ubuntu/Debian | linux-image-* | apt-get purge linux-image-xxx | update-grub |
| RHEL/CentOS 7 | kernel-* | yum remove kernel-xxx | grub2-mkconfig -o /boot/grub2/grub.cfg |
| Fedora/RHEL 8+ | kernel-core-* | dnf remove kernel-core-xxx | grub2-mkconfig -o /boot/grub2/grub.cfg |
| Arch Linux | linux* | pacman -R linuxxxx | grub-mkconfig -o /boot/grub/grub.cfg |
定期清理 /boot 舊核心,配合 APT 自動移除策略,能徹底避免分區滿載導致系統無法更新,維持 Linux 系統長期穩定運行。