刪除 btrfs 子卷可以釋放多少空間?
如果我要刪除 Btrfs 磁碟上的一個(或多個)子卷(而不實際刪除它們),有什麼方法可以計算我將釋放多少空間?我知道“目前沒有程式碼可以幫你計算”,但你會怎麼做呢?
我也想知道為什麼他們說它會這麼慢?根據我的經驗,實際上刪除子捲和詢問可用空間都非常快,為什麼假設做同樣的事情會慢得多?
你應該看看
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
(只要重新掃描仍在執行,第一行中的警告就會出現。)
qgroup
Btrfs 自動為每個子卷創建一個。在這種情況下,有三個子卷 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(通常)中創建快照,則新創建的包含快照的子卷中的所有實際數據都與快照源共享。只有在源中更改或替換文件時,它才會指向不同的內容(範圍)。這使得評估刪除子卷時實際釋放多少空間變得非常困難,因為您必須考慮與其他子卷共享的所有空間。