第二擴充套件檔案系統

ext2 最初於 1993 年 1 月釋出。由 R'emy Card、Theodore Ts'o 和 Stephen Tweedie 編寫,是對擴充套件檔案系統的重大重寫。目前(2001 年 4 月)它仍然是 Linux 使用的主要檔案系統。還有適用於 NetBSD、FreeBSD、GNU HURD、Windows 95/98/NT、OS/2 和 RISC OS 的實現。

選項

大多數預設值由檔案系統超級塊確定,可以使用 tune2fs(8) 設定。核心確定的預設值用 (*) 表示。

bsddf

(*)

使 df 的行為類似於 BSD。

minixdf

使 df 的行為類似於 Minix。

check=none, nocheck

(*)

在掛載時不進行額外的點陣圖檢查(移除了 check=normal 和 check=strict 選項)

dax

使用直接訪問(無頁面快取)。請參閱 檔案的直接訪問

debug

額外的除錯資訊被髮送到核心 syslog。對開發人員很有用。

errors=continue

在檔案系統錯誤時繼續。

errors=remount-ro

在錯誤時將檔案系統重新掛載為只讀。

errors=panic

如果發生錯誤,則停止機器。

grpid, bsdgroups

給物件與其父物件相同的組 ID。

nogrpid, sysvgroups

新物件的組 ID 為其建立者的組 ID。

nouid32

使用 16 位 UID 和 GID。

oldalloc

啟用舊的塊分配器。Orlov 應該有更好的效能,如果對您來說情況相反,我們希望得到一些反饋。

orlov

(*)

