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