天天看點

Linux中的Ext2、ext3、ext4檔案系統如何對磁盤中的檔案進行存儲和管理

本文出自 “Pavel” 部落格,請務必保留此出處http://pavel86.blog.51cto.com/8349178/1688277

Ext2檔案系統

Ext2檔案系統中将磁盤分區劃分為兩個主要區域: 中繼資料區(matadata area)和資料區(data area). 其中中繼資料區用于存放檔案的屬主, 屬組, 通路權限, 時間戳以及檔案系統資料和中繼資料配置設定資訊等相關屬性資訊, 資料區用于存放檔案中的真實資料.

由于現在的實體磁盤的容量大小越來越大, 存儲的資料越來越多, 在讀取和寫入檔案有時需要周遊整個磁盤空間, 非常消耗時間, 是以在磁盤分區上建立檔案系統時會先将磁盤劃分為多個塊組(block group), 每個塊組中有各自的中繼資料區和資料區, 并對他們進行獨立自治. 檔案系統的邏輯結構如下圖所示:

Linux中的Ext2、ext3、ext4檔案系統如何對磁盤中的檔案進行存儲和管理

其中的 boot block 分區是指檔案系統的啟動扇區, 可以用于安裝引導程式而不需要占用硬碟上唯一的MBR區域, 主要用于多作業系統主機上.

塊組的内部邏輯結構如下圖所示:

Linux中的Ext2、ext3、ext4檔案系統如何對磁盤中的檔案進行存儲和管理

由上圖所示可以看到塊組中中繼資料區和資料區的邏輯結構.

資料區

資料區結構比較單一, 由許多大小相同的資料塊(block)組成, 資料塊的大小規格分别有: 1KB, 2KB, 4KB. 資料塊的大小是在檔案系統格式化後就固定的, 此後無法再進行修改. 對于目錄來說, 資料塊用于存儲該目錄下的檔案名與該檔案的inode号; 對于檔案來說, 資料塊用于存儲檔案中的資料. 因為資料塊大小能夠決定檔案系統中存儲的單個最大檔案的大小, 而且塊大小與主機承載業務類型有很大關系, 是以在設定資料塊大小時應根據具體問題具體分析.

中繼資料區

中繼資料區主要有Super Block(超級塊), FSD(檔案系統描述說明), inode table(inode表), inode bitmap(inode位圖)和block bitmap(資料塊位圖) 5部分組成.

1. Super Block(超級塊)

超級塊用于描述整個檔案系統的中繼資料資訊: block大小, block和inode的總量,空閑量,占用量, 檔案系統的挂載和檢測時間等資訊, 超級塊對于整個檔案系統都是至關重要的, 是以會在多個随機的塊組中備份超級塊.

2. FSD(檔案系統說明)

檔案系統說明用于描述目前塊組的中繼資料資訊, 比如塊組區間占用的block的編号範圍.

3. inode table(inode表)

inode表存放的是每個檔案自己的inode條目, 每個inode條目的大小是固定的128KB, 該條目中主要含有對應檔案的兩類資訊: 檔案的中繼資料資訊和檔案的資料塊指針.

3-1. 檔案的中繼資料資訊主要有: 檔案的屬主, 屬組, 通路權限, 時間戳等相關屬性.

3-2. 檔案的資料塊指針用于存放該檔案存儲資料的block塊的位址資訊, 1個inode條目中含有4類指針: 12個直接指針, 1個間接指針, 1個二級間接指針和1個三級間接指針.其中直接指針可以直接指向block資料塊, 間接指針指向一個資料塊之後, 再由該資料塊來指向更多的block資料塊來擷取更多資料塊空間存儲檔案資料, 二級間接指針和三級間接指針以此類推. 每個block本身的位址标号會占用對應指針4B的存儲空間, 是以不同的block塊大小, 能存儲的單個最大檔案大小也不相同.

以block塊大小為1KB為例:

12個直接指針可以指定的block存儲空間為: 12x1KB=12KB;

1個間接指針可以指定的block存儲空間為: 1KB/4BX1KB=256X1KB=256KB

1KB/4BX1KB/4BX1KB=256X256X1KB=65536KB

1KB/4BX1KB/4BX1KB/4BX1KB=256X256X256X1KB=16777216KB

單個檔案總大小為: 48+256+65536+16777216KB=16843020KB=16.06GB

# 因為大于2KB的block會受到ext2檔案系統本身的限制, 該計算方式不适用于block為2KB或4KB大小的block.

4. inode bitmap(inode位圖)

inode位圖使用每個Byte中的單個位用于描述對應位置的indoe條目是否空閑, 主要作用是便于查詢空閑的inode條目和周遊整個inode條目空間.

5. block bitmap(block位圖)

block位圖原理與inode位圖原理類似, 主要作用是便于查詢空間的inode條目和周遊整個inode條目空間.

以上就是Ext2檔案系統的邏輯結構.

=============================================================

Ext3檔案系統

Ext3檔案系統會将磁盤分區劃分為3種區域: 中繼資料區, 資料區和日志區域, 其中(journal area)日志區域是Ext3檔案系統和Ext2檔案系統的最大差別, 如下圖所示:

Linux中的Ext2、ext3、ext4檔案系統如何對磁盤中的檔案進行存儲和管理

