删除 btrfs 子卷会释放多少空间?

删除 btrfs 子卷会释放多少空间?

有没有办法计算如果我删除 Btrfs 磁盘上的一个(或多个)子卷(而不实际删除它们),我将释放多少空间?我知道有“目前没有代码可以为您进行计算”,但是你会怎么做呢?

我也想知道为什么他们说会这么慢?根据我的经验,实际上删除子卷和询问可用空间都非常快,为什么假设做同样的事情会慢得多?

答案1

您应该查看btrfs quotabtrfs qgroups(配额组)。

基本上qgroups完全按照您的要求进行,它们跟踪子卷分配了多少空间。要启用文件系统qgroup的功能,btrfs您必须

# btrfs quota enable /path/to/btrfs/filesystem

但是,在执行此操作之前被警告这会触发数据的完全重新计算qgroup,这将需要一些时间,特别是对于具有许多子卷的大型文件系统。此过程在后台异步运行。您已经可以检查qgroupswith的状态

# 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 中创建快照(通常),新创建的包含快照的子卷中的所有实际数据都将与快照源共享。仅当源中的文件被更改或替换时,它才会指向不同的内容(范围)。这使得评估删除子卷后实际上会释放多少空间变得非常困难,因为您必须考虑与其他子卷共享的所有空间。

相关内容