Bcachefs

出自 Arch Linux 中文维基

Bcachefs 是新一代的寫時複製(CoW)文件系統,旨在提供類似 BtrfsZFS 的功能,同時讓代碼更簡潔,文件系統更穩定、速度更快,以及使用 GPL 兼容的許可證。

Bcachefs 基於 Bcache,兩者都主要由 Kent Overstreet 開發。

安裝[編輯 | 編輯原始碼]

自 2024 年 1 月內核發佈 6.7 版本起,Bcachefs 已被合併到上游,因此可以直接安裝 linux 或是 linux-zen 來使用。其他的內核軟件包可能基於低於 6.7 版本的內核,所以可能會需要額外的補丁才能使用 Bcachefs。

bcachefs-tools 是 Bcachefs 用戶空間的工具。

配置[編輯 | 編輯原始碼]

單盤[編輯 | 編輯原始碼]

# bcachefs format /dev/sda
# mount -t bcachefs /dev/sda /mnt

多盤[編輯 | 編輯原始碼]

與 RAID0 類似,Bcachefs 默認會將數據條帶化存儲 (stripe)。數據冗餘由 replicas 選項進行處理。 對 2 個存儲設備使用 --replicas=2 相當於 RAID1,對 4 個存儲設備使用 --replicas=2 相當於 RAID10,以此類推。

# bcachefs format /dev/sda /dev/sdb --replicas=n
# mount -t bcachefs /dev/sda:/dev/sdb /mnt

Bcachefs 支持混合使用不同的儲存設備。如果儲存設備的大小不同,為了讓每個儲存設備以相同的速率填滿數據,文件系統在某些儲存設備上會使用更大的條帶。如果儲存設備的速度不同,對冗餘數據的讀取請求會被發往 IO 延遲最低的設備。如果有些儲存設備比其他更可靠(例如硬件 RAID),可以通過 --durability=2 device 來把上面的每份數據副本算成兩份。

SSD 緩存[編輯 | 編輯原始碼]

Bcachefs 有三個儲存目標(storage targets): background、foreground 和 promote。對文件系統進行的寫入優先使用 foreground,然後隨着時間推移移動至 background。對文件系統的讀取會緩存在 promote 上。

注意: 這只是對一個單一儲存池而言的優先級。如果 foreground 滿了,則系統會直接向 background 寫入,或者如果兩個都滿了則會試着寫入 promote。文件系統的元數據會優先寫入 foreground,但也有可能會寫入三個目標中的任意一個。在移除緩存設備時請小心,因為它們可能仍舊儲存了數據。請參見 #移除設備

推薦的一種配置是使用一組 SSD 作為 foreground 和 promote,使用一組 HDD 作為 background(也就是回寫緩存)。

# bcachefs format \
    --label=ssd.ssd1 /dev/sda \
    --label=ssd.ssd2 /dev/sdb \
    --label=hdd.hdd1 /dev/sdc \
    --label=hdd.hdd2 /dev/sdd \
    --label=hdd.hdd3 /dev/sde \
    --label=hdd.hdd4 /dev/sdf \
    --replicas=2 \
    --foreground_target=ssd \
    --promote_target=ssd \
    --background_target=hdd
# mount -t bcachefs /dev/sda:/dev/sdb:/dev/sdc:/dev/sdd:/dev/sde:/dev/sdf /mnt

如果想配置直寫緩存,和上面操作基本一致,不過要對每個 SSD 設備設置 --durability=0 device。 如果想配置繞寫緩存,只需把 HDD 設為 foreground,把 SSD 設為 promote。

配置[編輯 | 編輯原始碼]

這篇文章的某些內容需要擴充。

原因: 缺少應該使用什麼選項的細節。 (在 Talk:Bcachefs 中討論)

大多數選項都可以在使用 bcachefs format 格式化時,在掛載時 (mount -o option=value),或是通過 sysfs (echo X > /sys/fs/bcachefs/UUID/options/option) 設置。格式化時的設置與通過 sysfs 更改的設置會被保存到文件系統的超級塊中,成為設備的默認選項。掛載時的選項會覆蓋這些默認值。

注意: 要使用 sysfs 必須先掛載文件系統。除了 fsck 以外,所有的操作都可以在文件系統掛載狀態下進行。
  • 數據校驗和 (data_checksum)、元數據校驗和 (metadata_checksum),可選:none、crc32c、crc64、xxhash
  • 前台壓縮 (compression)、後台壓縮 (background_compression),可選:none、lz4、gzip、zstd
  • 存儲組配置:foreground_target、background_target、promote_target

以下內容可以通過 bcachefs setattr file --option=value 按每個文件或目錄進行設置:

  • 數據冗餘數 (data_replicas)
  • 數據校驗和 (data_checksum)
  • 前台壓縮 (compression)、後台壓縮 (background_compression)
  • 存儲組配置:foreground_target、background_target、promote_target
注意: 目前儲存設備用量顯示的是未壓縮時的大小。除此之外,壓縮功能一切正常。

更改設備所屬儲存組[編輯 | 編輯原始碼]

# echo group.drive_name > /sys/fs/bcachefs/filesystem_uuid/dev-X/label
注意: 需要重新掛載才能生效。

添加設備[編輯 | 編輯原始碼]

# bcachefs device add --label=group.drive_name /mnt /dev/device

若這是某儲存組中的第一個設備,則需要修改儲存目標的設置才能使用。以下例子添加了一個緩存設備。

# echo new_group > /sys/fs/bcachefs/filesystem_uuid/options/promote_target
# echo new_group > /sys/fs/bcachefs/filesystem_uuid/options/foreground_target
# echo old_group > /sys/fs/bcachefs/filesystem_uuid/options/background_target
注意: 只有新的寫入會被分散到新添加的設備中去。已經寫入的內容不會改變,除非儲存設備的佔用達到一個閾值,從而觸發重新平衡(rebalance/restripe)。目前無法手動觸發重新平衡。

移除設備[編輯 | 編輯原始碼]

首先請確保至少設備上有兩份元數據(設備移除(evacuate)功能似乎對元數據不奏效)。如果數據和元數據都已經有冗餘了,可以跳過這一步。

# echo 2 > /sys/fs/bcachefs/UUID/options/metadata_replicas
# bcachefs data rereplicate /mnt
# bcachefs device set-state device readonly
# bcachefs device evacuate device

若想移除設備:

# bcachefs device remove device
# bcachefs data rereplicate /mnt

提示和技巧[編輯 | 編輯原始碼]

這篇文章的某些內容需要擴充。

原因: 關於自動掛載的內容可能會有些用處。 (在 Talk:Bcachefs 中討論)

請查看 Systemd/Journal 以獲取更多有用的錯誤信息。

故障排除[編輯 | 編輯原始碼]

32 位程序無法查看目錄內容[編輯 | 編輯原始碼]

部分 32 位程序可能無法獲取 Bcachefs 目錄中的內容,這是由於執行 readdir(3) syscall 時文件系統返回的數據不兼容所導致。[1]

要解決這個問題,可以暫時使用不同的文件系統供程序讀寫,比如 tmpfs

另請參閱[編輯 | 編輯原始碼]