BTRFS設計簡介

2021-06-10 00:47:44 字數 4022 閱讀 2233

當前linux檔案系統事實上的標準是extn(如ext3/ext4),但extn只是發展了數十年的檔案系統的乙個延續,設計上缺少一些新的特性來滿足當前it系統的需求,如對大儲存容量的支援,高可靠性(冗餘支援,魯棒性),方便的volume管理技術等。btrfs設計之初就是為了成為下一代linux檔案系統而努力的,其許多特性可以稱之為「現代」: 高效的snapshot與clone,檔案系統與volume管理概念整合。 這些在企業級應用中經常出現的重要特性,成為了btrfs天然自帶的一部分。可能很多人會聯想到solaris上的zfs,我們可以簡單地認為btrfs就是linux版的zfs。本文將主要講解btrfs設計以及實現上的一些重要特性。

ohad rodeh在他的**[1]

中通過修改b+tree結構,設計出了一種具備我們期望的檔案系統原型。而btrfs就是根據這個原型由chris mason(原oracle linux kernel團隊負責人,目前在fusionio)來實現完成的。btrfs設計的核心結構是一種cow(copy-on-write) friendly b+tree:

cow指的是整個btrfs內部不存在overwrite,即對任何資料(meta和data)的修改,都是將更新完的資料寫入到新的磁碟block中。cow的方式有一些好處:良好的事務性,對snapshot和clone的友好支援

b+tree是一種重要的資料結構,被廣泛應用在檔案系統,資料庫索引等諸多重要技術上。此處略過b+tree的介紹,先看看cow如何工作的:

當cow發生時,所有指向修改節點的節點也要cow,那麼對於b+tree來說,leaf chain(b+tree為了支援range lookup,把所有leaf都連線起來)就會造成整棵tree的cow,這顯然是不能忍受的。那麼ohad rodeh的改進包括:

取消leaf chain,這樣雖然不利於range lookup,但是cow就不需要修改整棵tree的結構

傳統b+tree的rebalance是自下而上(bottom-up)的方式,也就是說,當insert或者remove操作發生時,split或者merge首先發生在 leaf上,然後自下而上進行傳遞的;而ohad rodeh提出了自上而下(top-down)的方式。簡而言之,在insert或者remove操作之前,search路徑的遍歷過程中,一旦發現需要merge(當前是insert操作)或者split(當前是remove操作)的節點就主動進行預處理,然後繼續向下遍歷。這種主動rebalance的方式使整棵樹的平衡性更好,且所有操作在一次遍歷就可以完成

通過輔助的free-space map來管理block的ref-count。ref-count的方式比傳統的bitmap方式更加節約儲存空間,更高效地生成/刪除快照和轉殖,但卻給普通的修改操作帶來了額外的效能問題(由於採用cow方式,每次更新都需要同時修改block的引用計數)

所有節點(node和leaf)大小都為乙個完整的extent. extent代表磁碟上一組連續的block(乙個block大小為4kb),extent是btrfs最小的分配單位。一般來說,讀寫一塊extent只需要一次io

所有meta與data資訊都是由 b+tree來進行管理的 ;所有b+tree的root都由root-tree來管理(除了chunk-tree),而super block指向root-tree的根節點

所有extent都由extent-tree管理,負責分配與**extent,以及ref-count管理,ref-count機制不應用在extent-tree和root-tree上,這兩類tree直接分配新extent,釋放舊extent,舊的extent在checkpoint commit之後**。對於ref-count方式的**是通過遍歷extent-tree,並且支援跨越多個checkpoint來完成一次遍歷,使得**task粒度足夠細

所有meta和data資訊都採用fs-tree來管理。檔案系統相關的meta資訊(如inode,dentry等)都放在fs-tree中。這裡一棵fs-tree對應乙個物理分割槽或者乙個snapshot或者乙個clone;每個leaf(單個extent)直接包含meta的資料,而file data的資料則通過指標指向另外分配的extent(對於小檔案直接放在leaf extent中,有助於減少磁碟碎片)

所有extent都記錄checksum,由checksum-tree管理

