與 Windows 和 macOS 操作系統不同,Linux 是由愛好者社區開發的大型開源項目。它的代碼始終可供那些想要做出貢獻的人使用,任何人都可以根據個人需求自由調整它,或在其基礎上創建自己的發行版本。這就是為什么 Linux 存在如此多的變體,它的文件系統也是如此。該內核支持多種存儲格式,但最常用的是?Ext?系列、XFS、Btrfs、F2FS、JFS?和?ReiserFS?的格式。
內容:
- Ext
- XFS
- Btrfs
- F2FS
- JFS
- ReiserFS
- Linux 的其他存儲技術
Ext
Ext(擴展文件系統)是第一個專門為 Linux 設計的格式。但是,它存在嚴重的性能限制,并很快被?Ext2?取代。此文件系統及其后來的修訂版 (Ext3?和?Ext4) 成為大多數 Linux 發行版的默認選擇。
Ext2 因其基于 inode 概念的結構而被證明效率更高。這樣的索引描述符保留特定對象(如文件或目錄)的屬性,并指向其底層數據的位置。Ext2 中的空間被劃分為多個塊,這些塊形成更大的單元,稱為塊組。有關所有塊組的信息由位于 Superblock 后面的 Descriptor Table 維護。每個塊組將 inode 保留在自己的 inode 表中。它還使用 Block 和 Inode Bitmaps 監控其塊和 inode 的狀態。同時,文件或目錄的名稱并不構成其 inode 的一部分 – 名稱通過目錄映射到相應的 inode 編號,實現為一種特殊類型的文件。
大多數 Linux 文件系統都類似,因為名稱不被視為屬性,而是定義為某個目錄中文件的別名。文件對象可以從多個位置鏈接,并以不同的名稱存在(所謂的硬鏈接)。這可能會導致在文件刪除或邏輯損壞后恢復文件名時出現嚴重甚至無法克服的困難。
Ext3 實際上是支持日志功能的 Ext2 的升級版本。Ext3 中的日志被組織為日志文件,它記錄了對文件系統的所有更改,并在發生崩潰時保護它免受損壞。
Ext4 是對 Ext4 的改進,它將數據分配方法從單個塊更改為擴展數據塊。它背后的想法是將文件的大部分數據寫入一個連續的區域,然后只記下它第一個塊的地址和序列中的塊數。最多可以將四個擴展數據塊直接存儲在 inode 中,而其余擴展數據塊則以 B+樹的形式排列。此外,Ext4 會推遲作,直到數據實際提交到磁盤,從而能夠最大限度地減少碎片。
總的來說,它被認為是最靈活的通用文件系統類型之一,也獲得了堅實穩定性的聲譽。
XFS 系列
XFS(擴展文件系統)是另一種非常成熟的文件系統,最初由 Silicon Graphics 創建并應用于該公司的 IRIX 服務器。2001 年,它進入 Linux 內核,現在大多數 Linux 發行版都支持它,其中一些發行版(如 Red Hat Enterprise Linux)甚至默認使用它。
此 FS 類型針對在單個主機上存儲非常大的文件和卷進行了優化。它將存儲空間拆分為大小相等的區域,稱為 Allocation Groups。它們中的每一個都像一個不同的文件系統,即有自己的 Superblock,管理自己的結構和空間使用。后者是在 B+樹的幫助下控制的,其中一個記錄連續自由空間區域中的第一個塊,另一個 - 它組成的塊數。存儲塊使用相同的基于范圍的方法分配給文件。XFS 中的所有文件和目錄都由其單獨的 inode 表示。擴展的分配可以直接存儲在 inode 中,或者由鏈接到它的另一個 B+tree 跟蹤,以防文件非常大或碎片化。就像 Ext 中的 inode 一樣,它們不包含名稱,這些名稱僅在相應的目錄條目中可用。
XFS 為其元數據的任何更新部署日志原則。在實際塊被修改之前,所有更改都會先寫入日志,這樣可以在發生任何事故時立即恢復。通常,這種文件系統類型設計為具有高度可擴展性,并且在服務器硬件上運行得非常好。
Btrfs
Btrfs(B-tree 文件系統)由 Oracle 開發,是 Linux 最流行的新一代格式之一。
Btrfs 經過調整,可在多種設備中運行,從智能手機到高端服務器。此外,它還包含邏輯卷管理器的功能,能夠分布在多個存儲中,以及無數其他高級可能性。
Btrfs 嚴重依賴 B 樹結構,每個結構都由內部節點和葉子組成。內部節點指向子節點或葉,而葉包含包含一些信息的項。項目的實際布局和內容取決于給定 B 樹的類型。根 B 樹(其位置在 Superblock 中可用)具有對其余 B 樹的引用。塊 B 樹管理邏輯到物理地址的映射,而設備 B 樹則相反地將底層設備上的物理塊鏈接到它們的虛擬地址。文件系統 B 樹負責文件和文件夾的分配。小文件就存儲在內部范圍項目中。較大的數據塊放置在外部的連續區域(稱為擴展數據塊)中。在這種情況下,區項將引用保存文件數據的所有區。目錄項包括文件名并指向其 inode 項。反過來,inode 項用于其他屬性,如大小、權限等。
Btrfs 是一種寫入時復制 (CoW) 文件系統。它不使用日志,而是在修改塊之前復制塊,然后將此數據寫入不同的空閑位置。此機制有助于消除更新中斷(例如,由于斷電)時數據損壞的風險。多虧了它和各種其他吸引人的功能,Btrfs 在現代 Linux 用戶中找到了越來越多的追隨者。
F2FS 系列
F2FS(Flash 友好文件系統)專為基于 NAND 閃存的存儲設備而設計,因此在現代智能手機和可移動存儲介質中的應用最為廣泛。
F2FS 基于對數結構文件系統方法 (LFS) 工作,并考慮了閃存存儲的特性,例如恒定訪問時間和有限數量的數據重寫周期。F2FS 不是創建一個大塊進行寫入,而是將這些塊組裝成并發寫入的單獨塊(最多 6 個)。
它將其存儲空間劃分為固定大小的段。連續的分段構成一個區域,多個分段構成一個區域。其中的數據分配是在節點的幫助下執行的。后者有三種類型:直接、間接和 inode。inode 存儲元數據,包括名稱、大小和其他文件的屬性;直接節點指示其數據塊的位置,而間接節點指向其他節點中的塊。這些節點的物理地址可以在節點地址表 (NIT) 中找到。內容本身存儲在 Main Area 中。其中的部分將數據塊與包含服務信息的節點塊分開。所有塊的使用狀態都由區段信息表 (SIT) 記錄。Segment Summary Area (SSA) 指定將哪些數據塊分配給哪個節點。
當可用分段用完時,F2FS 會在系統處于非活動狀態時在后臺自行清理。清理算法根據 SIT 或其使用時間的塊數選擇受害者段。
所描述的組織使 F2FS 在固態存儲上表現相當不錯。然而,到目前為止,它主要應用于便攜式設備,很少在臺式機和服務器機器上遇到。
JFS
JFS(日志文件系統)由 IBM 于 1990 年創建,在開源后發布并移植到 Linux。
JFS 卷由稱為 Allocation Groups 的區域組成,每個區域都包含一個或多個 FileSet。所有文件和目錄都由其各自的 inode 描述,而數據內容則由一個或多個擴展數據塊表示。所有盤區都由專用的 B+tree 編制索引。小型目錄的內容存儲在其 inode 中,而較大的目錄則組織為 B+樹。B+樹還控制存儲空間的使用:第一個樹存儲可用擴展的起始塊,第二個樹 - 可用擴展的數量。JFS 還包含一個單獨的日志區域,并在元數據發生更改時寫入該區域。
通常,JFS 被認為是一種快速可靠的文件系統。然而,它很少看到任何增強功能,現在已經不再使用,被更現代的選擇所超越。
ReiserFS 系列
ReiserFS 是一種替代 Linux 格式,針對存儲大量小文件進行了優化。它最初由 Namesys 于 2001 年設計,并帶來了許多新功能,這些功能在推出時非常具有創新性。然而,由于某些技術問題,最終它的維護工作被移交給了志愿者。
ReiserFS 圍繞 S+tree 進行組織,該樹由內部節點和葉節點組成。此結構用于管理所有文件、目錄和元數據。它包含四種基本類型的項目:直接、間接、目錄和統計項目。直接項保存實際數據,間接項僅鏈接到某些數據塊,目錄項表示目錄中的條目,統計項包含文件和文件夾的屬性。每個項目都有其唯一的鍵,用于在樹中查找它。此鍵包括項目的標識符、地址和類型。
不占用整個塊的文件和文件片段被合并,并直接存儲在 S+tree 的葉節點中。這種機制稱為尾部包裝,它有助于減少空間浪費和碎片的數量。此外,ReiserFS 不會直接對 S+tree 進行任何更改 – 它首先將它們寫入 Journal,然后復制到存儲上所需的位置。
總而言之,ReiserFS 具有良好的搜索功能,并支持小文件的緊湊分配。但是,這種格式不再受到積極支持,并且在不久的將來不太可能保持相關性。
Linux 的其他存儲技術
Linux 文件系統通常是自包含的,與普通獨立驅動器一起使用時,直接在分區上運行。但是,其他技術也可能在物理存儲和 Linux 文件系統之間分層,以提供更高級的功能。其中一些,如 Btrfs,通過將某些功能集成到其核心功能中來更進一步,最大限度地減少對額外層的需求。
以下是 Linux 文件系統可能結合使用的一些最常見的存儲技術:
- 邏輯卷管理器?(LVM) – 一種磁盤管理技術,與傳統分區相比,可實現更靈活、更高效的存儲容量分配。它與大多數 Linux 文件系統兼容,包括 Ext2、Ext3、Ext4、XFS、Btrfs、F2FS、JFS 和 ReiserFS。在它的幫助下,可以創建跨越多個物理存儲設備的存儲池,并在它們之上設置可調節的邏輯卷。精簡配置是 LVM 的一項特殊功能,它允許通過動態分配空間來優化存儲使用,但僅當實際數據寫入卷時。在這種情況下,使用專用的 “thin pool” 作為源,并在其中創建的卷稱為 “thin volumes”。此類卷的虛擬大小可能超過精簡池中的實際可用空間量。
- mdadm?– 用于創建和管理軟件 RAID 的 Linux 實用程序。它將多個物理驅動器組合到一個邏輯單元中,可以提高存儲性能和/或實現容錯能力。mdadm 支持各種 RAID 級別,包括 RAID 0(條帶化)、RAID 1(鏡像)、RAID 5(帶奇偶校驗的條帶化)、RAID 6(雙奇偶校驗)和 RAID 10(條帶鏡像)。生成的 RAID 集在 Linux 中顯示為單個邏輯塊設備,并且可以使用內核支持的任何文件系統進行格式化。
- LUKS(Linux 統一密鑰設置) – 在 Linux 中加密塊設備的標準,如果沒有正確的加密密鑰,就無法訪問存儲在它們上的數據。LUKS 與廣泛的 Linux 文件系統兼容,包括 Ext2、Ext3、Ext4、XFS、Btrfs、F2FS、JFS 和 ReiserFS。此外,它還可以與其他 Linux 存儲技術(如 LVM 或 mdadm)結合使用,以便在這些系統管理的卷之上提供分層加密。
- eCryptfs?– 一種 Linux 原生加密文件系統。它允許加密卷中的單個目錄或文件,而無需應用全盤加密。作為“堆疊”文件系統運行,eCryptfs 將其加密分層在現有文件系統之上,同時保留底層 FS 結構。這樣,標準的 Linux 文件系統(如 Ext2、Ext3、Ext4、XFS、Btrfs、F2FS、JFS 或 ReiserFS)仍然負責管理數據塊和其他元數據,而 eCryptfs 確保在訪問文件時對文件的內容進行加密或解密。
- Btrfs-RAID?– 嵌入到 Btrfs 文件系統中的 RAID 功能。它允許用戶從多個存儲設備配置靈活的容錯存儲卷。Btrfs 支持多種 RAID 級別,包括 RAID 0(條帶化)、RAID 1(鏡像)、RAID 5(帶奇偶校驗的條帶化)、RAID 6(雙奇偶校驗)和 RAID 10(條帶鏡像)。與傳統 RAID 不同,Btrfs-RAID 可以動態添加、刪除或更換陣列中的驅動器,而無需使系統脫機。