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