日志區域的主要功能是臨時緩存正在進行I/O操作的檔案的中繼資料資訊, 當該檔案正确傳輸完成後, 該檔案系統就會将臨時緩存的中繼資料資訊存儲至檔案系統的中繼資料區中. 日志區域的最大優點是對于執行I/O操作的檔案資訊發生故障時, 檔案系統不需要周遊整個檔案系統的中繼資料區來查找發生故障的block資料塊資訊, 隻需要查找日志區域中臨時緩存的中繼資料即可, 大大縮短了查詢時間.

Ext3檔案系統的中繼資料區和資料區的結構和功能與Ext2檔案系統相同, 此處就不再複述.

EXT3與EXT4的主要差別 

Linux kernel自2.6.28開始正式支援新的檔案系統 Ext4。 Ext4是Ext3的改進版,修改了Ext3中部分重要的資料結構,而不僅僅像Ext3對Ext2那樣,隻是增加了一個日志功能而已。Ext4 可以提供更佳的性能和可靠性,還有更為豐富的功能: 

1.與Ext3相容

   執行若幹條指令,就能從Ext3線上遷移到Ext4,而無須重新格式化磁盤或重新安裝系統。原有Ext3資料結構照樣保留,Ext4作用于新資料,當然,整個檔案系統是以也就獲得了Ext4所支援的更大容量。 

2.更大的檔案系統和更大的檔案

   較之Ext3目前所支援的最大16TB檔案系統和最大2TB檔案,Ext4分别支援1EB(1,048,576TB,1EB=1024PB,1PB=1024TB)的檔案系統,以及16TB 的檔案。

3.無限數量的子目錄

   Ext3目前隻支援32,000個子目錄,而Ext4支援無限數量的子目錄。 

4.Extents

   Ext3采用間接塊映射,當操作大檔案時,效率極其低下。比如一個 100MB 大小的檔案,在Ext3中要建立25,600個資料塊(每個資料塊大小為 4KB)的映射表。而Ext4引入了現代檔案系統中流行的extents概念,每個 extent 為一組連續的資料塊,上述檔案則表示為“該檔案資料儲存在接下來的25,600個資料塊中”,提高了不少效率。 

5.多塊配置設定

   當寫入資料到 Ext3 檔案系統中時,Ext3 的資料塊配置設定器每次隻能配置設定一個 4KB 的塊,寫一個 100MB 檔案就要調用 25,600 次資料塊配置設定器,而 Ext4 的多塊配置設定器“multiblock allocator”(mballoc) 支援一次調用配置設定多個資料塊。 

6.延遲配置設定

   Ext3的資料塊配置設定政策是盡快配置設定,而 Ext4 和其它現代檔案作業系統的政策是盡可能地延遲配置設定,直到檔案在 cache 中寫完才開始配置設定資料塊并寫入磁盤,這樣就能優化整個檔案的資料塊配置設定,與前兩種特性搭配起來可以顯著提升性能。 

7.快速 fsck

   以前執行 fsck 第一步就會很慢,因為它要檢查所有的 inode,現在 Ext4 給每個組的 inode 表中都添加了一份未使用 inode 的清單,今後 fsck Ext4 檔案系統就可以跳過它們而隻去檢查那些在用的 inode 了。 

8.日志校驗

   日志是最常用的部分,也極易導緻磁盤硬體故障,而從損壞的日志中恢複資料會導緻更多的資料損壞。Ext4的日志校驗功能可以很友善地判斷日志資料是否損壞,而且它将Ext3 的兩階段日志機制合并成一個階段,在增加安全性的同時提高了性能。 

9.“無日志”(No Journaling)模式

   日志總歸有一些開銷,Ext4允許關閉日志,以便某些有特殊需求的使用者可以借此提升性能。 

10.線上碎片整理

   盡管延遲配置設定、多塊配置設定和extents能有效減少檔案系統碎片,但碎片還是不可避免會産生。Ext4支援線上碎片整理,并将提供e4defrag工具進行個别檔案或整個檔案系統的碎片整理。 

11.inode 相關特性

   Ext4支援更大的inode,較之Ext3預設的inode大小128位元組,Ext4為了在 inode 中容納更多的擴充屬性(如納秒時間戳或inode版本),預設inode大小為256位元組。Ext4 還支援快速擴充屬性(fast extended attributes)和inode保留(inodes reservation)。 

12.持久預配置設定(Persistent preallocation)

   P2P軟體為了保證下載下傳檔案有足夠的空間存放,常常會預先建立一個與所下載下傳檔案大小相同的空檔案,以免未來的數小時或數天之内磁盤空間不足導緻下載下傳失敗。 Ext4在檔案系統層面實作了持久預配置設定并提供相應的API(libc 中的 posix_fallocate()),比應用軟體自己實作更有效率。 

13.預設啟用 barrier

   磁盤上配有内部緩存,以便重新調整批量資料的寫操作順序,優化寫入性能,是以檔案系統必須在日志資料寫入磁盤之後才能寫commit記錄,若commit 記錄寫入在先,而日志有可能損壞,那麼就會影響資料完整性。Ext4預設啟用barrier,隻有當barrier之前的資料全部寫入磁盤,才能寫barrier之後的資料。(可通過“mount -o barrier=0″指令禁用該特性。)

繼續閱讀