如何擴展 btrfs 元數據?
我的
btrfs
元數據已滿。(我正在使用創建每小時快照btrbk
。)如何增加/擴展分配給
btrfs
文件系統元數據的空間?還是自動展開?
TL;DR 元數據(如果 btrfs 沒有遭受一般空間不足的情況)將自動增加。在不存在未分配的可用空間的情況下,自動增加被限制。但是,如果
btrfs
分配的數據部分的空間超過了它需要的空間,則可以重新分配它。這在 btrfs 中稱為balance
-ing。假設在 的備份塊設備上有足夠的未分配記憶體
btrfs
,那麼文件系統的元數據部分會自動分配記憶體 - 正如 OP 所假設的那樣 - 自動記憶體以增加/擴展元數據。因此,答案是:是的*(前提是不存在記憶體不足/可用空間不足的情況
btrfs
)*,那麼元數據將自動增加,如下所示:(1) 我們看一下 btrfs 的一些初始分配設置(在
40GB
設備上)$> btrfs filesystem df / Data, single: total=25.00GiB, used=24.49GiB System, single: total=32.00MiB, used=16.00KiB Metadata, single: total=1.55GiB, used=1.33GiB GlobalReserve, single: total=85.41MiB, used=0.00B
(2) 可以看出,文件系統中用於儲存元數據的分配空間是1.55GiB,其中1.33GiB,因此幾乎全部使用(這可能是在OP的情況下發生的情況)
(3) 我們現在增加要添加的元數據。為此,我們使用命令
--reflink=always
選項複製 /home 文件夾cp
。$> cp -r --reflink=awlways /home /home.copy
(4) 因為(因為我們假設 /home 中有很多文件),文件系統中添加了很多新數據,因為我們使用
--reflink
的確實很少或沒有額外的空間用於實際數據,所以它使用Copy-on-Write,機制。簡而言之,大部分元數據被添加到文件系統中。因此我們可以再看看$> btrfs filesystem df / Data, single: total=25.00GiB, used=24.65GiB System, single: total=32.00MiB, used=16.00KiB Metadata, single: total=2.78GiB, used=2.45GiB GlobalReserve, single: total=85.41MiB, used=0.00B
可以看出,在此使用的為 Metadata 分配的空間
btrfs
已自動增加擴展。由於這是自動進行的,因此使用者通常不會檢測到它。但是,在某些情況下,大多數情況下整個文件系統已經被填滿了。在這些情況下,
btrfs
可能會開始“卡頓”並且無法自動增加為元數據分配的空間。例如,原因可能是所有空間都已分配給元件(數據、系統、元數據、GlobalReserve)。令人困惑的是,可能還有明顯的空間。一個例子是這個輸出:$> btrfs filesystem df / Data, single: total=38.12GiB, used=25.01GiB System, single: total=32.00MiB, used=16.00KiB Metadata, single: total=1.55GiB, used=1.45GiB GlobalReserve, single: total=85.41MiB, used=0.00B
可以看出,系統所有
40GiB
,但分配有些偏離balance
,因為雖然仍有空間用於新文件的數據,但元數據(如在 OP 情況下)很低。btrfs
不再可能為支持文件系統的設備自動分配記憶體(只需將分配的總數相加,38.12G+1.55G+..~= 40GiB)。然而,由於分配給
data
文件系統部分的多餘可用空間,它現在很有用,需要平衡 btrfs。平衡意味著重新分配已經分配的空間。在 OP 的情況下,可以假設由於某種原因,
btrfs
分配的不同部分之間發生了不平衡。不幸的是,
sudo btrfs balance -dusage=0
原則上應該搜尋空塊(為數據分配)並將它們提供給更好的使用者(這將是元數據幾乎耗盡的空間)的簡單命令可能會失敗,因為找不到完全空的數據塊。
btrfs
開發者建議因此依次增加“何時應該重新排列數據塊以回收空間”的使用限制因此,如果結果
$> sudo btrfs balance -dusage=0 Done, had to relocate 0 out of 170 chunks
顯示沒有搬遷,應該做一些
$> sudo btrfs balance -dusage=5 Done, had to relocate 0 out of 170 chunks <--(again fail) $> sudo btrfs balance -dusage=10 Done, had to relocate 0 out of 170 chunks <--(again fail) $> sudo btrfs balance -dusage=15 Done, had to relocate 2 out of 170 chunks <--(success)
另一個答案暗示了節點大小的影響
btrfs
,這在一定程度上影響了元數據增加的速度。節點大小(如另一個答案中所述)僅在mkfs.btrfs
文件系統創建時設置一次。理論上,如果可以將節點大小更改為較低的值,則可以減小元數據的大小,如果可能的話(不是!)。然而,節點大小將無法以任何方式幫助擴展或增加分配的元數據空間。相反,它最初可能只是有助於節省空間。然而,較小的節點大小並不能保證減少元數據大小。實際上,某些情況可能表明較大的節點大小會減少 btrfs 的樹遍歷長度,因為註釋可以包含更多“連結”。