btrfs的精簡總結版


Btrfs 也有一個重要的缺點,當 BTree 中某個節點出現錯誤時,文件系統將失去該節點之下的所有的文件信息。而 ext2/3 卻避免了這種被稱為”錯誤擴散”的問題。

擴展性:extent、B-Tree、動態inode等特性保證了btrfs在大型機器上仍有卓越表象,整體性能不會隨着系統容量的增加而降低。

數據一致性:才用COW事物技術來保證文件系統的一致性。btrfs還支持checksum,避免了silent corrupt的出現。而傳統文件系統無法做到這一點。

其它設備管理特性:快照,克隆,管理多個物理設備

最小單位:extent:一些連續的block,一個extent由起始的block加上長度進行定義。

動態inode:因為ext2/3使用預先分配inode的機制導致文件數量受inode數量的限制。而btrfs使用了動態inode分配機制,每一個 inode只是B-Tree中的一個節點,用戶可以無限制地任意插入新的inode,其物理存儲位置是動態分配的。所以 btrfs 沒有對文件個數的限制。

對SSD固態硬盤進行優化的文件系統,btrfs 用戶可以使用 mount 參數打開對 SSD 的特殊優化處理。
Btrfs 的 COW 技術從根本上避免了對同一個物理單元的反復寫操作。如果用戶打開了 SSD 優化選項,btrfs 將在底層的塊空間分配策略上進行優化:將多次磁盤空間分配請求聚合成一個大小為 2M 的連續的塊。大塊連續地址的 IO 能夠讓固化在 SSD 內部的微代碼更好的進行讀寫優化,從而提高 IO 性能。

COW 事務:
理解 COW 事務,必須首先理解 COW 和事務這兩個術語。
什么是 COW?
所謂 COW,即每次寫磁盤數據時,先將更新數據寫入一個新的 block,當新數據寫入成功之后,再更新相關的數據結構指向新 block 。
什么是事務?
COW 只能保證單一數據更新的原子性。但文件系統中很多操作需要更新多個不同的元數據,比如創建文件需要修改以下這些元數據:
修改 extent tree,分配一段磁盤空間
創建一個新的 inode,並插入 FS Tree 中
增加一個目錄項,插入到 FS Tree 中
任何一個步驟出錯,文件便不能創建成功,因此可以定義為一個事務。
COW 事務能夠保證文件系統的一致性,並且系統 Reboot 之后不需要執行 fsck 。

Checksum:
Checksum 技術保證了數據的可靠性,避免 silent corruption 現象。由於硬件原因,從磁盤上讀出的數據會出錯。比如 block A 中存放的數據為 0x55,但讀取出來的數據變是 0x54,因為讀取操作並未報錯,所以這種錯誤不能被上層軟件所察覺。
解決這個問題的方法是保存數據的校驗和,在讀取數據后檢查校驗和。如果不符合,便知道數據出現了錯誤。
ext2/3 沒有校驗和,對磁盤完全信任。而不幸的是,磁盤的錯誤始終存在,不僅發生在廉價的 IDE 硬盤上,昂貴的 RAID 也存在 silent corruption 問題。而且隨着存儲網絡的發展,即使數據從磁盤讀出正確,也很難確保能夠安全地穿越網絡設備。
btrfs 在讀取數據的同時會讀取其相應的 checksum 。如果最終從磁盤讀取出來的數據和 checksum 不相同,btrfs 會首先嘗試讀取數據的鏡像備份,如果數據沒有鏡像備份,btrfs 將返回錯誤。寫入磁盤數據之前,btrfs 計算數據的 checksum 。然后將 checksum 和數據同時寫入磁盤。

