天天看點

ext4檔案系統綜述

        從本篇部落格起,我們開始研究現代檔案系統ext4,說其現代是因為其相比傳統檔案系統,有着更現代化的設計。這些先進的特性展現在本文所要叙述的以下方面。

        Ext4是Linux檔案系統的一次革命。在很多方面,Ext4相對于Ext3的進步要遠超過Ext3相對于Ext2的進步。Ext3相對于 Ext2的改進主要在于日志方面,但是Ext4相對于Ext3的的改進是更深層次的,是檔案系統資料結構方面的優化。一個高效的、優秀的、可靠的和極具特點的檔案系統就此誕生。Ext4相比ext3,有如下幾個全新的特性:

  •  相容性:任何Ext3檔案系統都可以輕松的遷移到Ext4檔案系統,你隻需要在隻讀模式下運作幾條指令即可。這就意味着你完全可以不格式化硬碟、不重裝作業系統、不重裝軟體環境,就能夠順利的更新到Ext4檔案系統。這種更新方法不會損害到你硬碟上的資料和資料,因為Ext4僅會在新的資料上使用,而基本不會改動原有資料。
  •  更大的檔案系統/檔案大小:Ext3支援最大16TB的檔案系統,2TB的檔案大小。Ext4将支援最大1EB( )的檔案系統,16TB的檔案大小。上述這個特性是由于Ext4采用了48位尋址。有人會問,為什麼不采用64位呢?因為就目前的開發進展來看,實作64位尋址存在一些技術限制,但是Ext4已經在考慮這個問題了,在不久的将來,Ext4将實作完全的64位支援。
  • 子目錄可擴充性:目前的Ext3中,單個目錄下的子目錄數目的上限是32000個。而在Ext4中打破了這種限制,可以建立無限多個子目錄。
  •  Extents:傳統的類UNIX檔案系統,比如Ext3,都是使用一個間接資料塊映射表來記錄每一個資料塊的配置設定情況的。但是這種機制對于超大檔案的存儲是有缺陷的,特别是當對超大檔案進行删除和截斷操作時。映射表會對每一個資料塊進行記錄,而一個超大檔案将占有很多的資料塊,是以造成映射表将變得無比臃腫,難于維護。Ext4引入了一個新的概念,叫做“Extents”。一個Extents是一個位址連續的資料塊的集合。比如一個100MB的檔案将被配置設定給一個單獨的Extents,這樣就不用像Ext3那樣新增25600個資料塊的記錄(一個資料塊是4KB)。而超大型檔案會被分解在多個extents裡。Extents的實作提高了檔案系統的性能,減少了檔案碎片。
  •  多塊配置設定:在Ext3中,“将新的資料寫入磁盤的哪些空閑塊”是由塊配置設定器來控制的。但是Ext3的塊配置設定器存在一定缺陷,那就是它一次隻能夠配置設定一個資料塊(4KB),這就意味着,如果系統需要向磁盤中寫入100MB的資料,那麼需要調用塊配置設定器25600次,而且由于塊配置設定器無法獲知總的配置設定塊數,是以也無法對配置設定空間和配置設定位置進行優化。在Ext4中,使用了“多塊配置設定器”,即一次調用可以配置設定多個資料塊,這種機制提高了系統的性能,而且使得配置設定器有了充足的優化空間。
  • 延遲配置設定:延遲配置設定(Delayedallocation)是一項僅僅少數現代檔案系統才具有的優秀特性,比如XFS、ZFS、btrfs(better FS)以及Reiser4。它能夠盡可能的積累更多的資料塊再配置設定出去,相對比,傳統的檔案系統則會盡快的将資料塊配置設定出去,如Ext3,reiser3 等。這項特性會和Extents特性以及多塊配置設定特性相結合,使得磁盤IO性能得到顯著提高。
  • 更快速的FSCK:在Ext3中,Fsck本身是個速度很慢的操作,因為它要檢查檔案系統裡的每一個“i節點”。但是,Ext4會維護一個未使用的“i節點”表,在進行 fsck操作時,會跳過表中節點,隻檢查正在使用中的i節點。這種機制使得fsck的效率提高為原有Ext3檔案系統的2到20倍。不過,你要注意到一點,那就是這個未使用的i節點表是由fsck來維護的,而不是由Ext4,是以你必須要首先運作一次fsck來生成,這樣,在下次再運作fsck時才可以享受提速。(雖然表是由fsck來維護的,但你還是需要從Ext3更新到Ext4才能夠享受這項功能)
  • 日志校驗:日志要算是磁盤中最常用的部分了,也是最容易使硬碟出問題的機制之一。如果你不幸使用一個已經崩潰的日志來恢複系統的話,将導緻更大規模的系統崩潰。 Ext4提供校驗日志資料的功能,可以檢視其潛在錯誤。而且,Ext4還會将Ext3日志機制中的“兩階段送出”動作合并為一個步驟,這種改進将使檔案系統的操作性能提升20%。這就是Ext4在日志機制方面對可靠度和性能的雙重提升。
  • 線上磁盤整理:這個特性沒有包括在核心版本2.6.28之中,但是它很有可能會在下一個版本中引入。雖然Extents、多塊配置設定和延遲配置設定都有助于減少磁盤碎片,但是磁盤碎片仍然會産生。舉例來說:你在一個目錄下建立了三個檔案(f1,f2,f3),它們被按序寫入到連續的一段記憶體之中。然而幾天之後,你想要更新檔案f2,也就是位于這段連續記憶體的中間那一段的那個檔案。我要向這個檔案中增加一些字元。很明顯,在這段連續記憶體之中已經沒有地方放下增加的這些字元,這别無選擇,隻能将這個f2檔案移動到一個能容納下的新的連續記憶體之中。這導緻了f2檔案和f1、f3檔案離的非常遠,讀取也相對緩慢了。看,這就産生了磁盤碎片了。還有,可引導檔案應該被放在連續的記憶體之中,但是磁盤整理機制并不知道哪些檔案是可引導檔案。為了解決上述問題,Ext4将支援線上磁盤整理,e4defrag工具也被用來支援更智能的磁盤碎片整理功能。
  • 結點相關特性: 更大的i結點:Ext3支援自定義i結點大小,但是預設的i結點大小是128位元組,Ex4将預設大小提升到256位元組。增加的空間用來存儲更多的結點資訊,這樣有利于提升磁盤性能。 i結點預留機制:當建立一個目錄時,若幹i結點會被預留下來,等新的檔案在此目錄中建立時,這些預留的i結點就可以立即被使用。檔案的建立和删除将變得更加高效。毫微秒級的時間戳:在Ext3中,時間精度是秒。在Ext4中,時間精度提升到了毫微秒。
  • 可持續預配置設定: 這個特性,已經出現在了Ext3的最後幾個核心版本中,并且也可以由glibc在不支援此功能的檔案系統中模拟産生,允許應用程式去預配置設定磁盤空間。應用程式告知檔案系統給預留出一定的空間,檔案系統會據此預配置設定必要的資料塊,但是這些資料塊将會是空的,直到應用程式向裡面寫入資料為止。這個機制會常常在P2P應用程式中用到,因為P2P應用程式下載下傳檔案常常需要幾天的時間。這種機制也防止了磁盤碎片的産生,因為檔案系統會一次性配置設定盡可能連續的資料塊給應用程式。再者,這種機制對于實時系統非常重要,因為一旦沒有這種機制,可能将會導緻在一次重要操作的半截,磁盤空間已滿。這項特性是通過調用posix_fallocate()來實作的。
  • FlexibleBlock Groups。Starting in ext4, there is a new feature calledflexible block groups (flex_bg). In a flex_bg, several block groups are tiedtogether as one logical block group; the bitmap spaces and the inode tablespace in the first block group of the flex_bg are expanded to include thebitmaps and inode tables of all other block groups in the flex_bg. For example,if the flex_bg size is 4, then group 0 will contain (in order) the superblock,group descriptors, data block bitmaps for groups 0-3, inode bitmaps for groups0-3, inode tables for groups 0-3, and the remaining space in group 0 is forfile data. The effect of this is to group the block metadata close together forfaster loading, and to enable large files to be continuous on disk. Backupcopies of the superblock and group descriptors are always at the beginning ofblock groups, even if flex_bg is enabled. The number of block groups that makeup a flex_bg is given by 2 ^ 

    sb.s_log_groups_per_flex

    .以上描述的是ext4的一個全新特性flexible blockgroups,其基本思想是将多個實體塊組(block group)組織成一個邏輯塊組(logical blockgroup),每個邏輯塊組的第一個實體塊組用來存儲整個邏輯塊組的中繼資料,如超級塊,塊組描述符,inode位圖,inode等。根據其官方文檔的描述,增加這個新特性的目的有2,第一是将塊組的中繼資料集中在一起會提高中繼資料加載速度;第二是有了更大的連續空間,每個邏輯塊組除了第一個實體塊組外,剩下的實體塊組均可以用于存儲檔案資料。
  • MetaBlock Groups。Without the option META_BG, for safety concerns, all block groupdescriptors copies are kept in the first block group. Given the default128MiB(2^27 bytes) block group size and 64-byte group descriptors, ext4 canhave at most 2^27/64 = 2^21 block groups. This limits the entire filesystemsize to 2^21 ∗ 2^27 = 2^48bytes or 256TiB.The solution to this problem is to use the metablock group feature(META_BG), which is already in ext3 for all 2.6 releases. With the META_BGfeature, ext4 filesystems are partitioned into many metablock groups. Eachmetablock group is a cluster of block groups whose group descriptor structurescan be stored in a single disk block. For ext4 filesystems with 4 KB blocksize, a single metablock group partition includes 64 block groups, or 8 GiB ofdisk space. The metablock group feature moves the location of the groupdescriptors from the congested first block group of the whole filesystem intothe first group of each metablock group itself. The backups are in the secondand last group of each metablock group. This increases the 2^21 maximum blockgroups limit to the hard limit 2^32, allowing support for a 512PiB filesystem.The change in the filesystem format replaces the current schemewhere the superblock is followed by a variable-length set of block groupdescriptors. Instead, the superblock and a single block group descriptor blockis placed at the beginning of the first, second, and last block groups in ameta-block group. A meta-block group is a collection of block groups which canbe described by a single block group descriptor block. Since the size of theblock group descriptor structure is 32 bytes, a meta-block group contains 32block groups for filesystems with a 1KB block size, and 128 block groups forfilesystems with a 4KB blocksize. Filesystems can either be created using thisnew block group descriptor layout, or existing filesystems can be resizedon-line, and the field s_first_meta_bg in the superblock will indicate thefirst block group using this new layout.。Ext4系列的檔案系統由于其磁盤劃分的特點,整個檔案系統按塊組劃分,每個塊組最大128MB,每個塊組由塊組描述符來描述其參數,每個塊組描述符大小為64位元組,且所有的塊組描述符都儲存在第一個塊組中,是以,這就限制了整個檔案系統的大小最大為128MB/64 * 128MB= 256TB位元組,為了解決這一問題,ext4(其實從ext3開始)增加了一個全新特性Meta Block Groups。采用該特性以後,整個檔案系統被劃分成多個meta block group,其實概念類似上面說的logical blockgroup,都是由多個實體block group組成,每個meta block group的特點是其第一個磁盤塊儲存整個meta block group的塊組描述符,假如檔案系統塊大小為4KB,則每個meta block group可管理的實體block group是4KB/64 = 64。那麼整個meta block group可管理的磁盤空間為128MB * 64 = 8GB。并且,為了可靠性考慮,每個meta block group的第二個以及最後一個實體block group會儲存一份塊組描述符的備份。是以,增加了meta block group特性的ext4檔案系統的磁盤格式變成如下所示:
ext4檔案系統綜述

        如果考慮到Flexible Block Group和Meta Block Group兩種特性的話,那麼ext4的磁盤布局很可能是如下圖所示:

ext4檔案系統綜述

        如此算是兼顧了兩個全新特性的磁盤布局,但這裡仍然沒有達到Flexible Block Group的最高要求:資料塊連續。

繼續閱讀