1. /boot分区为什么总是不够用:先弄明白空间去了哪里
说实话,玩Linux这么久,我最怕的不是某个服务起不来,而是那种“一不小心就把系统搞进不去”的存储问题。/boot分区空间不足,看着不像大事,但真到内核升级失败、grub写不进新配置的时候,那叫一个难受。最近帮朋友处理一台服务器,/boot只有可怜的300MB,某次内核批量更新直接提示“磁盘空间不足”,新内核装不进去,旧内核又不敢乱删,整个系统卡在中间状态。这篇文章我就把/boot扩容这件事从头到尾梳理一遍,讲讲我踩过的坑、总结出来的方案,以及每一步背后的原因。
先说清楚/boot分区到底是干什么的。从Linux的启动流程来看,机器通电后BIOS/UEFI固件去读取启动设备,找到引导程序,比如GRUB2,再让GRUB加载内核镜像和initramfs到内存,最终把控制权交给操作系统。而/boot这个独立分区,就是专门存放这些启动所需的文件:vmlinuz(内核本体)、initramfs/initrd(初始内存盘)、grub配置目录、内核符号表System.map等。由于引导程序(尤其是传统BIOS+MBR模式下)对磁盘的访问能力有限,/boot放在磁盘靠前位置、保持小而规整,是历史遗留也是稳定性考量。
1.1 /boot分区到底存了些什么
你可以先在自己的机器上看看/boot目录的内容:
bash复制ls -lh /boot
我随便贴一份典型的输出:
bash复制total 120M
-rw-r--r-- 1 root root 47M May 10 10:00 vmlinuz-5.14.0-362.13.1.el9_3.x86_64
-rw-r--r-- 1 root root 62M May 10 10:00 initramfs-5.14.0-362.13.1.el9_3.x86_64.img
drwxr-xr-x 2 root root 4K May 10 10:00 grub2
-rw-r--r-- 1 root root 36M May 5 09:00 vmlinuz-5.14.0-362.8.1.el9_3.x86_64
-rw-r--r-- 1 root root 57M May 5 09:00 initramfs-5.14.0-362.8.1.el9_3.x86_64.img
你看,光是两套内核加上对应的initramfs,就已经轻松超过200MB。如果再算上grub2目录里的grub.cfg、字体文件、模块,以及可能存在的旧内核备份,一个500MB的分区装三套内核后就非常吃紧。这也是为什么很多发行版默认/boot只给200-500MB,平时够用,但只要内核频繁更新、又不及时清理旧版本,空间就会迅速告急。
initramfs是另一个“空间杀手”。这个文件本质上是启动时用到的临时根文件系统,里面打包了磁盘控制器驱动、文件系统驱动、lvm2工具、dm-crypt等模块。随着内核版本迭代,驱动模块越来越多、体积越来越大,initramfs从早期的十几MB膨胀到现在的50-80MB都很正常。如果你机器上有多个内核,每个内核都配一个50-80MB的initramfs,再叠加vmlinuz本体,空间消耗的速度远超你的直觉。
1.2 空间不足的常见触发场景
我见过太多人栽在这几个场景里:
第一个是长期不清理旧内核。CentOS/RHEL系默认不会自动删除旧内核,Ubuntu虽然偶尔会提示,但也不会主动清。系统更新三五次后,/boot里躺着四五套内核,分区直接爆掉。
第二个是一键更新工具或脚本没有判断空间。比如某些云平台的批量升级脚本,yum update或者apt upgrade时一口气下载了所有新内核,结果安装在写入/boot时发现空间已经满了,升级失败,系统处于“半更新”状态。这种状态最难收拾,因为包管理器可能已经改了部分依赖,你再手动装内核容易冲突。
第三个是恢复模式或救援模式产生的额外文件。比如你用grub2-mkconfig重新生成配置、手动把内核复制出来做备份、或者是某些安全加固脚本往/boot塞了额外的校验文件,都会加速空间消耗。
第四个容易被忽略的是/boot分区文件系统本身的特点。如果/boot用的是XFS,某些操作还涉及日志空间预留;如果是ext2/ext4,默认还会为root用户保留5%的空间(mke2fs的-m参数),300MB的分区实际可用可能只有285MB。你查df的时候看着数字还有几十MB,但真正写入大文件时却“No space left on device”,多半就是被这个保留块卡住了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 扩容前必做的准备:把系统状态摸清楚再动手
遇到/boot空间不足,我见过不少人上来就fdisk乱搞,最后把系统搞崩,只能重装。分区层面的操作,最忌讳“想当然”。动手之前,先花十分钟把现状彻底搞清楚,这一步做扎实了,后面90%的坑都能避开。
2.1 先用这几条命令确认现状
先看文件系统使用率:
bash复制df -hT /boot
-T可以显示文件系统类型,这非常重要。ext4和XFS的扩容命令完全不同,后面我会细说。
再看分区和磁盘的整体布局:
bash复制lsblk
lsblk输出会清晰展示磁盘、分区、LVM逻辑卷之间的层级关系。我建议重点关注/boot在哪个分区、这个分区的前后有没有空闲空间、后面的空间是属于哪块磁盘的。
然后用blkid确认所有分区的UUID和文件系统类型:
bash复制blkid
注意,/boot分区操作完之后,UUID不能变(用resize2fs、xfs_growfs扩展文件系统不会改变UUID),但如果你用GParted移动或