多設備管理:
動態增加設備,動態擴容
Btrfs 支持動態添加設備。用戶在系統中增加新的磁盤之后,可以使用 btrfs 的命令將該設備添加到文件系統中。
為了靈活利用設備空間,Btrfs 將磁盤空間划分為多個 chunk 。每個 chunk 可以使用不同的磁盤空間分配策略。比如某些 chunk 只存放 metadata,某些 chunk 只存放數據。一些 chunk 可以配置為 mirror,而另一些 chunk 則可以配置為 stripe 。這為用戶提供了非常靈活的配置可能性。

subvolume:
Subvolume 是很優雅的一個概念。即把文件系統的一部分配置為一個完整的子文件系統,稱之為 subvolume 。
采用 subvolume,一個大的文件系統可以被划分為多個子文件系統,這些子文件系統共享底層的設備空間,在需要磁盤空間時便從底層設備中分配。這種模型有很多優點,比如可以充分利用 disk 的帶寬,可以簡化磁盤空間的管理等。
所謂充分利用 disk 的帶寬,指文件系統可以並行讀寫底層的多個 disk,這是因為每個文件系統都可以訪問所有的 disk 。傳統的文件系統不能共享底層的 disk 設備,無論是物理的還是邏輯的,因此無法做到並行讀寫。
所謂簡化管理,是相對於 LVM 等卷管理軟件而言。采用存儲池模型,每個文件系統的大小都可以自動調節。而使用 LVM,如果一個文件系統的空間不夠了,該文件系統並不能自動使用其他磁盤設備上的空閑空間,而必須使用 LVM 的管理命令手動調節。
Subvolume 可以作為根目錄掛載到任意 mount 點。 subvolume 是非常有趣的一個特性,有很多應用。
假如管理員只希望某些用戶訪問文件系統的一部分,比如希望用戶只能訪問 /var/test/ 下面的所有內容,而不能訪問 /var/ 下面其他的內容。那么便可以將 /var/test 做成一個 subvolume 。 /var/test 這個 subvolume 便是一個完整的文件系統,可以用 mount 命令掛載。比如掛載到 /test 目錄下,給用戶訪問 /test 的權限,那么用戶便只能訪問 /var/test 下面的內容了。

快照和克隆:
利用快照,管理員可以在時間點 T1 將數據庫停止,對系統建立一個快照。這個過程一般只需要幾秒鍾,然后就可以立即重新恢復數據庫服務。此后在任何時候,管理員都可以對快照的內容進行備份操 作,而此時用戶對數據庫的修改不會影響快照中的內容。當備份完成,管理員便可以刪除快照,釋放磁盤空間。
快照一般是只讀的,當系統支持可寫快照,那么這種可寫快照便被稱為克隆。克隆技術也有很多應用。比如在一個系統中安裝好基本的軟件,然后為不同的用戶做不同的克隆,每個用戶使用自己的克隆而不會影響其他用戶的磁盤空間。非常類似於虛擬機。
如前所述 Btrfs 采用 COW 事務技術,從圖 1-10 可以看到,COW 事務結束后,如果不刪除原來的節點 A,C,E,那么 A,C,E,D,F 依然完整的表示着事務開始之前的文件系統。這就是 snapshot 實現的基本原理。
Btrfs 采用引用計數決定是否在事務 commit 之后刪除原有節點。對每一個節點,btrfs 維護一個引用計數。當該節點被別的節點引用時,該計數加一,當該節點不再被別的節點引用時,該計數減一。當引用計數歸零時,該節點被刪除。對於普通的 Tree Root, 引用計數在創建時被加一,因為 Superblock 會引用這個 Root block 。很明顯,初始情況下這棵樹中的所有其他節點的引用計數都為一。當 COW 事務 commit 時,superblock 被修改指向新的 Root A ’’,原來 Root block A 的引用計數被減一,變為零,因此 A 節點被刪除。 A 節點的刪除會引發其子孫節點的引用計數也減一,其下的子孫節點的 比如B,C 節點的引用計數因此也變成了 0,從而被刪除。 D,E 節點在 COW 時,因為被 A ’’所引用,計數器加一,因此計數器這時並未歸零,從而沒有被刪除。
創建 Snapshot 時,btrfs 將的 Root A 節點復制到 sA,並將 sA 的引用計數設置為 2 。在事務 commit 的時候,sA 節點的引用計數不會歸零,從而不會被刪除,因此用戶可以繼續通過 Root sA 訪問 snapshot 中的文件。

