Btrfs

如何擴展 btrfs 元數據?

  • March 11, 2022

我的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 的樹遍歷長度,因為註釋可以包含更多“連結”。

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