btrfs fi du:几组共享范围

btrfs fi du:几组共享范围

我在 btrfs 文件系统的各个目录中有很多文件。它们都是相同的,有些可能是使用“旧式”完整副本创建的,有些是克隆的(cp --reflink)。我想知道是否有任何非克隆的。

在某些情况下,可能会有旧式副本的克隆,请参见cp下面的示例。在这种情况下, 的输出btrfs fi du毫无帮助:所有文件都0.00B在 列中Exclusive,并且 列中有一些内容Set shared。但不一定共享集。所以我无法btrfs fi du区分它们。我该怎么做?


我认为这还不够详细,难以理解(但我想先提出这个问题),所以这里有一个更详细的例子。假设我有两对文件;每对文件的成员都是克隆。换句话说,我这样做了:

dd if=/dev/urandom of=a1 count=1 bs=1M
cp --reflink=always a1 a2
cp --reflink=never a1 b1
cp --reflink=always b1 b2

当然,这些文件将占用磁盘上的 2MB 空间(每个 x2 与 x1 共享其范围)。

我可以使用btrfs fi du .(最后一行)看到这一点

     Total   Exclusive  Set shared  Filename
   1.00MiB       0.00B           -  ./a1
   1.00MiB       0.00B           -  ./b1
   1.00MiB       0.00B           -  ./a2
   1.00MiB       0.00B           -  ./b2
   4.00MiB       0.00B     2.00MiB  .

但是,我无法通过以下方式看到它btrfs fi du *

     Total   Exclusive  Set shared  Filename
   1.00MiB       0.00B     1.00MiB  a1
   1.00MiB       0.00B     1.00MiB  a2
   1.00MiB       0.00B     1.00MiB  b1
   1.00MiB       0.00B     1.00MiB  b2

这里,我没有最后一行。我无法区分这种情况(两对)和所有四个文件都在一个共享集中的情况(换句话说,cp a1 a2; cp a1 b1; cp a1 b2所有文件都带有--reflink=always);输出将完全相同。

显然,如果所有这些文件都在同一个目录中,我只需使用fi du .。但如果它们在不同的目录中,我就无法做到这一点。我如何才能获得“最后一行”来告诉我它是单个共享集还是多个单独的共享集?

答案1

显然,如果所有这些文件都在同一个目录中,我只需使用fi du .。但如果它们在不同的目录中,我就无法做到这一点。我如何才能获得“最后一行”来告诉我它是单个共享集还是多个单独的共享集?

使它们位于同一目录中。

  1. 创建一个临时目录。
  2. ln将所有相关文件添加到目录中(即创建硬链接)。可能会出现名称冲突,您可能需要将一些文件链接到修改后的名称。
  3. btrfs fi du .在目录中运行。
  4. 删除目录内的所有文件以及目录本身。

相关内容