有没有办法计算如果我删除 Btrfs 磁盘上的一个(或多个)子卷(而不实际删除它们),我将释放多少空间?我知道有“目前没有代码可以为您进行计算”,但是你会怎么做呢?
我也想知道为什么他们说会这么慢?根据我的经验,实际上删除子卷和询问可用空间都非常快,为什么假设做同样的事情会慢得多?
答案1
您应该查看btrfs quota
和btrfs qgroups
(配额组)。
基本上qgroups
完全按照您的要求进行,它们跟踪子卷分配了多少空间。要启用文件系统qgroup
的功能,btrfs
您必须
# btrfs quota enable /path/to/btrfs/filesystem
但是,在执行此操作之前被警告这会触发数据的完全重新计算qgroup
,这将需要一些时间,特别是对于具有许多子卷的大型文件系统。此过程在后台异步运行。您已经可以检查qgroups
with的状态
# 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。此外,qgroup
级别 0 上有一个特殊的子卷,其 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 中创建快照(通常),新创建的包含快照的子卷中的所有实际数据都将与快照源共享。仅当源中的文件被更改或替换时,它才会指向不同的内容(范围)。这使得评估删除子卷后实际上会释放多少空间变得非常困难,因为您必须考虑与其他子卷共享的所有空间。