即使确实有可用空间,我也需要btrfs balance
在我的单设备文件系统上运行ENOSPC
。
为什么需要运行这个?
余额实际上有什么作用?
与大多数传统文件系统不同,BTRFS 使用两阶段分配器。第一阶段为特定类型的数据分配称为块的大空间区域,然后第二阶段在这些更大的区域内像常规文件系统一样分配块。有三种不同类型的块:
数据块:这些存储常规文件数据。
元数据块:这些存储有关文件的元数据,其中包括时间戳、校验和、文件名、所有权、权限和扩展属性。
系统块:这是一种特殊类型的块,用于存储有关所有其他块所在位置的数据。
只有为该块分配的数据类型才能存储在该块中。如今,当您在 BTRFS 上遇到 -ENOSPC 错误时,最常见的情况是文件系统已用完现有块中的数据或元数据空间,并且无法分配新块。您可以通过btrfs fi df
在引发错误的文件系统上运行来验证是否是这种情况。如果 Data 或 Metadata 行显示的 Total 值与 Used 值显着不同,则这可能是原因。
什么btrfs balance
是通过分配器将事物发送回,这会导致压缩块中的空间使用。例如,如果您有两个都 40% 已满的元数据块,则平衡将导致它们成为一个 80% 已满的元数据块。通过像这样压缩空间使用,平衡操作能够删除现在空的块,从而为新块的分配腾出空间。如果您btrfs fi df
在运行 balance 后再次运行,您应该看到 Total 和 Used 值彼此更接近,因为 balance 删除了不再需要的块。