ENOSPC:为什么需要`btrfs balance`?它有什么作用?

Tom*_*ale 1 btrfs

即使确实有可用空间,我也需要btrfs balance在我的单设备文件系统上运行ENOSPC

为什么需要运行这个?

余额实际上有什么作用?

Aus*_*arn 9

与大多数传统文件系统不同,BTRFS 使用两阶段分配器。第一阶段为特定类型的数据分配称为块的大空间区域,然后第二阶段在这些更大的区域内像常规文件系统一样分配块。有三种不同类型的块:

  • 数据块:这些存储常规文件数据。

  • 元数据块:这些存储有关文件的元数据,其中包括时间戳、校验和、文件名、所有权、权限和扩展属性。

  • 系统块:这是一种特殊类型的块,用于存储有关所有其他块所在位置的数据。

只有为该块分配的数据类型才能存储在该块中。如今,当您在 BTRFS 上遇到 -ENOSPC 错误时,最常见的情况是文件系统已用完现有块中的数据或元数据空间,并且无法分配新块。您可以通过btrfs fi df在引发错误的文件系统上运行来验证是否是这种情况。如果 Data 或 Metadata 行显示的 Total 值与 Used 值显着不同,则这可能是原因。

什么btrfs balance是通过分配器将事物发送回,这会导致压缩块中的空间使用。例如,如果您有两个都 40% 已满的元数据块,则平衡将导致它们成为一个 80% 已满的元数据块。通过像这样压缩空间使用,平衡操作能够删除现在空的块,从而为新块的分配腾出空间。如果您btrfs fi df在运行 balance 后再次运行,您应该看到 Total 和 Used 值彼此更接近,因为 balance 删除了不再需要的块。