Btrfs

刪除 btrfs 子卷可以釋放多少空間?

  • April 23, 2019

如果我要刪除 Btrfs 磁碟上的一個(或多個)子卷(而不實際刪除它們),有什麼方法可以計算我將釋放多少空間?我知道“目前沒有程式碼可以幫你計算”,但你會怎麼做呢?

我也想知道為什麼他們說它會這麼慢?根據我的經驗,實際上刪除子捲和詢問可用空間都非常快,為什麼假設做同樣的事情會慢得多?

你應該看看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

(只要重新掃描仍在執行,第一行中的警告就會出現。)

qgroupBtrfs 自動為每個子卷創建一個。在這種情況下,有三個子卷 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(通常)中創建快照,則新創建的包含快照的子卷中的所有實際數據都與快照源共享。只有在源中更改或替換文件時,它才會指向不同的內容(範圍)。這使得評估刪除子卷時實際釋放多少空間變得非常困難,因為您必須考慮與其他子卷共享的所有空間。

引用自:https://unix.stackexchange.com/questions/151541