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


11

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

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


2
我希望您知道,btrfs.wiki.kernel.org / index.php / Btrfs_mailing_list可能是一个更好的地方,可以询问有关btrfs(或任何其他内核组件)内部工作的问题。如果您得到答案,也请在此处发布。我自己对此很好奇。
亚当·里奇科夫斯基

1
您说:“根据我的经验,实际上删除子卷并询问可用空间都非常快”。删除子卷时,实际上只是子卷标记为要删除,实际上只有在有时间时才释放这些块(这是您执行此操作时“ no-commit”消息的含义),所以不,删除不是一定非常快。
etskinner '17

Answers:


3

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.