標籤:btrfs
btrfs簡介:
Btrfs(通常念成Butter FS),由Oracle於2007年宣布並進行中的COW(copy-on-write式)檔案系統。目標是取代Linux目前的ext3檔案系統,改善ext3的限制,特別是單一檔案大小的限制,總檔案系統大小限制以及加入檔案校正和特性。加入目前ext3/4未支援的一些功能,例如可寫的磁碟快照(snapshots),以及支援遞迴的快照(snapshotsof snapshots),內建磁碟陣列(RAID)支援,支援子卷(Subvolumes)的概念,允許線上調整檔案系統大小。
btrfs特性:
擴充性 (scalability) 相關的特性,btrfs 最重要的設計目標是應對大型主機器對檔案系統的擴充性要求。 Extent,B-Tree和動態 inode 建立等特性保證了 btrfs 在大型主機器上仍有卓越的表現,其整體效能而不會隨著系統容量的增加而降低。
其次是資料一致性 (dataintegrity) 相關的特性。系統面臨不可預料的硬體故障,Btrfs 採用 COW 事務技術來保證檔案系統的一致性。 btrfs 還支援 checksum,避免了 silent corrupt 的出現。而傳統檔案系統則無法做到這一點。
第三是和多裝置管理相關的特性。 Btrfs 支援建立快照 (snapshot),和複製 (clone) 。 btrfs 還能夠方便的管理多個物理裝置,使得傳統的卷管理軟體變得多餘。
最後是其他難以歸類的特性。這些特性都是比較先進的技術,能夠顯著提高檔案系統的時間 / 空間效能,包括延遲分配,小檔案的儲存最佳化,目錄索引等。
Btrfs使用方法:
建立檔案系統
mkfs.btrfs 命令建立一個 btrfs 格式的檔案系統。可以用如下命令在裝置 sda5 上建立一個 btrfs 檔案系統,並將其掛載到 /btrfsdisk 目錄下:
#mkfs.btrfs /dev/sda5
#mkdir /btrfsdisk
#mount – t btrfs /dev/sda5 /btrfsdisk
這樣一個 Btrfs 就在裝置 sda5 上建立好了。值得一提的是在這種預設情況下,即使只有一個裝置,Btrfs 也會對 metadata 進行冗餘保護。如果有多個裝置,那麼可以在建立檔案系統的時候進行 RAID 設定。詳細資料請參見後續的介紹。
這裡介紹其他幾個 mkfs.btrfs 的參數。
Nodesize 和 leafsize 用來設定 btrfs 內部 BTree 節點的大小,預設為一個 page 大小。但使用者也可以使用更大的節點,以便增加 fanout,減小樹的高度,當然這隻適合非常大的檔案系統。
Alloc-start 參數用來指定檔案系統在磁碟裝置上的起始地址。這使得使用者可以方便的預留磁碟前面的一些特殊空間。
Byte-count 參數設定檔案系統的大小,使用者可以只使用裝置的一部分空間,當空間不足時再增加檔案系統大小。
修改檔案系統的大小
當檔案系統建立好之後,可以修改檔案系統的大小。 /dev/sda5 掛載到了 /btrfsdisk 下,大小為 800M 。假如希望只使用其中的 500M,則需要減小當前檔案系統的大小,這可以通過如下命令實現:
#df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 101086 19000 76867 20% /boot
/dev/sda5 811248 32 811216 1% /btrfsdisk
#btrfsctl – r -300M /btrfsdisk
#df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 101086 19000 76867 20% /boot
/dev/sda5 504148 32 504106 1% /btrfsdisk
同樣的,可以使用 btrfsctl 命令增加檔案系統的大小。
建立 Snapshot
下面的例子中,建立快照 snap1 時系統存在 2 個檔案。建立快照之後,對 test1 的內容進行修改。再回到 snap1,開啟 test1 檔案,可以看到 test1 的內容依舊是之前的內容。
#ls /btrfsdisk
test1 test2
#vi test1
This is a test
#btrfsctl – s snap1 /btrfsdisk
#vi test1
Test1 is modified
#cd /btrfsdisk/snap1
#cat test1
This is a test
可以從上面的例子看到,快照 snap1 儲存的內容不會被後續的寫操作所改變。
建立 subvolume
使用 btrfs 命令,使用者可以方便的建立 subvolume 。假設 /btrfsdisk 已經掛載到了 btrfs 檔案系統,則使用者可以在這個檔案系統內建立新的 subvolume 。比如建立一個 /sub1 的 subvolume,並將 sub1 掛載到 /mnt/test 下:
#mkdir /mnt/test
#btrfsctl – S sub1 /btrfsdisk
#mount – t btrfs – o subvol=sub1 /dev/sda5/mnt/test
Subvolme 可以方便管理員在檔案系統上建立不同用途的子檔案系統,並對其進行一些特殊的配置,比如有些目錄下的檔案關注節約磁碟空間,因此需要開啟壓縮,或者配置不同的 RAID 策略等。目前 btrfs 尚處於開發階段,建立的 subvolme 和 snapshot 還無法刪除。此外針對 subvolume 的磁碟 quota 功能也未能實現。但隨著 btrfs 的不斷成熟,這些功能必然將會進一步完善。
建立 RAID
mkfs 的時候,可以指定多個裝置,並配置 RAID 。下面的命令示範了如何使用 mkfs.btrfs 配置 RAID1 。 Sda6 和 sda7 可以配置為 RAID1,即 mirror 。使用者可以選擇將資料配置為 RAID1,也可以選擇將中繼資料配置為 RAID1 。
將資料配置為 RAID1,可以使用 mkfs.btrfs 的 -d 參數。如下所示:
#mkfs.btrfs – draid1 /dev/sda6 /dev/sda7
#mount – t btrfs /dev/sda6 /btrfsdisk
添加新裝置
當裝置的空間快被使用完的時候,使用者可以使用 btrfs-vol 命令為檔案系統添加新的磁碟裝置,從而增加儲存空間。下面的命令向 /btrfsdisk 檔案系統增加一個裝置 /sda8
#btrfs-vol – a/dev/sda8 /btrfsdisk
SSD 支援
使用者可以使用 mount 參數開啟 btrfs 針對 SSD 的最佳化。命令如下:
#mount – t btrfs– o SSD /dev/sda5 /btrfsdisk
開啟壓縮功能
使用者可以使用 mount 參數開啟壓縮功能。命令如下:
#mount – t btrfs– o compress /dev/sda5 /btrfsdisk
同步檔案系統
為了提高效率,btrfs 的 IO 操作由一些核心線程非同步處理。這使得使用者對檔案的操作並不會立即反應到磁碟上。你可以做一個實驗,在 btrfs 上建立一個檔案後,稍等 5 到 10 秒將系統電源切斷,再次重啟後,建立的檔案並沒有出現。
對於多數應用這並不是問題,但有些時候使用者希望 IO 操作立即執行,此時就需要對檔案系統進行同步。下面的 btrfs 命令用來同步檔案系統:
#btrfsctl – c/btrfsdisk
Debug 功能
Btrfs 提供了一定的 debug 功能,對於想瞭解 Btrfs 內部實現原理的讀者,debug 將是你最喜歡的工具。這裡簡單介紹一下 debug 功能的命令使用。
下面的命令將裝置 sda5 上的 btrfs 檔案系統中的中繼資料列印到螢幕上。
#btrfs-debug-tree/dev/sda5
3.btrfs管理及應用