如果我要删除Btrfs磁盘上的一个(或几个)子卷(而不实际删除它们),有什么方法可以计算出多少空间?我知道“目前没有代码可以为您进行计算”,但是您将如何进行呢?
我也想知道为什么他们这么说会这么慢?根据我的经验,实际上删除一个子卷并询问可用空间都非常快,为什么假设做同样的事情会那么慢呢?
如果我要删除Btrfs磁盘上的一个(或几个)子卷(而不实际删除它们),有什么方法可以计算出多少空间?我知道“目前没有代码可以为您进行计算”,但是您将如何进行呢?
我也想知道为什么他们这么说会这么慢?根据我的经验,实际上删除一个子卷并询问可用空间都非常快,为什么假设做同样的事情会那么慢呢?
Answers:
您应该查看btrfs quota
和btrfs qgroups
(配额组)。
基本上qgroups
完全按照您的要求进行操作,它们跟踪子卷分配了多少空间。要qgroup
为btrfs
文件系统启用功能,您必须
# btrfs quota enable /path/to/btrfs/filesystem
然而,在此之前这被警告,这将触发一个完整的重新计算qgroup
的数据,这将需要一段时间,特别是对于具有许多子卷大的文件系统。此过程在后台异步运行。你已经可以查询的状态qgroups
与
# btrfs qgroup show /path/to/btrfs/filesystem
这将为您提供如下输出:
WARNING: rescan is running, qgroup data may be incorrect
qgroupid rfer excl
-------- ---- ----
0/5 843.69GiB 61.91MiB
0/4881 811.06GiB 9.34GiB
0/7990 867.32GiB 329.91MiB
0/8400 867.17GiB 37.64MiB
(只要重新扫描仍在运行,第一行就会出现警告。)
Btrfs自动qgroup
为每个子卷创建一个。在这种情况下,存在三个子卷,其子卷ID为4881、7990和8400。正斜杠之前的部分是的级别qgroup
。每个子卷qgroup
都位于级别0上。此外,级别0上还有一个特殊的特殊对象qgroup
,该特殊对象始终具有ID 5,并与btrfs文件系统的根相对应。
对于qgroup
上面的每个输出,它显示了它引用了多少空间。这意味着相应的子卷包含的文件总大小等于显示的数字。
但是,由于快照和btrfs的写时复制特性,子卷可能共享文件。这意味着文件的内容(或实际上是范围)可以被多个子卷引用。这由第二个数字表示,该数字表示每个子卷专门分配了多少空间,并且不与任何其他子卷共享。如果删除子卷,则该空间实际上将被释放。
如果要了解删除多个子卷后将释放多少空间,可以使用上述级别。qgroups
是在一个层次结构组织和群组上部水平(大于0)聚集水平较低的信息。
因此,要找出如果删除子卷4881和7990(在上面的示例中)将释放多少空间qgroup
,请在级别1上创建一个新的(任意ID为0,但是您可以在此处选择所需的内容)
# btrfs qgroup create 1/0 /path/to/btrfs/filesystem
然后,将新创建qgroup
的父qgroups
卷分配给要删除的子卷的父卷
# btrfs qgroup assign 0/4881 1/0 /path/to/btrfs/filesystem
# btrfs qgroup assign 0/7990 1/0 /path/to/btrfs/filesystem
这将触发另一个重新扫描配额信息,这可能需要一段时间。如果完成,您现在发出
# btrfs qgroup show -p /path/to/btrfs/filesystem
您将得到如下输出:
qgroupid rfer excl parent
-------- ---- ---- ------
0/5 1.38TiB 2.51GiB ---
0/4881 1.11TiB 10.86GiB 1/0
0/7990 1.23TiB 502.41MiB 1/0
0/8400 1.34TiB 1.69GiB 1/0
1/0 1.51TiB 132.23GiB ---
(我添加了将-p
标志添加parent
到显示的父/子关系的列的标志qgroups
。)
现在,带有的行qgroup
1/0
告诉您要删除的两个子卷都引用了多少空间,更重要的是,它告诉您两个子卷专门分配了多少空间。这是删除两个子卷后将释放的空间量。
我也想知道为什么他们这么说会这么慢?
这是由于btrfs与快照一起写时复制的特性。如果在btrfs中创建快照(通常),则包含快照的新创建子卷中的所有实际数据将与快照源共享。仅当文件在源中被更改或替换时,它才指向不同的内容(范围)。这使得很难评估如果删除一个子卷将实际释放多少空间,因为您必须考虑与其他子卷共享的所有空间。