人人都会AI编程

磁盘块、块组、碎片管理

更新时间:2026-07-12

文件系统并非直接逐字节地管理磁盘,而是将磁盘空间按固定大小的“块”来组织。这种设计在性能和管理复杂度之间取得了平衡,是理解磁盘性能、空间浪费和碎片问题的关键。

1. 磁盘块:一次 I/O 的最小单位

块是文件系统分配空间和读写磁盘的基本单位。假如块大小为 4KB,哪怕要存储的文件只有 1 字节,它也会占用一整个块剩下的空间不能再分给其他文件(这些剩余空间被浪费的部分称为内部碎片)。块大小的选择是一个权衡:

  • 块太大:读写大文件效率高(减少寻址次数),但小文件多时会严重浪费空间;
  • 块太小:节省空间,但元数据(记录每个块用在哪)本身会膨胀,读写时也需要更多次 I/O。

现代 Linux 的 ext4 等文件系统默认块大小通常为 4KB,同时在格式化时也可以指定为 1KB、2KB 等。日常使用中,保持默认值就是对多数场景的合理适配。

2. 块组:把磁盘切分成可管理的“段落”

为了避免整个文件系统的元数据堆积在一处造成瓶颈,ext 系列文件系统将整个分区划分为若干大小相等的块组。每个块组都包含:

  • 本组块位图(标记哪些块已用、哪些空闲);
  • inode 位图(标记哪些 inode 已用);
  • inode 表(存放文件属性、权限、数据块指针等);
  • 数据块区域(真正存放文件内容的地方)。

这种设计的最大好处是数据局部性。文件系统在分配一个文件的 inode 和它的数据块时,会尽量把它们放在同一个块组中,使得读取文件时磁头不需要在磁盘两头来回飞奔,从而显著提升读写速度。对于今天的固态硬盘,虽然不存在物理磁头寻道,但这种局部性仍然有助于减少逻辑地址跳跃、提升缓存效率。

3. 碎片管理:从“事后整理”到“预分配优化”

磁盘碎片是指文件的数据块在磁盘上不连续存放,导致读写时磁头需要频繁移动。传统上,这是 HDD 时代令人头疼的性能杀手。ext2/ext3 等早期文件系统确实会产生碎片,尤其是在磁盘快满时,因此存在 e2fsprogs 这类离线碎片整理工具。

但 ext4 及更现代的文件系统已经引入了多方面的策略来预防碎片

  • 多块分配:当为正在写入的文件分配新块时,一次性预留 8KB、128KB 甚至更大的连续区段,而不是一个块一个块地随机分配,这样大文件就更容易落在连续的磁盘空间上。
  • 延迟分配:当应用调用 write() 时,内核先只将数据暂存在缓存中,并不立刻决定写到磁盘的哪个位置。等到实际刷新到磁盘前,缓冲区中积攒了足够的待写入数据,文件系统就能更明智地规划出一个连续布局。
  • 在线碎片整理:ext4 允许在挂载状态下整理单个文件或整个文件系统的碎片(e4defrag),不需要卸载系统或进维护模式,这对服务器非常友好。

对于多数现代 Linux 桌面和服务器,只要磁盘使用率没有长年保持在 95% 以上,碎片就几乎不是需要手动关注的问题。固态硬盘(SSD)更进一步,因为其电子寻址原理对物理连续性几乎无感,但逻辑上过度的碎片化仍可能增加元数据开销,所以文件系统的这些预防策略在 SSD 上同样有益。

实用要点总结

  • 块大小在你格式化分区时就已经决定,用默认 4KB 通常最优;
  • 块组是你无法直接感知但影响性能的底层结构,保持分区容量在合理范围(如不超过几十 TB)有助于维持良好的块组布局;
  • 正常使用场景下,你不需要定期手动整理碎片,更不需要盲目照搬 Windows 时代的“碎片整理”习惯。把注意力放在保持磁盘有一定空闲空间(建议 10%-20% 以上)和定期备份上,更为实际。