引言
Linux作為開源的操作系統,其中一個優點是支持各種各樣文件系統類型,從遠古的FAT到能現今常用的各種日志文件系統。
絕大多數Linux發行版支持ext2、ext3和reiser文件系統,因為它們是原生的Linux文件系統,下面將對虛擬文件系統、日志型文件系統和ext2、ext3、reiser文件系統進行介紹。
虛擬文件系統
虛擬文件系統(Virtual file system, VFS)是用戶進程和底層各種文件系統之前的抽象接口。VFS主要提供兩方面的功能:
- 提供管理底層文件系統的功能組件(inode、directory entry、page cache等)
- 提供訪問底層文件系統的方法(read、write、open等系統調用)
下圖說明了VFS與用戶進程和底層文件系統之間的交互:
由於VFS的存在,用戶進程不需要了解底層具體使用了哪種文件系統,VFS為用戶進程訪問底層文件系統提供了統一的接口。
日志(Journaling)
非日志型文件系統
對於早先的非日志型文件系統(non-journaling file system),當進行一個寫操作時,操作系統首先修改文件系統的元數據(metadata),然后再寫入實際用戶數據。
如果元數據正在被修改時,發生系統崩潰或機器掉電,文件系統就有可能被損壞。使用fsck工具可檢測並修復文件系統損壞的問題,但對於非日志型文件系統,fsck得掃描所有元數據,假如磁盤卷(volume)非常大,那就得花費很長時間進行檢測和修復。
因此非日志型文件系統不僅不利於保護數據的完整性,而且在文件系統損害時,也不利於文件系統的恢復。為解決這些問題,日志型文件系統就出現了。
日志型文件系統
相比非日志型文件系統,日志型文件系統(Journaling file system)增加了一個特別的區域:日志區(journal area),作為一個中間層,元數據和實際數據被寫入文件系統之前,可先寫入日志區:
下面我們來看,日志型文件系統如何利用日志區保護數據完整性,又如何利用日志區快速恢復文件系統。
日志模式(Mode of journaling)
多數日志型文件系統(如ext3、 reiser)支持三種日志方式,分別是回寫、順序、全日志。
回寫(writeback)
在回寫方式中,元數據被記錄到日志區中,實際數據被直接寫入主文件系統,該方式能提供較好的性能。
使用回寫模式,假如元數據寫入日志區后出現系統崩潰,在對文件系統進行恢復后,元數據和部分實際數據被更新,但恢復后的文件可能包含原先舊的垃圾數據。
順序(ordered)
在順序方式中,實際數據同樣被直接寫入主文件系統,而元數據在實際數據寫入完成后才寫入日志區,順序模式是日志文件系統默認使用的模式。
假如實際數據寫入過程中出現系統崩潰,修復文件系統后,元數據不變,部分實際數據被更新。
全日志(journal)
在全日志方式中,元數據和實際數據均先被寫入日志區,然后再寫入主文件系統。
該方式提供了很高安全性,不論系統在元數據寫入日志區階段還是實際數據寫入日志區階段發生崩潰,均不影響實際的主文件系統。但該模式為實現安全也付出了效率的代價,因為所有數據都要寫入兩次。
分析以上三種模式,共同的特點是元數據寫入主文件系統之前,都先記錄到日志區,這樣就保證了主文件系統的元數據不被破壞。另外,進行文件系統恢復時,只需讀取日志區中的信息即可進行恢復,而無需遍歷整個文件系統。
了解了非日志型文件系統和日志型文件系統的概念,下面我們來看ext2、ext3和reiser這三種具體的文件系統類型。
Ext2
Ext2是一種非日志型文件系統,其結構如下圖所示:
一個被格式化為etx2文件系統的磁盤分區,被分成一個引導分區(boot sector)后接多個塊組(block group),一個塊組又包含以下內容:
超級塊(super block): 用於存放文件系統信息,一個文件系統內,每個塊組的超級塊均包含相同內容
塊組描述(block group descriptior): 用於存放塊組信息
數據塊位圖(data block bitmaps): 用於管理空閑數據塊
i-node位圖(i-node bitmaps): 用於管理空閑i-node
i-node表(i-node tables): 用於存放i-node表,每個文件對應一個i-node表,i-node表用於管理文件的元數據(如uid、gid、ctime、dtime、指向數據塊的指針等)
數據塊(data blocks): 用於存放實際用戶數據
因i-node表與數據塊的物理磁盤位置靠的越近,尋道時間(seek time)越短,所以將整個文件系統分成多個小的組塊有利於性能的提升。
Ext3
Ext3由ext2演進而來,其組成結構與ext2相似,但添加了對日志功能(journal)的支持。Ext3文件系統有以下特點:
- 可用性(Avalability): ext3文件系統保證連貫一致地寫入數據,假如系統突然下電或崩潰,導致文件系統破壞,在進行文件系統修復時,將不必對數據的連貫一致性進行檢查,減少了用於系統恢復的時間
- 數據完整性(Data integrity): 使用mount命令掛載磁盤時指定全日志模式(data=journal),可保證元數據和實際用戶被完整地寫入文件系統
- 寫入速度(Speed): 指定data=writeback掛載選項,當寫文件操作較多時,可加快數據寫入速度
- 可擴展性(Flexibility): 使用tune2fs命令,可直接將ext2升級為ext3,而無需重新格式化磁盤
Ext3最初不是作為日志文件系統而設計,而是在ext2基礎上開發,因此它缺少一些其他日志文件系統所具備的特性,性能也較reiserfs、XFS等日志文件系統遜色。
Reiser
reiserFS是從一開始就按照記錄日志的意圖而開發的日志型文件系統。reiserFS的基礎格式建立在單一的B+樹上,這使得搜索的效率提高、可伸縮性增強,在處理小文件方面也有較好的性能。
reiserFS因其出色的性能表現,較同期其他文件系統更引人注目,曾一度作為Suse系統安裝時默認的文件系統。但由於reiserFS創建者Hans Reiser因故入獄,reiserFS的發展也近於停滯,Novell也於2006年將Suse默認的文件系統由reiserFS更改為ext3。
小結
本文簡要描述了Linux文件系統的層次結構,介紹了VFS的作用、日志型文件系統的概念,並對ext2、ext3和reiser這三種文件系統進行了簡要說明。
使用日志型文件系統,更多地是在數據完整性與效率兩者間作平衡。為保證數據一致完整,需要以降低寫入效率為代價;提高了寫入效率,文件系統被破壞的幾率就變大。
目前尚沒有一個“完美”的文件系統,現有的文件系統有各自的限制與不足,業界寄望於btrFS,它是否能如大家所望,取代ext3FS成為主流?我們拭目以待。
Reference: wiki 日志文件系統
Anatomy of Linux journaling file systems