获取可能包含子卷的 btrfs 目录的大小

Pee*_*aha 5 btrfs

获取目录大小的常用方法是:

du -hs /path/to/directory
Run Code Online (Sandbox Code Playgroud)

但是,它不起作用,我怀疑这是 btrfs 问题。它报告带有子模块的子目录的大小大于磁盘本身的总大小。

但是,我可以使用 gnome disks 实用程序检查磁盘是否有 60% 以上是空的。

上通过改变进一步检查n

du -h --max-depth=n /path/to/folder
Run Code Online (Sandbox Code Playgroud)

我能够将大子目录大小缩小到 btrfs 子卷,这就是为什么我认为这个问题与子卷有关

Aus*_*arn 6

是的,这可能是 BTRFS 相关的问题。

作为一般规则,经典du对于 BTRFS 并不可靠,并且经常会给出这样看似荒谬的结果。这最终源于这样一个事实stat()du用于查看每个文件在磁盘上使用多少空间的系统调用)不知道或不关心引用链接、快照、透明压缩或 BTRFS 提供的几乎任何其他内容。标准 POSIX 语义。

这样做的影响是,du将通过 reflinks 计算文件之间共享的任何块(包括已被重复数据删除的任何块、由于使用克隆 ioctl 复制文件而共享的块,以及任何属于快照的一部分)对每个文件进行一次计数持有对该块的引用,因此du可以显示明显的磁盘使用量远大于实际空间使用量。

我建议使用btrfs filesystem du而不是du,因为它会正确计算所有共享空间的使用情况。

另请注意,GNOME 磁盘实用程序df在处理 BTRFS 时也不完全可靠,但出于不同的原因(它们正确解释了引用链接,但不了解 BTRFS 使用的两阶段分配器,因此它们实际上可以将磁盘报告为大多数即使您不能向其写入任何内容,也为空)。因此,它们通常会显示与du在文件系统的根目录上运行所获得的使用值不同的使用值。(如果您使用du -x,情况会更糟,因为这不会跨越子卷边界,因为它们看起来像安装点)。