軟件RAID:
Btrfs 缺省情況下對 metadata 進行 RAID1 保護。前面已經提及 btrfs 將設備空間划分為 chunk,一些 chunk 被配置為 metadata,即只存儲 metadata 。對於這類 chunk,btrfs 將 chunk 分成兩個條帶,寫 metadata 的時候,會同時寫入兩個條帶內,從而實現對 metadata 的保護。

其他特性:
Btrfs 主頁上羅列的其他特性不容易分類,這些特性都是現代文件系統中比較先進的技術,能夠提高文件系統的時間或空間效率。

Delay allocation:
在文件系統中,小塊空間頻繁的分配和釋放會造成碎片。延遲分配是這樣一種技術,當用戶需要磁盤空間時,先將數據保存在內存中。並將磁盤分配需求發送給磁盤空間分配器,磁盤空間分配器並不立即分配真正的磁盤空間。只是記錄下這個請求便返回。
磁盤空間分配請求可能很頻繁,所以在延遲分配的一段時間內,磁盤分配器可以收到很多的分配請求,一些請求也許可以合並,一些請求在這段延遲期間甚至可能被取消。通過這樣的“等待”,往往能夠減少不必要的分配,也有可能將多個小的分配請求合並為一個大的請求,從而提高 IO 效率。

Inline file:
系統中往往存在大量的小文件,比如幾百個字節或者更小。如果為其分配單獨的數據 block,便會引起內部碎片,浪費磁盤空間。 btrfs 將小文件的內容保存在元數據中,不再額外分配存放文件數據的磁盤塊。改善了內部碎片問題,也增加了文件的訪問效率。
得益於 inline file 技術,btrfs 處理小文件的效率非常高,也避免了磁盤碎片問題。

目錄索引 Directory index:
當一個目錄下的文件數目巨大時,目錄索引可以顯著提高文件搜索時間。 Btrfs 本身采用 BTree 存儲目錄項,所以在給定目錄下搜索文件的效率是非常高的。

壓縮:
大家都曾使用過 zip,winrar 等壓縮軟件,將一個大文件進行壓縮可以有效節約磁盤空間。 Btrfs 內置了壓縮功能。
通常人們認為將數據寫入磁盤之前進行壓縮會占用很多的 CPU 計算時間,必然降低文件系統的讀寫效率。但隨着硬件技術的發展,CPU 處理時間和磁盤 IO 時間的差距不斷加大。在某些情況下,花費一定的 CPU 時間和一些內存,但卻能大大節約磁盤 IO 的數量,這反而能夠增加整體的效率。
比如一個文件不經過壓縮的情況下需要 100 次磁盤 IO 。但花費少量 CPU 時間進行壓縮后,只需要 10 次磁盤 IO 就可以將壓縮后的文件寫入磁盤。在這種情況下,IO 效率反而提高了。當然,這取決於壓縮率。目前 btrfs 采用 zlib 提供的 DEFALTE/INFLATE 算法進行壓縮和解壓。在將來,btrfs 應該可以支持更多的壓縮算法,滿足不同用戶的不同需求。
對於某些類型的文件,比如 jpeg 文件,已經無法再進行壓縮。嘗試對其壓縮將純粹浪費 CPU 。為此,當對某文件的若干個 block 壓縮后發現壓縮率不佳,btrfs 將不會再對文件的其余部分進行壓縮操作。這個特性在某種程度上提高了文件系統的 IO 效率。