使用 Orlov 塊分配器。(參見 http://lwn.net/Articles/14633/http://lwn.net/Articles/14446/。)

resuid=n

可以使用保留塊的使用者 ID。

resgid=n

可以使用保留塊的組 ID。

sb=n

在此位置使用備用超級塊。

user_xattr

啟用 “user.” POSIX 擴充套件屬性(需要 CONFIG_EXT2_FS_XATTR)。

nouser_xattr

不支援 “user.” 擴充套件屬性。

acl

啟用 POSIX 訪問控制列表支援(需要 CONFIG_EXT2_FS_POSIX_ACL)。

noacl

不支援 POSIX ACL。

quota, usrquota

啟用使用者磁碟配額支援(需要 CONFIG_QUOTA)。

grpquota

啟用組磁碟配額支援(需要 CONFIG_QUOTA)。

ext2 靜默忽略 noquota 選項。

規範

ext2 與傳統的 Unix 檔案系統共享許多屬性。它具有塊、inode 和目錄的概念。它在規範中為訪問控制列表 (ACL)、片段、取消刪除和壓縮留有空間,儘管這些尚未實現(有些可作為單獨的補丁提供)。還有一個版本控制機制,允許以最大程度的相容方式新增新功能(例如日誌)。

裝置或檔案中的空間被分成塊。這些是固定大小的,為 1024、2048 或 4096 位元組(Alpha 系統上為 8192 位元組),這是在建立檔案系統時決定的。較小的塊意味著每個檔案的浪費空間更少,但需要稍微更多的會計開銷,並且還對檔案和檔案系統的大小施加了其他限制。

塊組

塊被聚集到塊組中,以減少碎片並最大限度地減少讀取大量連續資料時的磁頭尋道量。有關每個塊組的資訊儲存在緊跟在超級塊之後的塊中的描述符表中。每個組開始附近的兩個塊保留用於塊使用點陣圖和 inode 使用點陣圖,它們顯示哪些塊和 inode 正在使用中。由於每個點陣圖都限制為單個塊,這意味著塊組的最大大小是塊大小的 8 倍。

每個塊組中點陣圖後面的塊被指定為該塊組的 inode 表,其餘的是資料塊。塊分配演算法嘗試在與包含資料塊的 inode 相同的塊組中分配資料塊。

超級塊

超級塊包含有關檔案系統配置的所有資訊。超級塊的主要副本儲存在距裝置開頭 1024 位元組的偏移量處,這對於掛載檔案系統至關重要。由於它非常重要,超級塊的備份副本儲存在整個檔案系統的塊組中。ext2 的第一個版本(修訂版 0)在每個塊組的開頭儲存一個副本,以及組描述符塊的備份。因為這會佔用大型檔案系統的相當大的空間,所以稍後的修訂版可以選擇透過僅將備份放在特定組中來減少備份副本的數量(這是稀疏超級塊功能)。選擇的組是 0、1 以及 3、5 和 7 的冪。

超級塊中的資訊包含諸如檔案系統中 inode 和塊的總數以及有多少是空閒的、每個塊組中有多少 inode 和塊、檔案系統的掛載時間(以及是否乾淨地解除安裝了)、修改時間、檔案系統的版本(請參閱下面的修訂部分)以及哪個作業系統建立了它。

如果檔案系統是修訂版 1 或更高版本,則會有額外的欄位,例如卷名、唯一標識號、inode 大小以及用於儲存配置資訊的可選檔案系統功能的空間。

超級塊中的所有欄位(以及所有其他 ext2 結構中)都以小端格式儲存在磁碟上,因此檔案系統可以在機器之間移植,而無需知道它是在哪臺機器上建立的。

Inodes

inode(索引節點)是 ext2 檔案系統中的一個基本概念。檔案系統中的每個物件都由一個 inode 表示。inode 結構包含指向包含物件中儲存的資料的檔案系統塊的指標,以及除其名稱之外的有關物件的所有元資料。有關物件的元資料包括許可權、所有者、組、標誌、大小、使用的塊數、訪問時間、更改時間、修改時間、刪除時間、連結數、片段、版本(對於 NFS)以及擴充套件屬性 (EA) 和/或訪問控制列表 (ACL)。

inode 結構中有一些保留欄位當前未使用,還有幾個欄位已過載。如果 inode 是目錄,則保留一個欄位用於目錄 ACL;如果 inode 是常規檔案,則保留一個欄位用於檔案大小的前 32 位(允許檔案大小大於 2GB)。翻譯器欄位在 Linux 下未使用,但 HURD 使用它來引用將用於解釋此物件的程式的 inode。大多數剩餘的保留欄位已被 Linux 和 HURD 用於更大的所有者和組欄位。HURD 也有一個更大的模式欄位,因此它使用另一個剩餘欄位來儲存額外的更多位。

有指向包含檔案資料的前 12 個塊的指標在 inode 中。有一個指向間接塊的指標(其中包含指向下一組塊的指標),一個指向雙重間接塊的指標(其中包含指向間接塊的指標)和一個指向三重間接塊的指標(其中包含指向雙重間接塊的指標)。

標誌欄位包含一些 ext2 特定的標誌,這些標誌無法透過標準 chmod 標誌進行處理。可以使用 lsattr 列出這些標誌,並使用 chattr 命令更改,並允許在每個檔案的基礎上進行特定的檔案系統行為。有用於安全刪除、不可刪除、壓縮、同步更新、不變性、僅附加、可轉儲、no-atime、索引目錄和資料日誌的標誌。並非所有這些都已支援。

目錄

目錄是一個檔案系統物件,並且具有像檔案一樣的 inode。它是一個特殊格式的檔案,包含將每個名稱與 inode 編號關聯的記錄。檔案系統的更高版本還對物件型別(檔案、目錄、符號連結、裝置、fifo、套接字)進行編碼,以避免需要檢查 inode 本身以獲取此資訊(Glibc 2.2 中尚不存在利用此功能的支援)。

inode 分配程式碼嘗試分配與首次建立的目錄位於同一塊組中的 inode。

ext2 的當前實現使用單鏈表來儲存目錄中的檔名;一個待處理的增強功能使用檔名的雜湊來允許查詢,而無需掃描整個目錄。

當前實現從不刪除分配用於儲存更多檔案的空目錄塊。

特殊檔案

符號連結也是具有 inode 的檔案系統物件。它們值得特別提及,因為如果符號連結小於 60 位元組,則它們的資料儲存在 inode 本身中。它使用通常用於儲存指向資料塊的指標的欄位。這是一個值得的最佳化,因為我們避免為符號連結分配一個完整的塊,並且大多數符號連結小於 60 個字元。

字元和塊特殊裝置永遠不會分配給它們資料塊。相反,它們的裝置編號儲存在 inode 中,再次重用將用於指向資料塊的欄位。

保留空間

在 ext2 中,有一種機制可以為特定使用者(通常是超級使用者)保留一定數量的塊。這旨在允許系統繼續執行,即使非特權使用者填滿了可供他們使用的所有空間(這與檔案系統配額無關)。它還可以防止檔案系統完全填滿,這有助於對抗碎片。

檔案系統檢查

在啟動時,大多數系統在其檔案系統上執行一致性檢查 (e2fsck)。ext2 檔案系統的超級塊包含幾個欄位,這些欄位指示 fsck 是否應該實際執行(因為在啟動時檢查檔案系統如果很大可能需要很長時間)。如果檔案系統未乾淨地解除安裝、超出最大掛載計數或超出檢查之間的最大時間,則 fsck 將執行。

功能相容性

ext2 中使用的相容性功能機制非常複雜。它安全地允許將功能新增到檔案系統,而無需不必要地犧牲與舊版本檔案系統程式碼的相容性。原始修訂版 0 (EXT2_GOOD_OLD_REV) 的 ext2 不支援功能相容性機制,但在修訂版 1 中引入了該機制。有三個 32 位欄位,一個用於相容功能 (COMPAT),一個用於只讀相容 (RO_COMPAT) 功能,一個用於不相容 (INCOMPAT) 功能。

這些功能標誌對核心具有特定含義,如下所示

COMPAT 標誌表示檔案系統中存在某個功能,但磁碟格式與舊的磁碟格式 100% 相容,因此不知道此功能的核心可以讀取/寫入檔案系統,而不會有損壞檔案系統(甚至使其不一致)的任何機會。這本質上只是一個標誌,表示“此檔案系統具有(隱藏)功能”,核心或 e2fsck 可能需要注意(稍後會詳細介紹 e2fsck 和功能標誌)。ext3 HAS_JOURNAL 功能是一個 COMPAT 標誌,因為 ext3 日誌只是一個帶有資料塊的常規檔案,因此如果核心不瞭解 ext3 日誌,則無需特別注意它。

RO_COMPAT 標誌表示磁碟格式對於讀取與舊的磁碟格式 100% 相容(即,該功能不會更改可見的磁碟格式)。但是,舊核心寫入此類檔案系統會/可能會損壞檔案系統,因此會阻止這種情況。最常見的此類功能 SPARSE_SUPER 是一個 RO_COMPAT 功能,因為稀疏組允許檔案資料塊位於以前用於儲存超級塊/組描述符備份的位置,並且 ext2_free_blocks() 拒絕釋放這些塊,這會導致點陣圖不一致。如果舊核心嘗試釋放一系列跨越組邊界的塊,也會收到錯誤,但這是 SPARSE_SUPER 檔案系統中的合法佈局。

INCOMPAT 標誌表示磁碟格式已以某種方式更改,使得舊核心無法讀取該格式,或者如果舊核心嘗試掛載它,則會導致問題。FILETYPE 是一個 INCOMPAT 標誌,因為舊核心會認為檔名長於 256 個字元,這會導致目錄列表損壞。COMPRESSION 標誌是一個明顯的 INCOMPAT 標誌 - 如果核心不瞭解壓縮,您只會從 read() 收到垃圾,而不是自動解壓縮您的資料。需要 ext3 RECOVER 標誌來防止不了解 ext3 日誌的核心在不重放日誌的情況下掛載檔案系統。

對於 e2fsck,它需要比核心更嚴格地處理這些標誌。如果它不瞭解任何 COMPAT、RO_COMPAT 或 INCOMPAT 標誌,它將拒絕檢查檔案系統,因為它無法驗證給定功能是否有效。允許 e2fsck 在具有未知功能的檔案系統上成功執行是使用者的錯誤安全感。拒絕檢查具有未知功能的檔案系統可以很好地激勵使用者更新到最新的 e2fsck。這也意味著任何將功能標誌新增到 ext2 的人都需要更新 e2fsck 以驗證這些功能。

元資料

經常有人聲稱 ext2 非同步元資料的寫入實現比 ffs 同步元資料方案更快,但可靠性較差。兩種方法都可以透過各自的 fsck 程式同樣解決。

如果您非常偏執,則有 3 種方法可以在 ext2 上同步元資料寫入

  • 如果每個檔案都有程式原始碼:使用 O_SYNC 標誌來 open()

  • 如果每個檔案沒有原始碼:在檔案上使用“chattr +S”

  • 每個檔案系統:將“sync”選項新增到 mount(或在 /etc/fstab 中)

第一個和最後一個不是 ext2 特定的,但確實強制元資料同步寫入。另請參閱下面的日誌。

限制

ext2 的磁碟佈局施加了各種限制。核心程式碼的當前實現施加了其他限制。許多限制在首次建立檔案系統時確定,並取決於選擇的塊大小。inode 與資料塊的比率在檔案系統建立時是固定的,因此增加 inode 數量的唯一方法是增加檔案系統的大小。目前沒有工具可以更改 inode 與塊的比率。

透過稍微更改磁碟格式並使用相容性標誌來表示格式更改(以犧牲一些相容性為代價),可以克服大多數這些限制。

檔案系統塊大小

1kB

2kB

4kB

8kB

檔案大小限制

16GB

256GB

2048GB

2048GB

檔案系統大小限制

2047GB

8192GB

16384GB

32768GB

2.4 核心對單個塊裝置有 2048GB 的限制,因此此時無法建立大於該大小的檔案系統。核心頁面大小也限制了塊大小的上限,因此僅允許在 Alpha 系統(和其他支援較大頁面的架構)上使用 8kB 塊。

單個目錄中最多有 32000 個子目錄。

使用當前線性連結串列目錄實現,單個目錄中的檔案“軟”上限約為 10-15k。此限制源於在此類大型目錄中建立和刪除(以及查詢)檔案時出現的效能問題。使用雜湊目錄索引(正在開發中)允許單個目錄中有 100k-1M+ 檔案,而不會出現效能問題(儘管此時 RAM 大小成為一個問題)。

單個目錄中檔案的(毫無意義的)絕對上限(由檔案大小決定,實際限制顯然要小得多)超過 130 萬億個檔案。它會更高,只是沒有足夠的 4 個字元的名稱來組成唯一的目錄條目,因此它們必須是 8 個字元的檔名,即使那樣我們也非常接近用完唯一的檔名。

日誌

Stephen Tweedie 開發了 ext2 程式碼的日誌擴充套件。它避免了元資料損壞的風險以及在崩潰後等待 e2fsck 完成的需要,而無需更改磁碟上的 ext2 佈局。簡而言之,日誌是一個常規檔案,它儲存已修改的整個元資料(以及可選的資料)塊,然後再將它們寫入檔案系統。這意味著可以向現有 ext2 檔案系統新增日誌,而無需資料轉換。

當對檔案系統進行更改時(例如,重新命名檔案),它們會儲存在日誌中的事務中,並且在崩潰時可以是完整的或不完整的。如果在崩潰時事務已完成(或者在系統未崩潰的正常情況下),則保證該事務中的任何塊都代表有效的檔案系統狀態,並將其複製到檔案系統中。如果在崩潰時事務不完整,則無法保證該事務中塊的一致性,因此它們會被丟棄(這意味著它們表示的任何檔案系統更改也會丟失)。如果您想閱讀有關 ext4 和日誌的更多資訊,請檢視 Documentation/filesystems/ext4/。

參考

核心原始碼

file:/usr/src/linux/fs/ext2/

e2fsprogs (e2fsck)

http://e2fsprogs.sourceforge.net/

設計與實現

http://e2fsprogs.sourceforge.net/ext2intro.html

日誌 (ext3)

ftp://ftp.uk.linux.org/pub/linux/sct/fs/jfs/

檔案系統調整大小

http://ext2resize.sourceforge.net/

壓縮 [1]

http://e2compr.sourceforge.net/

適用於以下平臺的實現

Windows 95/98/NT/2000

http://www.chrysocome.net/explore2fs

Windows 95 [1]

http://www.yipton.net/content.html#FSDEXT2

DOS 客戶端 [1]

ftp://metalab.unc.edu/pub/Linux/system/filesystems/ext2/

OS/2 [2]

ftp://metalab.unc.edu/pub/Linux/system/filesystems/ext2/

RISC OS 客戶端

http://www.esw-heim.tu-clausthal.de/~marco/smorbrod/IscaFS/