btrfs將物理磁碟劃分為多個chunk(如大小為256m),每個chunk分配的時候,可以標記為meta或者data chunk(這種劃分不是絕對的,必要時候可以互相轉換),這樣meta和data不會混在一起儲存。另外chunk-tree維護了logical chunk到physical chunk的對映,所有的儲存分配都是基於logical chunk的(這部分由前面所說的extent-tree來負責完成)。同時physical chunk被分成多個group,目的是為了支援raid

btrfs還維護了一棵relocation-tree,目的是為了支援online的磁碟碎片整理。所謂relocation是基於chunk來操作的(而不是extent),relocation會把需要處理的chunk中的所有extent以及對應的reference找出來,重新分配到新的chunk中

所有更新操作都採用cow,如果每次修改都寫到磁碟則開銷太大,因此全部修改先寫在記憶體中,週期性完成checkpoint,這樣可以延遲分配磁碟上的block,有利於優化分配策略,支援批量寫入等。

一次檔案的修改操作往往會修改多棵b+tree,事務語義通過cow來完成,自下而上修改,最終通過super block指向新的root-tree來完成一次事務,如果失敗(如系統crash),那麼super block還是指向舊的root-tree,不會破壞原始資料

為了提高併發訪問,採用了一種叫做lock coupling的演算法[2]

,具體描述如下:

查詢操作用讀鎖,插入/刪除操作用寫鎖

鎖住當前節點前必須先鎖住其父節點,且必須是相同語義的鎖

查詢操作:當前節點必須鎖上其孩子節點之後才能釋放

插入操作:當前節點釋放鎖必須滿足:當前節點有足夠空間(至少允許插入乙個新索引)不會導致split且鎖住其孩子節點

刪除操作:當前節點釋放鎖必須滿足:不引發merge且鎖住其孩子節點,空節點只有在當前事務全部完成之後才被**

snapshot,clone都支援寫操作;產生snapshot或clone時,ref-count採用了延遲修改的方式,只修改root節點的所有direct children的ref-count,其餘ref-count在checkpoint時來修改完成

對於資料庫這樣的應用來說,由於需要write-ahead logging,會頻繁發生fsync操作,而由於我們的寫操作都是cow,所以會造成大量的冗餘,同時fsync也會造成頻繁commit整棵tree。因此每棵fs-tree都有一棵log-tree來記錄fsync請求到磁碟(臨時資料),當整棵fs-tree commit checkpoint的時候,再把資料合入進來;而一旦系統crash,log-tree還可以負責replay log

btrfs功能很強大,該有的都有了,估計檔案系統做到這個份上已經到極致了;設計很優雅,全部通過b+tree一種核心結構來完成。但是缺點是效能比較差,雖然對meta的操作非常方便,但io效能一般;發展了五年,還不是很穩定,進展緩慢;沒有大規模的商業應用,只能算半成品。不過無論如何,btrfs代表了現代檔案系統的發展方向,相信未來linux社群會有更多突破性的工作展現出來。

1. ohadrodeh(2008).  b-trees, shadowing, andclones. tos volume 3 issue 4, 2008 article no. 2

2. ohadrodeh(2012). btrfs: the linux b-tree filesystem. ibm research report

3. r. bayer and m. schkolnick. 1977. concurrency of operations on b-trees. acta informatica 9,1–21.

4. btrfs source: git:

5. btrfs wiki

Btrfs 檔案系統

btrfs檔案系統簡介 btrfs檔案系統 技術預覽版 centos7 btrfs b tree butter fs better fs gpl授權,orale2007提出是想用來取代ext檔案系統 核心特性 1 多物理卷支援 支援將多個底層物理裝置組織成同乙個檔案系統,類似vg,btrfs可由多個...

linux中btrfs檔案系統

技術預覽版 btrfs b tree,butter fs better fs gpl,oracle,2007,cow寫實 目的取代linux早先的 ext3 4,xfs 核心特性 多物理卷支援 btrfs可由多個底層物理卷組成 支援raid,聯機實現 新增 移除 修改 支援寫時更新複製及替換指標,而...

btrfs基本介紹及應用 困境

一 btrfs基本概念 btrfs檔案系統是2007年oracle開發,支援gpl協議,為了取代linux早期的ext系列檔案系統。btrfs核心特性 多物理卷支援 btrfs可由多個底層物理卷組成,支援raid,以聯機新增 移除 修改操作 寫時複製更新機制 cow 複製 更新及替換指標,而非直接更...