預分配:
很多應用程序有預先分配磁盤空間的需要。他們可以通過 posix_fallocate 接口告訴文件系統在磁盤上預留一部分空間,但暫時並不寫入數據。如果底層文件系統不支持 fallocate,那么應用程序只有使用 write 預先寫一些無用信息以便為自己預留足夠的磁盤空間。
由文件系統來支持預留空間更加有效,而且能夠減少磁盤碎片,因為所有的空間都是一次分配,因而更有可能使用連續的空間。 Btrfs 支持 posix_fallocate 。


總結:
至此,我們對 btrfs 的很多特性進行了較為詳細的探討,但 btrfs 能提供的特性卻並不止這些。 btrfs 正處於試驗開發階段,還將有更多的特性。
Btrfs 也有一個重要的缺點,當 BTree 中某個節點出現錯誤時,文件系統將失去該節點之下的所有的文件信息。而 ext2/3 卻避免了這種被稱為”錯誤擴散”的問題。
但無論怎樣,希望您和我一樣,開始認同 btrfs 將是 Linux 未來最有希望的文件系統。


文件系統創建:
mkfs.btrfs
-L 'LABEL'
-d <type>: raid0, raid1, raid5, raid6, raid10, single
-m <profile>: raid0, raid1, raid5, raid6, raid10, single, dup
-O <feature>
-O list-all: 列出支持的所有feature;
屬性查看:
btrfs filesystem show
掛載文件系統:
mount -t btrfs /dev/sdb MOUNT_POINT

透明壓縮機制(拷貝過來一個文件查看大小也完全一樣,這個壓縮內部理論有待研究):
mount -o compress={lzo|zlib} DEVICE MOUNT_POINT

縮小文件系統(我在測試的時候,兩個20G的硬盤,我僅僅只能減去17G,再多就報錯了):
btrfs filesystem resize -13G /mydata
擴容文件系統:
btrfs filesystem resize +13G /mydata
或者(擴充到最大)
btrfs filesystem resize max /mydata
添加一個硬盤:
btrfs device add /dev/sdd /mydata
把/mydata中其它的數據,均衡(移動到)到新添加的磁盤中(會占用io資源):
btrfs balance start /mydata
btrfs balance status #查看狀態
注意:如果數據量過大的時候,這個時間可能就會很久
balance也有暫停(pause),繼續(resume),取消(cancel)等操作,可以通過man btrfs-balance去查看下
移除一個物理卷(btrfs會自動把數據先挪走再拆除):
btrfs device delete /dev/sdb /mydata

修改raid級別(有點暈,需要查一下這幾個組織機制的關系)
修改數據的組織機制:act on data chunks
btrfs balance -dconvert=raid0 /mydata
修改元數據的組織機制:act on metadata chunks
btrfs balance -mconvert=raid1 /mydata
修改系統的組織機制:act on system chunks
btrfs balance -sconvert=raid5 /mydata
btrfs的子命令:
filesystem
device
balance
subvolume #子卷的管理命令

創建一個子卷cache:
btrfs subvolume create /mydata/cache
掛在子卷
mount -o subvol=cache /dev/sdb /mnt
也可以使用subid掛載
mount -o subvolid=268 /dev/sdb /mnt
查看volid:
btrfs subvolume list /mydata

刪除子卷(注意:請先掛在父卷):
btrfs subvolume dalete /mydata/cache

創建快照(快照卷必須與原卷在同一個卷組中):
btrfs subvolume snapshot /mydata/logs /mydata/logs_snapshot
刪除快照:
btrfs subvolume dalete /mydata/logs_snapshot
對單個文件創建快照:
cp --reflink file.txt file.txt_snapshot
把其它文件系統轉換成btrfs(這里拿ext4做的測試,其它文件系統請一定要事前嚴格測試下):
強制檢測下:
fsck -f /dev/sdd1
轉換(數據沒丟):
btrfs-convert /dev/sdd1
查看有沒有生效:
btrfs filesystem show
回滾到之前的文件系統(之前是ext4):
btrfs-convert -r /dev/sdd1
查看:
blkid /dev/sdd1

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM