Linux那個很強大、卻被懷疑不太穩定的文件系統就它了?btrfs文件系統兩種功能初探
網友在上文熱議的btrfs的種種不良印象,跟我之前使用中似乎不一樣,我覺得btrfs有很多亮點、很強大,它是近些年推出的優秀的文件系統。SUSE 的開發者曾為 Linux 6.0 內核更新了 Btrfs 文件系統,使得工作負載的吞吐量提高了 3 倍。而 Linux 6.3 內核中包含了Btrfs的大量更新和性能優化 ,據說最高可以提升 10 倍。
本文和大家一起探索下btrfs的部分功能。
Btrfs(B-tree File System)是一種開源的文件系統,最初由 Oracle 開發,并于 2009 年首次發布。它是一種支持寫入時復制(COW,copy on write)的文件系統,被廣泛運用于各種 Linux 操作系統之中,目標是取代 ext3 文件系統,改善 ext3 的限制。
雖然 Btrfs 已經得到了廣泛的應用和支持,但目前并沒有任何主流的 Linux 發行版將其作為默認文件系統。一些 Linux 發行版已經將 Btrfs 作為可選的文件系統提供給用戶,例如 Fedora、Ubuntu、openSUSE、Debian 等。這些發行版通常會在安裝過程中提供選擇 Btrfs 作為文件系統的選項,或者在系統安裝后通過命令行或圖形界面工具進行轉換。
需要注意的是,雖然 Btrfs 具有一些先進的功能和特性,但它仍然是一種相對較新的文件系統,可能存在一些穩定性和兼容性問題。因此,在選擇使用 Btrfs 作為文件系統時,建議您仔細評估其優缺點,并根據自己的需求和風險承受能力做出選擇。以下為演練操作,建議在虛擬機環境下演練。
環境說明
由于btrfs的一些功能在不同版本推出,所以這里有必要先聲明所用的btrfs環境信息。
- 系統為Ubuntu 22.04 64位(Btrfs在Centos7、Deepin等發行版也支持)。
- btrfs版本 btrfs-progs v5.16.2。
- 現有存儲設備情況
# ls /dev/sd*
sda sda1 sdb sdc
#
其中 /dev/sdb 和 /dev/sdc 是2塊均為2T的物理硬盤,未格式化。將用于創建btrfs文件系統。
以下是基于 /dev/sdb和/dev/sdc 硬盤創建支持快照、數據壓縮、只讀文件系統等特性的 Btrfs 文件系統的步驟:
(1) 確保系統中安裝了 Btrfs 工具:
# sudo apt update
# sudo apt install btrfs-progs
# sudo btrfs --version
btrfs-progs v5.16.2
(2) 查詢當前有哪些btrfs分區:
# sudo btrfs filesystem show
由于未建立任何btrfs分區,所以顯示為空。
(3) 創建 Btrfs 文件系統:
# sudo mkfs.btrfs -m raid1 /dev/sdb /dev/sdc
上述命令將使用 RAID1 模式創建一個 Btrfs 文件系統,其中 /dev/sdb 和 /dev/sdc 是使用的兩塊物理硬盤。
查看創建的btrfs:
# sudo btrfs filesystem show
Label: none uuid: 3b9d76ac-c675-404e-8f99-e13d5420eb0c
Total devices 2 FS bytes used 256.00KiB
devid 1 size 2.00TiB used 1.02GiB path /dev/sdb
devid 2 size 2.00TiB used 1.01GiB path /dev/sdc
(4) 掛載 Btrfs 文件系統:
# sudo mount /dev/sdb /mnt/
上述命令將 Btrfs 文件系統(設備路徑 /dev/sdb)掛載到 /mnt 目錄。以上改成使用
# sudo mount /dev/sdc /mnt/
的結果一樣的,在btrfs的體系下,btrfs的成員存儲設備每個都可以作為同等地位的掛載來源。所以用兩塊硬盤中的任意一塊的地址都可以。
使用 df 查看最新的文件系統情況:
# df -lh
可看到/mnt對應的空間容量有4TB:
# mount /dev/sdb /mnt
# df -lh
Filesystem Size Used Avail Use% Mounted on
tmpfs 546M 1.3M 545M 1% /run
/dev/sda1 2.0T 9.7G 1.9T 1% /
tmpfs 2.7G 4.0K 2.7G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 546M 76K 546M 1% /run/user/1000
/dev/sdb 4.0T 4.0M 4.0T 1% /mnt
配置 Btrfs 文件系統的子卷:
# sudo btrfs subvolume create /mnt/@home
# sudo btrfs subvolume create /mnt/@snapshots
# sudo btrfs subvolume create /mnt/@backup
上述命令創建了三個子卷:@home、@snapshots 和 @backup。您可以根據需要創建更多的子卷。@
符號后的是子卷名稱。三個子卷在文件系統目錄下。
(6) 配置子卷的屬性:
# sudo btrfs property set /mnt/@home compression lzo
# sudo btrfs property set /mnt/@snapshots ro true
上述命令將 @home 子卷的壓縮算法設置為 lzo,并將 @snapshots 子卷設置為只讀,由于作為快照用途,為了保護快照不被篡改可以設置快照子卷為只讀(這個功能在防止勒索病毒破壞的情況下非常有用)。
目前不建議馬上執行上面第2句命令。如果你已執行,可繼續執行下面命令將其設置為可讀寫:
# sudo btrfs property set /mnt/@snapshots ro false
既然有set,就有get,我們要查看btrfs的子卷的屬性,則只需將set改為get,
# sudo btrfs property get /mnt/@snapshots
輸出顯式了該子卷當前的屬性:
ro=false
就獲取到了子卷 @snapshots 的狀態,目前為可讀寫權限。
關于btrfs的peroperty支持哪些參數,可在閑時進一步閱讀btrfs子卷的 property 支持的參數列表,官網文檔鏈接[1]我們繼續測試btrfs的 快照功能。
(7) 啟用 Btrfs 文件系統的快照功能:
快照簡單的來說就是一個子卷,它使用 Btrfs 的 COW 功能與其他子卷共享其數據和元數據。
快照占用的空間將隨著原始子卷或快照本身(如果它是可寫的)的數據變化而增加。子卷中已添加/修改的文件和已刪除的文件仍然存在于快照中。這是一種方便的增量備份方式,快照 home-2023-12-04-1 生成后發生的任何文件變化,就被作為下一次快照home-2023-12-04-2需要保存的增量數據,如此不斷增量備份。下面對此加以演示說明:
# sudo btrfs subvolumn snapshot /mnt/\@home /mnt/\@snapshots/home-2023-12-04-1
上述命令創建了 @home 子卷的快照,位置在日期名稱的路徑下。此時/mnt/\@home 目錄內沒有任何文件,所以快照 /mnt/\@snapshots/home-2023-12-04-1 里也沒有任何文件。
然后復制 /etc/fstab文件到 子卷 @home 里:
# cp /etc/fstab /mnt/\@home
再快照為 /mnt/\@snapshots/home-2023-12-04-2:
# sudo btrfs subvolumn snapshot /mnt/\@home /mnt/\@snapshots/home-2023-12-04-2
此時查看新快照內的文件情況:
# ls /mnt/\@snapshots/home-2023-12-04-2
結果顯示有個 fstab 文件。而老快照仍沒有文件。
# ls /mnt/\@snapshots/home-2023-12-04-1
說明 兩個快照確實是不同時刻的文件系統快照,效果符合預期。
現在,您已經成功創建了一個支持快照、數據壓縮和只讀等特性的 Btrfs 文件系統。您可以根據需要在子卷中存儲不同類型的數據,并使用 Btrfs 的管理命令進行管理和操作。
(8) 卸載 Btrfs 文件系統:
# sudo umount /dev/sdb
或:
# sudo umount /dev/sdc
上述命令將 Btrfs 文件系統從掛載的 /mnt 目錄卸載。之所以能用 sdb和sdc 都能卸載,道理跟第4. 掛載 Btrfs 文件系統掛載時用這兩個一樣。以上改成使用:
# sudo umount /mnt
也是同樣效果。這與linux系統格式的文件系統的卸載是同樣道理。
一個心照不宣的秘密,其實你可以更自由地給 子卷名起名:
最后不得不提到一個你可能一直覺得不爽的點:為什么btrfs子卷名稱前面要以@開始?如果訪問btrfs的子卷的時候每次都得用反斜杠轉義后才能訪問路徑(shell里不寫轉義@的形式還會報錯提示說路徑不存在),覺得很麻煩吧?但似乎網上很多教程都會以@作為快照名稱開頭?
其實你在第5. 配置 Btrfs 文件系統的子卷時,也可以省略@,那么子卷的名稱就是home,snapshot 等,后續的命令中也就不帶@范圍子卷。
之所以 btrfs 的很多教程里都會用@ 作為子卷名稱開頭,是約定俗成,為了表示與普通目錄名稱產生視覺區別,僅此而已( 假設 /mnt/目錄下 既有子卷名、又有普通目錄名的時候,就難以區分哪個是子卷)。
本文就最近熱議的分區話題,評論區提到的btrfs的一些實例演示。希望對未接觸過btrfs使用的小伙伴有所幫助。
參考資料:[1]btrfs子卷的 property 支持的參數列表,官網文檔鏈接: https://btrfs.readthedocs.io/en/latest/btrfs-property.html
轉載自微信公眾號【深入理解Linux】,二維碼如下