很長(zhǎng)一段時(shí)間以來(lái),ext3是很多l(xiāng)inux發(fā)行版默認(rèn)的文件系統(tǒng),現(xiàn)在ext4已經(jīng)發(fā)布,并且已經(jīng)有發(fā)行版開(kāi)始使用ext4作為默認(rèn)的文件系統(tǒng)了(其實(shí)***初的時(shí)候ext4是作為ext3的擴(kuò)展,但是為了保證ext3的穩(wěn)定性等原因,很多人反對(duì)直接對(duì)ext3進(jìn)行擴(kuò)展,所以單獨(dú)作為了ext4項(xiàng)目)。
ext3還是使用15個(gè)inode來(lái)查找數(shù)據(jù)塊,前12個(gè)為直接數(shù)據(jù)塊,直接指向存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)塊,接下來(lái)分別為一級(jí)間接塊,二級(jí)間接塊,三級(jí)間接塊,如下圖:
其中point本來(lái)也是數(shù)據(jù)塊,現(xiàn)在拿來(lái)做數(shù)據(jù)塊的索引用,其中ext3的頭文件定義為:__u32 i_block[EXT3_N_BLOCKS];/* Pointers to blocks */,所以可以計(jì)算ext3文件系統(tǒng)的極限:
******分區(qū):
因?yàn)槎x的是無(wú)符號(hào)32位數(shù),所以可能定位的block范圍為2^32,也就是4G,如果一個(gè)block大小為4KB,所以為4G * 4KB = 16TB
******文件:
前面直接指向12個(gè)數(shù)據(jù)塊,一級(jí)間接塊***大為block size / 4,block size就是數(shù)據(jù)塊的大小,因?yàn)橐粋€(gè)索引是4個(gè)字節(jié),所以除以4,這樣計(jì)算下來(lái),***大的文件可以使用的總塊數(shù)為:12 + (block size/4) + (block size/4)^2 + (block size/4)^3,如果block size大小為4K,則為(12 + 2^10 + 2^20 + 2^30) * 2^12 約等于4T。
為了突破ext3這個(gè)大小限制,ext4使用了48位的數(shù)據(jù)塊索引空間,同時(shí)使用了如下結(jié)構(gòu)代替inode索引的方式:
struct ext3_extent {
__u32 ee_block; /* first logical block extent covers */
__u16 ee_len; /* number of blocks covered by extent */
__u16 ee_start_hi; /* high 16 bits of physical block */
__u32 ee_start; /* low 32 bigs of physical block */
};
這樣查找數(shù)據(jù)塊的時(shí)候就不是每個(gè)塊建立一個(gè)索引,而且使用連續(xù)的數(shù)據(jù)塊,也就是分別指示起始位置,以及連續(xù)的塊數(shù),這樣在大文件的時(shí)候,磁盤(pán)io效率以及 查找數(shù)據(jù)塊效率上都有很大的提高,所以ext4的文件系統(tǒng)也比ext3出色。因?yàn)槭褂昧?8位的索引空間,所以在4KB塊大小的情況下,文件系統(tǒng)的極限是 2^48 * 4KB = 1EB,不過(guò),目前由于工具的限制,只能使用16TB的分區(qū)。
EXT3與EXT4的主要區(qū)別
Linux kernel自2.6.28開(kāi)始正式支持新的文件系統(tǒng) Ext4。 Ext4是Ext3的改進(jìn)版,修改了Ext3中部分重要的數(shù)據(jù)結(jié)構(gòu),而不僅僅像Ext3對(duì)Ext2那樣,只是增加了一個(gè)日志功能而已。Ext4 可以提供更佳的性能和可靠性,還有更為豐富的功能:
1.與Ext3兼容。執(zhí)行若干條命令,就能從Ext3在線遷移到Ext4,而無(wú)須重新格式化磁盤(pán)或重新安裝系統(tǒng)。原有Ext3數(shù)據(jù)結(jié)構(gòu)照樣保留,Ext4作用于新數(shù)據(jù),當(dāng)然,整個(gè)文件系統(tǒng)因此也就獲得了Ext4所支持的更大容量。
2.更大的文件系統(tǒng)和更大的文件。較之Ext3目前所支持的******16TB文件系統(tǒng)和***大2TB文件,Ext4分別支持1EB(1,048,576TB,1EB=1024PB,1PB=1024TB)的文件系統(tǒng),以及16TB 的文件。
3.無(wú)限數(shù)量的子目錄。Ext3目前只支持32,000個(gè)子目錄,而Ext4支持無(wú)限數(shù)量的子目錄。
4.Extents。Ext3 采用間接塊映射,當(dāng)操作大文件時(shí),效率極其低下。比如一個(gè) 100MB 大小的文件,在Ext3中要建立25,600個(gè)數(shù)據(jù)塊(每個(gè)數(shù)據(jù)塊大小為 4KB)的映射表。而Ext4引入了現(xiàn)代文件系統(tǒng)中流行的extents概念,每個(gè) extent 為一組連續(xù)的數(shù)據(jù)塊,上述文件則表示為“該文件數(shù)據(jù)保存在接下來(lái)的25,600個(gè)數(shù)據(jù)塊中”,提高了不少效率。
5.多塊分配。當(dāng) 寫(xiě)入數(shù)據(jù)到 Ext3 文件系統(tǒng)中時(shí),Ext3 的數(shù)據(jù)塊分配器每次只能分配一個(gè) 4KB 的塊,寫(xiě)一個(gè) 100MB 文件就要調(diào)用 25,600 次數(shù)據(jù)塊分配器,而 Ext4 的多塊分配器“multiblock allocator”(mballoc) 支持一次調(diào)用分配多個(gè)數(shù)據(jù)塊。
6.延遲分配。Ext3的數(shù)據(jù)塊分配策略是盡快分配,而 Ext4 和其它現(xiàn)代文件操作系統(tǒng)的策略是盡可能地延遲分配,直到文件在 cache 中寫(xiě)完才開(kāi)始分配數(shù)據(jù)塊并寫(xiě)入磁盤(pán),這樣就能優(yōu)化整個(gè)文件的數(shù)據(jù)塊分配,與前兩種特性搭配起來(lái)可以顯著提升性能。
7.快速 fsck。以前執(zhí)行 fsck ******步就會(huì)很慢,因?yàn)樗獧z查所有的 inode,現(xiàn)在 Ext4 給每個(gè)組的 inode 表中都添加了一份未使用 inode 的列表,今后 fsck Ext4 文件系統(tǒng)就可以跳過(guò)它們而只去檢查那些在用的 inode 了。
8.日志校驗(yàn)。日志是***常用的部分,也極易導(dǎo)致磁盤(pán)硬件故障,而從損壞的日志中恢復(fù)數(shù)據(jù)會(huì)導(dǎo)致更多的數(shù)據(jù)損壞。Ext4的日志校驗(yàn)功能可以很方便地判斷日志數(shù)據(jù)是否損壞,而且它將 Ext3 的兩階段日志機(jī)制合并成一個(gè)階段,在增加安全性的同時(shí)提高了性能。
9.“無(wú)日志”(No Journaling)模式。日志總歸有一些開(kāi)銷(xiāo),Ext4允許關(guān)閉日志,以便某些有特殊需求的用戶可以借此提升性能。
10.在線碎片整理。盡管延遲分配、多塊分配和extents能有效減少文件系統(tǒng)碎片,但碎片還是不可避免會(huì)產(chǎn)生。Ext4支持在線碎片整理,并將提供e4defrag工具進(jìn)行個(gè)別文件或整個(gè)文件系統(tǒng)的碎片整理。
11.inode 相關(guān)特性。Ext4 支持更大的inode,較之Ext3默認(rèn)的inode大小128字節(jié),Ext4為了在 inode 中容納更多的擴(kuò)展屬性(如納秒時(shí)間戳或inode版本),默認(rèn)inode大小為256字節(jié)。Ext4 還支持快速擴(kuò)展屬性(fast extended attributes)和inode保留(inodes reservation)。
12.持久預(yù)分配(Persistent preallocation)。 P2P 軟件為了保證下載文件有足夠的空間存放,常常會(huì)預(yù)先創(chuàng)建一個(gè)與所下載文件大小相同的空文件,以免未來(lái)的數(shù)小時(shí)或數(shù)天之內(nèi)磁盤(pán)空間不足導(dǎo)致下載失敗。 Ext4在文件系統(tǒng)層面實(shí)現(xiàn)了持久預(yù)分配并提供相應(yīng)的API(libc 中的 posix_fallocate()),比應(yīng)用軟件自己實(shí)現(xiàn)更有效率。
13.默認(rèn)啟用 barrier。磁 盤(pán)上配有內(nèi)部緩存,以便重新調(diào)整批量數(shù)據(jù)的寫(xiě)操作順序,優(yōu)化寫(xiě)入性能,因此文件系統(tǒng)必須在日志數(shù)據(jù)寫(xiě)入磁盤(pán)之后才能寫(xiě)commit記錄,若commit 記錄寫(xiě)入在先,而日志有可能損壞,那么就會(huì)影響數(shù)據(jù)完整性。Ext4默認(rèn)啟用barrier,只有當(dāng)barrier之前的數(shù)據(jù)全部寫(xiě)入磁盤(pán),才能寫(xiě) barrier之后的數(shù)據(jù)。(可通過(guò)“mount -o barrier=0″命令禁用該特性。)