用了這麼多年Ext4文件系統,您知道它的這些高級特性嗎?

Ext4文件系統大家都非常熟悉了,也是一個老牌的文件系統,它在2006年11月隨2.6.19內核初次發布,到2008年12月25日,Linux Kernel 2.6.28的正式版本發布,Ext4文件系統基本穩定,也稱為很多發行版的默認文件系統。算起來到現在也有十幾年了。

我們經常使用Ext4文件系統,不管是普通辦公用的筆記本或者PC,還是伺服器,很多根文件系統就是Ext4,但Ext4到底相對於Ext2和Ext3有哪些新特性,估計大家不一定能夠注意到,下面本文將給大家做一個基本的介紹,希望對以後的開發能夠有所幫助。

Ext3兼容

Ext4文件系統可以兼容之前的版本,也就是用戶如果已經用Ext3格式化了磁碟,那麼用戶也可以在不損失數據的情況下升級到Ext4文件系統。向前兼容極大的方便了已有用戶的升級,避免數據的導入導出可能引入的風險。向前兼容的原理很簡單,就是數據在磁碟的布局與Ext3保持一致,並且數據結構也保持一致即可

Extent

Extent是新一代文件系統支持的特性,其特點是通過其位置和長度表示文件內的數據,Ext4也支持該特性。在Ext2及Ext3中都是通過間接塊的方式存儲文件內的數據的,因此文件的大小和訪問性能各方面都比較差。如圖1為Ext3文件系統文件內數據存儲的方式。在文件對應的inode節點中有一個15個元素的數組,其中前12個元素存儲的是文件數據在磁碟的地址,第13個元素存儲的地址所指向磁碟數據存儲的不是文件內數據,而是指向下一級的地址,該地址才是文件內的數據。也就是在該數組的元素和實際存儲文件數據的磁碟塊之間多出一個磁碟塊,用於存儲磁碟的地址,而這個磁碟塊就是間接塊。以此類推,第14個元素中間有2級間接塊,第15個元素有3級間接塊

鑒於上述原理,由於文件系統中塊的大小是確定的,而地址長度和數組元素也是確定的,因此就可以確定文件的最大大小。同時,由於每個地址指向的就是一個塊,因此這種方式的特點是所有塊大小是一樣的。這樣就有一個缺點,如果用戶寫入的是遠大於文件系統塊的數據,Ext3還是要切割為指定大小的塊,而且還得計算地址,因此效率會非常不好。

圖1 Ext3間接塊數據存儲

Ext4文件系統對其進行了改進,實現了基於Extent的數據存儲方式,其實現基於B+樹。此時前文說的數組變成了B+樹的樹根,而B+樹可以有多層,只有葉子節點存儲指向文件數據的磁碟地址,中間層的節點只存儲下一級的磁碟地址,由於B+樹有很多叉(幾百個),因此樹的深度就會很淺。這樣文件系統在查找文件的數據的時候就不需要過多的與磁碟交互,從而保證文件系統的性能。

圖2 Ext4的Extent數據組織形式

前文提到,Ext4文件系統的關鍵之處在於Extent,也就是在葉子節點存儲文件數據在磁碟的地址的數據結構。該數據結構存放著地址和數據的長度,因此,如果用戶寫一個很大塊的數據,該數據結構就只需要記錄其實位置和長度即可,並不需要進行切割,效率得到極大的提升。

延遲分配

延遲分配的意思是在寫數據的情況下並不會馬上為其分配磁碟空間,而是先寫入頁緩存,然後做個標記,標記其還沒有分配空間。然後在某些特定的條件下才分配磁碟空間,並將數據寫入磁碟中。

圖3 Ext4的延遲分配

我們舉一個例子,如果沒有延遲分配,假設用戶寫入3個數據塊,如圖3左側所示,其中數字代表先後順序。此時文件系統為其分配磁碟空間,在地址上可能就不是連續的,而磁碟要寫這些數據就會產生磁碟擺臂,從而對寫入性能造成很大的影響。

而如果不馬上分配空間,而是延遲分配空間,這樣用戶寫入的數據就是連續的一塊數據,此時文件系統只需要分配一塊空間即可(如圖3右側所示),結合前面的Extent特性和多分配特性,就可以將該數據一次性寫入,從而提升寫入性能。簡單的理解其實就是盡量的將隨機IO轉換為順序IO

日誌校驗

我們知道為了提高文件系統的可靠性,在Ext3的時候引入了日誌系統。日誌系統用於在更改元數據(其實更改數據也可以用日誌系統,但性能影響比較大)的情況下,會先寫入日誌系統,然後再更改,這樣如果中間出現故障(例如斷電,系統崩潰等)時,就可以通過日誌系統進行恢復。從而避免文件系統因為故障而導致整個文件系統數據的丟失。

圖4 文件系統日誌校驗

所謂日誌校驗,就是在日誌系統的數據結構中添加校驗和,這樣每次寫入數據的時候,都會計算校驗和,並一起寫入。在讀取數據的時候會重新進行計算,並與校驗和對比,以確定數據的正確性。這種方式在資料庫系統中用的非常廣泛,比如Oracle和MySQL等,每個寫入的資料庫都有校驗和。

在線碎片整理

所謂碎片就是在磁碟上的一些不連續的數據,及空洞。由於碎片的存在可能導致磁碟空間利用率的降低,因為一些小的空洞導致無法重新分配使用;還有就是性能的降低,因為在邏輯上連續的數據,在磁碟物理空間上可能是分散的,這樣在訪問時,對於普通機械硬碟將導致其頻繁擺動磁頭,降低訪問性能。

雖然Ext4在數據布局和分配上做了很多優化,但數據的在磁碟上產生碎片仍然在所難免。因此Ext4額外實現了一個進行在線碎片整理的特性,並配合了一個用戶工具。碎片整理的原理非常簡單,就是分配一個臨時的連續的大文件,然後將目標文件中的數據與該文件數據進行交換,這樣就能把目標文件中不連續的數據轉換為連續的。

Ext4主要特性就是這些,當然還有一些小特性,本文就不一一介紹了,有任何問題請在下面留言。本號盡量回答,但由於時間有限不能保證回答每個問題。


推薦閱讀:

TAG:Linux內核 | ext4 | 文件系統 |