目前的大部分 Linux 文件系統(tǒng)都默認(rèn)采用 ext4 文件系統(tǒng),正如以前的 Linux 發(fā)行版默認(rèn)使用 ext3、ext2 以及更久前的 ext。
對(duì)于不熟悉 Linux 或文件系統(tǒng)的朋友而言,你可能不清楚 ext4 相對(duì)于上一版本 ext3 帶來(lái)了什么變化。你可能還想知道在一連串關(guān)于替代的文件系統(tǒng)例如 Btrfs、XFS 和 ZFS 不斷被發(fā)布的情況下,ext4 是否仍然能得到進(jìn)一步的發(fā)展。
在一篇文章中,我們不可能講述文件系統(tǒng)的所有方面,但我們嘗試讓你盡快了解 Linux 默認(rèn)文件系統(tǒng)的發(fā)展歷史,包括它的誕生以及未來(lái)發(fā)展。
我仔細(xì)研究了維基百科里的各種關(guān)于 ext 文件系統(tǒng)文章、kernel.org 的 wiki 中關(guān)于 ext4 的條目以及結(jié)合自己的經(jīng)驗(yàn)寫下這篇文章。
ext 簡(jiǎn)史
MINIX 文件系統(tǒng)
在有 ext 之前,使用的是 MINIX 文件系統(tǒng)。如果你不熟悉 Linux 歷史,那么可以理解為 MINIX 是用于 IBM PC/AT 微型計(jì)算機(jī)的一個(gè)非常小的類 Unix 系統(tǒng)。Andrew Tannenbaum 為了教學(xué)的目的而開發(fā)了它,并于 1987 年發(fā)布了源代碼(以印刷版的格式!)。
IBM 1980 中期的 PC/AT,MBlairMartin,CC BY-SA 4.0
雖然你可以細(xì)讀 MINIX 的源代碼,但實(shí)際上它并不是自由開源軟件(FOSS)。出版 Tannebaum 著作的出版商要求你花 69 美元的許可費(fèi)來(lái)運(yùn)行 MINIX,而這筆費(fèi)用包含在書籍的費(fèi)用中。盡管如此,在那時(shí)來(lái)說(shuō)非常便宜,并且 MINIX 的使用得到迅速發(fā)展,很快超過(guò)了 Tannebaum 當(dāng)初使用它來(lái)教授操作系統(tǒng)編碼的意圖。在整個(gè) 20 世紀(jì) 90 年代,你可以發(fā)現(xiàn) MINIX 的安裝在世界各個(gè)大學(xué)里面非常流行。而此時(shí),年輕的 Linus Torvalds 使用 MINIX 來(lái)開發(fā)原始 Linux 內(nèi)核,并于 1991 年首次公布,而后在 1992 年 12 月在 GPL 開源協(xié)議下發(fā)布。
但是等等,這是一篇以文件系統(tǒng)為主題的文章不是嗎?是的,MINIX 有自己的文件系統(tǒng),早期的 Linux 版本依賴于它。跟 MINIX 一樣,Linux 的文件系統(tǒng)也如同玩具那般小 —— MINIX 文件系統(tǒng)最多能處理 14 個(gè)字符的文件名,并且只能處理 64MB 的存儲(chǔ)空間。到了 1991 年,一般的硬盤尺寸已經(jīng)達(dá)到了 40-140 MB。很顯然,Linux 需要一個(gè)更好的文件系統(tǒng)。
ext
當(dāng) Linus 開發(fā)出剛起步的 Linux 內(nèi)核時(shí),Rémy Card 從事第一代的 ext 文件系統(tǒng)的開發(fā)工作。ext 文件系統(tǒng)在 1992 年首次實(shí)現(xiàn)并發(fā)布 —— 僅在 Linux 首次發(fā)布后的一年!—— ext 解決了 MINIX 文件系統(tǒng)中最糟糕的問(wèn)題。
1992 年的 ext 使用在 Linux 內(nèi)核中的新虛擬文件系統(tǒng)(VFS)抽象層。與之前的 MINIX 文件系統(tǒng)不同的是,ext 可以處理高達(dá) 2 GB 存儲(chǔ)空間并處理 255 個(gè)字符的文件名。
但 ext 并沒有長(zhǎng)時(shí)間占統(tǒng)治地位,主要是由于它原始的時(shí)間戳(每個(gè)文件僅有一個(gè)時(shí)間戳,而不是今天我們所熟悉的有 inode、最近文件訪問(wèn)時(shí)間和最新文件修改時(shí)間的時(shí)間戳。)僅僅一年后,ext2 就替代了它。
ext2
Rémy 很快就意識(shí)到 ext 的局限性,所以一年后他設(shè)計(jì)出 ext2 替代它。當(dāng) ext 仍然根植于 “玩具” 操作系統(tǒng)時(shí),ext2 從一開始就被設(shè)計(jì)為一個(gè)商業(yè)級(jí)文件系統(tǒng),沿用 BSD 的 Berkeley 文件系統(tǒng)的設(shè)計(jì)原理。
ext2 提供了 GB 級(jí)別的最大文件大小和 TB 級(jí)別的文件系統(tǒng)大小,使其在 20 世紀(jì) 90 年代的地位牢牢鞏固在文件系統(tǒng)大聯(lián)盟中。很快它被廣泛地使用,無(wú)論是在 Linux 內(nèi)核中還是最終在 MINIX 中,且利用第三方模塊可以使其應(yīng)用于 MacOS 和 Windows。
但這里仍然有一些問(wèn)題需要解決:ext2 文件系統(tǒng)與 20 世紀(jì) 90 年代的大多數(shù)文件系統(tǒng)一樣,如果在將數(shù)據(jù)寫入到磁盤的時(shí)候,系統(tǒng)發(fā)生崩潰或斷電,則容易發(fā)生災(zāi)難性的數(shù)據(jù)損壞。隨著時(shí)間的推移,由于碎片(單個(gè)文件存儲(chǔ)在多個(gè)位置,物理上其分散在旋轉(zhuǎn)的磁盤上),它們也遭受了嚴(yán)重的性能損失。
盡管存在這些問(wèn)題,但今天 ext2 還是用在某些特殊的情況下 —— 最常見的是,作為便攜式 USB 驅(qū)動(dòng)器的文件系統(tǒng)格式。
ext3
1998 年,在 ext2 被采用后的 6 年后,Stephen Tweedie 宣布他正在致力于改進(jìn) ext2。這成了 ext3,并于 2001 年 11 月在 2.4.15 內(nèi)核版本中被采用到 Linux 內(nèi)核主線中。
20 世紀(jì) 90 年代中期的 Packard Bell 計(jì)算機(jī),Spacekid,CC0
在大部分情況下,ext2 在 Linux 發(fā)行版中工作得很好,但像 FAT、FAT32、HFS 和當(dāng)時(shí)的其它文件系統(tǒng)一樣 —— 在斷電時(shí)容易發(fā)生災(zāi)難性的破壞。如果在將數(shù)據(jù)寫入文件系統(tǒng)時(shí)候發(fā)生斷電,則可能會(huì)將其留在所謂不一致的狀態(tài) —— 事情只完成一半而另一半未完成。這可能導(dǎo)致大量文件丟失或損壞,這些文件與正在保存的文件無(wú)關(guān)甚至導(dǎo)致整個(gè)文件系統(tǒng)無(wú)法卸載。
ext3 和 20 世紀(jì) 90 年代后期的其它文件系統(tǒng),如微軟的 NTFS,使用日志來(lái)解決這個(gè)問(wèn)題。日志是磁盤上的一種特殊的分配區(qū)域,其寫入被存儲(chǔ)在事務(wù)中;如果該事務(wù)完成磁盤寫入,則日志中的數(shù)據(jù)將提交給文件系統(tǒng)自身。如果系統(tǒng)在該操作提交前崩潰,則重新啟動(dòng)的系統(tǒng)識(shí)別其為未完成的事務(wù)而將其進(jìn)行回滾,就像從未發(fā)生過(guò)一樣。這意味著正在處理的文件可能依然會(huì)丟失,但文件系統(tǒng)本身保持一致,且其它所有數(shù)據(jù)都是安全的。
在使用 ext3 文件系統(tǒng)的 Linux 內(nèi)核中實(shí)現(xiàn)了三個(gè)級(jí)別的日志記錄方式:日記journal、順序ordered和回寫writeback。
日記是最低風(fēng)險(xiǎn)模式,在將數(shù)據(jù)和元數(shù)據(jù)提交給文件系統(tǒng)之前將其寫入日志。這可以保證正在寫入的文件與整個(gè)文件系統(tǒng)的一致性,但其顯著降低了性能。
順序是大多數(shù) Linux 發(fā)行版默認(rèn)模式;順序模式將元數(shù)據(jù)寫入日志而直接將數(shù)據(jù)提交到文件系統(tǒng)。顧名思義,這里的操作順序是固定的:首先,元數(shù)據(jù)提交到日志;其次,數(shù)據(jù)寫入文件系統(tǒng),然后才將日志中關(guān)聯(lián)的元數(shù)據(jù)更新到文件系統(tǒng)。這確保了在發(fā)生崩潰時(shí),那些與未完整寫入相關(guān)聯(lián)的元數(shù)據(jù)仍在日志中,且文件系統(tǒng)可以在回滾日志時(shí)清理那些不完整的寫入事務(wù)。在順序模式下,系統(tǒng)崩潰可能導(dǎo)致在崩潰期間文件的錯(cuò)誤被主動(dòng)寫入,但文件系統(tǒng)它本身 —— 以及未被主動(dòng)寫入的文件 —— 確保是安全的。
回寫是第三種模式 —— 也是最不安全的日志模式。在回寫模式下,像順序模式一樣,元數(shù)據(jù)會(huì)被記錄到日志,但數(shù)據(jù)不會(huì)。與順序模式不同,元數(shù)據(jù)和數(shù)據(jù)都可以以任何有利于獲得最佳性能的順序?qū)懭搿_@可以顯著提高性能,但安全性低很多。盡管回寫模式仍然保證文件系統(tǒng)本身的安全性,但在崩潰或崩潰之前寫入的文件很容易丟失或損壞。
跟之前的 ext2 類似,ext3 使用 16 位內(nèi)部尋址。這意味著對(duì)于有著 4K 塊大小的 ext3 在最大規(guī)格為 16 TiB 的文件系統(tǒng)中可以處理的最大文件大小為 2 TiB。
ext4
Theodore Ts’o(是當(dāng)時(shí) ext3 主要開發(fā)人員)在 2006 年發(fā)表的 ext4,于兩年后在 2.6.28 內(nèi)核版本中被加入到了 Linux 主線。
Ts’o 將 ext4 描述為一個(gè)顯著擴(kuò)展 ext3 但仍然依賴于舊技術(shù)的臨時(shí)技術(shù)。他預(yù)計(jì) ext4 終將會(huì)被真正的下一代文件系統(tǒng)所取代。
Dell Precision 380 工作站,Lance Fisher,CC BY-SA 2.0
ext4 在功能上與 ext3 在功能上非常相似,但支持大文件系統(tǒng),提高了對(duì)碎片的抵抗力,有更高的性能以及更好的時(shí)間戳。
ext4 vs ext3
ext3 和 ext4 有一些非常明確的差別,在這里集中討論下。
向后兼容性
ext4 特地設(shè)計(jì)為盡可能地向后兼容 ext3。這不僅允許 ext3 文件系統(tǒng)原地升級(jí)到 ext4;也允許 ext4 驅(qū)動(dòng)程序以 ext3 模式自動(dòng)掛載 ext3 文件系統(tǒng),因此使它無(wú)需單獨(dú)維護(hù)兩個(gè)代碼庫(kù)。
大文件系統(tǒng)
ext3 文件系統(tǒng)使用 32 位尋址,這限制它僅支持 2 TiB 文件大小和 16 TiB 文件系統(tǒng)系統(tǒng)大小(這是假設(shè)在塊大小為 4 KiB 的情況下,一些 ext3 文件系統(tǒng)使用更小的塊大小,因此對(duì)其進(jìn)一步被限制)。
ext4 使用 48 位的內(nèi)部尋址,理論上可以在文件系統(tǒng)上分配高達(dá) 16 TiB 大小的文件,其中文件系統(tǒng)大小最高可達(dá) 1000000 TiB(1 EiB)。在早期 ext4 的實(shí)現(xiàn)中有些用戶空間的程序仍然將其限制為最大大小為 16 TiB 的文件系統(tǒng),但截至 2011 年,e2fsprogs 已經(jīng)直接支持大于 16 TiB 大小的 ext4 文件系統(tǒng)。例如,紅帽企業(yè) Linux 在其合同上僅支持最高 50 TiB 的 ext4 文件系統(tǒng),并建議 ext4 卷不超過(guò) 100 TiB。
分配方式改進(jìn)
ext4 在將存儲(chǔ)塊寫入磁盤之前對(duì)存儲(chǔ)塊的分配方式進(jìn)行了大量改進(jìn),這可以顯著提高讀寫性能。
區(qū)段
區(qū)段extent是一系列連續(xù)的物理塊 (最多達(dá) 128 MiB,假設(shè)塊大小為 4 KiB),可以一次性保留和尋址。使用區(qū)段可以減少給定文件所需的 inode 數(shù)量,并顯著減少碎片并提高寫入大文件時(shí)的性能。
多塊分配
ext3 為每一個(gè)新分配的塊調(diào)用一次塊分配器。當(dāng)多個(gè)寫入同時(shí)打開分配器時(shí),很容易導(dǎo)致嚴(yán)重的碎片。然而,ext4 使用延遲分配,這允許它合并寫入并更好地決定如何為尚未提交的寫入分配塊。
持久的預(yù)分配
在為文件預(yù)分配磁盤空間時(shí),大部分文件系統(tǒng)必須在創(chuàng)建時(shí)將零寫入該文件的塊中。ext4 允許替代使用fallocate(),它保證了空間的可用性(并試圖為它找到連續(xù)的空間),而不需要先寫入它。這顯著提高了寫入和將來(lái)讀取流和數(shù)據(jù)庫(kù)應(yīng)用程序的寫入數(shù)據(jù)的性能。
延遲分配
這是一個(gè)耐人尋味而有爭(zhēng)議性的功能。延遲分配允許 ext4 等待分配將寫入數(shù)據(jù)的實(shí)際塊,直到它準(zhǔn)備好將數(shù)據(jù)提交到磁盤。(相比之下,即使數(shù)據(jù)仍然在往寫入緩存中寫入,ext3 也會(huì)立即分配塊。)
當(dāng)緩存中的數(shù)據(jù)累積時(shí),延遲分配塊允許文件系統(tǒng)對(duì)如何分配塊做出更好的選擇,降低碎片(寫入,以及稍后的讀)并顯著提升性能。然而不幸的是,它增加了還沒有專門調(diào)用fsync()方法(當(dāng)程序員想確保數(shù)據(jù)完全刷新到磁盤時(shí))的程序的數(shù)據(jù)丟失的可能性。
假設(shè)一個(gè)程序完全重寫了一個(gè)文件:
fd=open("file", O_TRUNC); write(fd, data); close(fd);
使用舊的文件系統(tǒng),close(fd); 足以保證 file 中的內(nèi)容刷新到磁盤。即使嚴(yán)格來(lái)說(shuō),寫不是事務(wù)性的,但如果文件關(guān)閉后發(fā)生崩潰,則丟失數(shù)據(jù)的風(fēng)險(xiǎn)很小。
如果寫入不成功(由于程序上的錯(cuò)誤、磁盤上的錯(cuò)誤、斷電等),文件的原始版本和較新版本都可能丟失數(shù)據(jù)或損壞。如果其它進(jìn)程在寫入文件時(shí)訪問(wèn)文件,則會(huì)看到損壞的版本。如果其它進(jìn)程打開文件并且不希望其內(nèi)容發(fā)生更改 —— 例如,映射到多個(gè)正在運(yùn)行的程序的共享庫(kù)。這些進(jìn)程可能會(huì)崩潰。
為了避免這些問(wèn)題,一些程序員完全避免使用 O_TRUNC。相反,他們可能會(huì)寫入一個(gè)新文件,關(guān)閉它,然后將其重命名為舊文件名:
fd=open("newfile"); write(fd, data); close(fd); rename("newfile", "file");
在 沒有 延遲分配的文件系統(tǒng)下,這足以避免上面列出的潛在的損壞和崩潰問(wèn)題:因?yàn)?rename() 是原子操作,所以它不會(huì)被崩潰中斷;并且運(yùn)行的程序?qū)⒗^續(xù)引用舊的文件。現(xiàn)在 file 的未鏈接版本只要有一個(gè)打開的文件文件句柄即可。但是因?yàn)?ext4 的延遲分配會(huì)導(dǎo)致寫入被延遲和重新排序,rename("newfile", "file") 可以在 newfile 的內(nèi)容實(shí)際寫入磁盤內(nèi)容之前執(zhí)行,這出現(xiàn)了并行進(jìn)行再次獲得 file 壞版本的問(wèn)題。
為了緩解這種情況,Linux 內(nèi)核(自版本 2.6.30)嘗試檢測(cè)這些常見代碼情況并強(qiáng)制立即分配。這會(huì)減少但不能防止數(shù)據(jù)丟失的可能性 —— 并且它對(duì)新文件沒有任何幫助。如果你是一位開發(fā)人員,請(qǐng)注意:保證數(shù)據(jù)立即寫入磁盤的唯一方法是正確調(diào)用 fsync()。
無(wú)限制的子目錄
ext3 僅限于 32000 個(gè)子目錄;ext4 允許無(wú)限數(shù)量的子目錄。從 2.6.23 內(nèi)核版本開始,ext4 使用 HTree 索引來(lái)減少大量子目錄的性能損失。
日志校驗(yàn)
ext3 沒有對(duì)日志進(jìn)行校驗(yàn),這給處于內(nèi)核直接控制之外的磁盤或自帶緩存的控制器設(shè)備帶來(lái)了問(wèn)題。如果控制器或具自帶緩存的磁盤脫離了寫入順序,則可能會(huì)破壞 ext3 的日記事務(wù)順序,從而可能破壞在崩潰期間(或之前一段時(shí)間)寫入的文件。
理論上,這個(gè)問(wèn)題可以使用寫入障礙barrier —— 在安裝文件系統(tǒng)時(shí),你在掛載選項(xiàng)設(shè)置 barrier=1,然后設(shè)備就會(huì)忠實(shí)地執(zhí)行 fsync 一直向下到底層硬件。通過(guò)實(shí)踐,可以發(fā)現(xiàn)存儲(chǔ)設(shè)備和控制器經(jīng)常不遵守寫入障礙 —— 提高性能(和跟競(jìng)爭(zhēng)對(duì)手比較的性能基準(zhǔn)),但增加了本應(yīng)該防止數(shù)據(jù)損壞的可能性。
對(duì)日志進(jìn)行校驗(yàn)和允許文件系統(tǒng)崩潰后第一次掛載時(shí)意識(shí)到其某些條目是無(wú)效或無(wú)序的。因此,這避免了回滾部分條目或無(wú)序日志條目的錯(cuò)誤,并進(jìn)一步損壞的文件系統(tǒng) —— 即使部分存儲(chǔ)設(shè)備假做或不遵守寫入障礙。
快速文件系統(tǒng)檢查
在 ext3 下,在 fsck 被調(diào)用時(shí)會(huì)檢查整個(gè)文件系統(tǒng) —— 包括已刪除或空文件。相比之下,ext4 標(biāo)記了 inode 表未分配的塊和扇區(qū),從而允許 fsck 完全跳過(guò)它們。這大大減少了在大多數(shù)文件系統(tǒng)上運(yùn)行 fsck 的時(shí)間,它實(shí)現(xiàn)于內(nèi)核 2.6.24。
改進(jìn)的時(shí)間戳
ext3 提供粒度為一秒的時(shí)間戳。雖然足以滿足大多數(shù)用途,但任務(wù)關(guān)鍵型應(yīng)用程序經(jīng)常需要更嚴(yán)格的時(shí)間控制。ext4 通過(guò)提供納秒級(jí)的時(shí)間戳,使其可用于那些企業(yè)、科學(xué)以及任務(wù)關(guān)鍵型的應(yīng)用程序。
ext3 文件系統(tǒng)也沒有提供足夠的位來(lái)存儲(chǔ) 2038 年 1 月 18 日以后的日期。ext4 在這里增加了兩個(gè)位,將 Unix 紀(jì)元擴(kuò)展了 408 年。如果你在公元 2446 年讀到這篇文章,你很有可能已經(jīng)轉(zhuǎn)移到一個(gè)更好的文件系統(tǒng) —— 如果你還在測(cè)量自 1970 年 1 月 1 日 00:00(UTC)以來(lái)的時(shí)間,這會(huì)讓我死后得以安眠。
在線碎片整理
ext2 和 ext3 都不直接支持在線碎片整理 —— 即在掛載時(shí)會(huì)對(duì)文件系統(tǒng)進(jìn)行碎片整理。ext2 有一個(gè)包含的實(shí)用程序 e2defrag,它的名字暗示 —— 它需要在文件系統(tǒng)未掛載時(shí)脫機(jī)運(yùn)行。(顯然,這對(duì)于根文件系統(tǒng)來(lái)說(shuō)非常有問(wèn)題。)在 ext3 中的情況甚至更糟糕 —— 雖然 ext3 比 ext2 更不容易受到嚴(yán)重碎片的影響,但 ext3 文件系統(tǒng)運(yùn)行 e2defrag 可能會(huì)導(dǎo)致災(zāi)難性損壞和數(shù)據(jù)丟失。
盡管 ext3 最初被認(rèn)為“不受碎片影響”,但對(duì)同一文件(例如 BitTorrent)采用大規(guī)模并行寫入過(guò)程的過(guò)程清楚地表明情況并非完全如此。一些用戶空間的手段和解決方法,例如 Shake,以這樣或那樣方式解決了這個(gè)問(wèn)題 —— 但它們比真正的、文件系統(tǒng)感知的、內(nèi)核級(jí)碎片整理過(guò)程更慢并且在各方面都不太令人滿意。
ext4 通過(guò) e4defrag 解決了這個(gè)問(wèn)題,且是一個(gè)在線、內(nèi)核模式、文件系統(tǒng)感知、塊和區(qū)段級(jí)別的碎片整理實(shí)用程序。
正在進(jìn)行的 ext4 開發(fā)
ext4,正如 Monty Python 中瘟疫感染者曾經(jīng)說(shuō)過(guò)的那樣,“我還沒死呢!”雖然它的主要開發(fā)人員認(rèn)為它只是一個(gè)真正的下一代文件系統(tǒng)的權(quán)宜之計(jì),但是在一段時(shí)間內(nèi),沒有任何可能的候選人準(zhǔn)備好(由于技術(shù)或許可問(wèn)題)部署為根文件系統(tǒng)。
在未來(lái)的 ext4 版本中仍然有一些關(guān)鍵功能要開發(fā),包括元數(shù)據(jù)校驗(yàn)和、一流的配額支持和大分配塊。
元數(shù)據(jù)校驗(yàn)和
由于 ext4 具有冗余超級(jí)塊,因此為文件系統(tǒng)校驗(yàn)其中的元數(shù)據(jù)提供了一種方法,可以自行確定主超級(jí)塊是否已損壞并需要使用備用塊。可以在沒有校驗(yàn)和的情況下,從損壞的超級(jí)塊恢復(fù) —— 但是用戶首先需要意識(shí)到它已損壞,然后嘗試使用備用方法手動(dòng)掛載文件系統(tǒng)。由于在某些情況下,使用損壞的主超級(jí)塊安裝文件系統(tǒng)讀寫可能會(huì)造成進(jìn)一步的損壞,即使是經(jīng)驗(yàn)豐富的用戶也無(wú)法避免,這也不是一個(gè)完美的解決方案!
與 Btrfs 或 ZFS 等下一代文件系統(tǒng)提供的極其強(qiáng)大的每塊校驗(yàn)和相比,ext4 的元數(shù)據(jù)校驗(yàn)和的功能非常弱。但它總比沒有好。雖然校驗(yàn) 所有的事情 都聽起來(lái)很簡(jiǎn)單!—— 事實(shí)上,將校驗(yàn)和與文件系統(tǒng)連接到一起有一些重大的挑戰(zhàn);請(qǐng)參閱設(shè)計(jì)文檔了解詳細(xì)信息。
一流的配額支持
等等,配額?!從 ext2 出現(xiàn)的那天開始我們就有了這些!是的,但它們一直都是事后的添加的東西,而且它們總是犯傻。這里可能不值得詳細(xì)介紹,但設(shè)計(jì)文檔列出了配額將從用戶空間移動(dòng)到內(nèi)核中的方式,并且能夠更加正確和高效地執(zhí)行。
大分配塊
隨著時(shí)間的推移,那些討厭的存儲(chǔ)系統(tǒng)不斷變得越來(lái)越大。由于一些固態(tài)硬盤已經(jīng)使用 8K 硬件塊大小,因此 ext4 對(duì) 4K 模塊的當(dāng)前限制越來(lái)越受到限制。較大的存儲(chǔ)塊可以顯著減少碎片并提高性能,代價(jià)是增加“松弛”空間(當(dāng)你只需要塊的一部分來(lái)存儲(chǔ)文件或文件的最后一塊時(shí)留下的空間)。
你可以在設(shè)計(jì)文檔中查看詳細(xì)說(shuō)明。
ext4 的實(shí)際限制
ext4 是一個(gè)健壯、穩(wěn)定的文件系統(tǒng)。如今大多數(shù)人都應(yīng)該在用它作為根文件系統(tǒng),但它無(wú)法處理所有需求。讓我們簡(jiǎn)單地談?wù)勀悴粦?yīng)該期待的一些事情 —— 現(xiàn)在或可能在未來(lái):
雖然 ext4 可以處理高達(dá) 1 EiB 大小(相當(dāng)于 1,000,000 TiB)大小的數(shù)據(jù),但你 真的 不應(yīng)該嘗試這樣做。除了能夠記住更多塊的地址之外,還存在規(guī)模上的問(wèn)題。并且現(xiàn)在 ext4 不會(huì)處理(并且可能永遠(yuǎn)不會(huì))超過(guò) 50-100 TiB 的數(shù)據(jù)。
ext4 也不足以保證數(shù)據(jù)的完整性。隨著日志記錄的重大進(jìn)展又回到了 ext3 的那個(gè)時(shí)候,它并未涵蓋數(shù)據(jù)損壞的許多常見原因。如果數(shù)據(jù)已經(jīng)在磁盤上被破壞 —— 由于故障硬件,宇宙射線的影響(是的,真的),或者只是數(shù)據(jù)隨時(shí)間衰減 —— ext4 無(wú)法檢測(cè)或修復(fù)這種損壞。
基于上面兩點(diǎn),ext4 只是一個(gè)純 文件系統(tǒng),而不是存儲(chǔ)卷管理器。這意味著,即使你有多個(gè)磁盤 —— 也就是奇偶校驗(yàn)或冗余,理論上你可以從 ext4 中恢復(fù)損壞的數(shù)據(jù),但無(wú)法知道使用它是否對(duì)你有利。雖然理論上可以在不同的層中分離文件系統(tǒng)和存儲(chǔ)卷管理系統(tǒng)而不會(huì)丟失自動(dòng)損壞檢測(cè)和修復(fù)功能,但這不是當(dāng)前存儲(chǔ)系統(tǒng)的設(shè)計(jì)方式,并且它將給新設(shè)計(jì)帶來(lái)重大挑戰(zhàn)。
備用文件系統(tǒng)
在我們開始之前,提醒一句:要非常小心,沒有任何備用的文件系統(tǒng)作為主線內(nèi)核的一部分而內(nèi)置和直接支持!
即使一個(gè)文件系統(tǒng)是 安全的,如果在內(nèi)核升級(jí)期間出現(xiàn)問(wèn)題,使用它作為根文件系統(tǒng)也是非常可怕的。如果你沒有充分的理由通過(guò)一個(gè) chroot 去使用替代介質(zhì)引導(dǎo),耐心地操作內(nèi)核模塊、grub 配置和 DKMS……不要在一個(gè)很重要的系統(tǒng)中去掉預(yù)留的根文件。
可能有充分的理由使用你的發(fā)行版不直接支持的文件系統(tǒng) —— 但如果你這樣做,我強(qiáng)烈建議你在系統(tǒng)啟動(dòng)并可用后再安裝它。(例如,你可能有一個(gè) ext4 根文件系統(tǒng),但是將大部分?jǐn)?shù)據(jù)存儲(chǔ)在 ZFS 或 Btrfs 池中。)
XFS
XFS 與非 ext 文件系統(tǒng)在 Linux 中的主線中的地位一樣。它是一個(gè) 64 位的日志文件系統(tǒng),自 2001 年以來(lái)內(nèi)置于 Linux 內(nèi)核中,為大型文件系統(tǒng)和高度并發(fā)性提供了高性能(即大量的進(jìn)程都會(huì)立即寫入文件系統(tǒng))。
從 RHEL 7 開始,XFS 成為 Red Hat Enterprise Linux 的默認(rèn)文件系統(tǒng)。對(duì)于家庭或小型企業(yè)用戶來(lái)說(shuō),它仍然有一些缺點(diǎn) —— 最值得注意的是,重新調(diào)整現(xiàn)有 XFS 文件系統(tǒng)是一件非常痛苦的事情,不如創(chuàng)建另一個(gè)并復(fù)制數(shù)據(jù)更有意義。
雖然 XFS 是穩(wěn)定的且是高性能的,但它和 ext4 之間沒有足夠具體的最終用途差異,以值得推薦在非默認(rèn)(如 RHEL7)的任何地方使用它,除非它解決了對(duì) ext4 的特定問(wèn)題,例如大于 50 TiB 容量的文件系統(tǒng)。
XFS 在任何方面都不是 ZFS、Btrfs 甚至 WAFL(一個(gè)專有的 SAN 文件系統(tǒng))的“下一代”文件系統(tǒng)。就像 ext4 一樣,它應(yīng)該被視為一種更好的方式的權(quán)宜之計(jì)。
ZFS
ZFS 由 Sun Microsystems 開發(fā),以 zettabyte 命名 —— 相當(dāng)于 1 萬(wàn)億 GB —— 因?yàn)樗碚撋峡梢越鉀Q大型存儲(chǔ)系統(tǒng)。
作為真正的下一代文件系統(tǒng),ZFS 提供卷管理(能夠在單個(gè)文件系統(tǒng)中處理多個(gè)單獨(dú)的存儲(chǔ)設(shè)備),塊級(jí)加密校驗(yàn)和(允許以極高的準(zhǔn)確率檢測(cè)數(shù)據(jù)損壞),自動(dòng)損壞修復(fù)(其中冗余或奇偶校驗(yàn)存儲(chǔ)可用),快速異步增量復(fù)制,內(nèi)聯(lián)壓縮等,以及更多。
從 Linux 用戶的角度來(lái)看,ZFS 的最大問(wèn)題是許可證問(wèn)題。ZFS 許可證是 CDDL 許可證,這是一種與 GPL 沖突的半許可的許可證。關(guān)于在 Linux 內(nèi)核中使用 ZFS 的意義存在很多爭(zhēng)議,其爭(zhēng)議范圍從“它是 GPL 違規(guī)”到“它是 CDDL 違規(guī)”到“它完全沒問(wèn)題,它還沒有在法庭上進(jìn)行過(guò)測(cè)試。”最值得注意的是,自 2016 年以來(lái) Canonical 已將 ZFS 代碼內(nèi)聯(lián)在其默認(rèn)內(nèi)核中,而且目前尚無(wú)法律挑戰(zhàn)。
此時(shí),即使我作為一個(gè)非常狂熱于 ZFS 的用戶,我也不建議將 ZFS 作為 Linux 的根文件系統(tǒng)。如果你想在 Linux 上利用 ZFS 的優(yōu)勢(shì),用 ext4 設(shè)置一個(gè)小的根文件系統(tǒng),然后將 ZFS 用在你剩余的存儲(chǔ)上,把數(shù)據(jù)、應(yīng)用程序以及你喜歡的東西放在它上面 —— 但把 root 分區(qū)保留在 ext4 上,直到你的發(fā)行版明確支持 ZFS 根目錄。
Btrfs
Btrfs 是 B-Tree Filesystem 的簡(jiǎn)稱,通常發(fā)音為 “butter” —— 由 Chris Mason 于 2007 年在 Oracle 任職期間發(fā)布。Btrfs 旨在跟 ZFS 有大部分相同的目標(biāo),提供多種設(shè)備管理、每塊校驗(yàn)、異步復(fù)制、直列壓縮等,還有更多。
截至 2018 年,Btrfs 相當(dāng)穩(wěn)定,可用作標(biāo)準(zhǔn)的單磁盤文件系統(tǒng),但可能不應(yīng)該依賴于卷管理器。與許多常見用例中的 ext4、XFS 或 ZFS 相比,它存在嚴(yán)重的性能問(wèn)題,其下一代功能 —— 復(fù)制、多磁盤拓?fù)浜涂煺展芾?—— 可能非常多,其結(jié)果可能是從災(zāi)難性地性能降低到實(shí)際數(shù)據(jù)的丟失。
Btrfs 的維持狀態(tài)是有爭(zhēng)議的;SUSE Enterprise Linux 在 2015 年采用它作為默認(rèn)文件系統(tǒng),而 Red Hat 于 2017 年宣布它從 RHEL 7.4 開始不再支持 Btrfs。可能值得注意的是,該產(chǎn)品支持 Btrfs 部署用作單磁盤文件系統(tǒng),而不是像 ZFS 中的多磁盤卷管理器,甚至 Synology 在它的存儲(chǔ)設(shè)備使用 Btrfs,但是它在傳統(tǒng) Linux 內(nèi)核 RAID(mdraid)之上分層來(lái)管理磁盤。
-
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209328 -
文件系統(tǒng)
+關(guān)注
關(guān)注
0文章
284瀏覽量
19904
原文標(biāo)題:深入理解 ext4 等 Linux 文件系統(tǒng)
文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論