Filesystems

Linux 核心如何看待文件系統

  • June 4, 2022

我仍然對核心和文件系統的概念感到困惑

Filesystems 包含一個 inode 表,用於檢索不同記憶體中的不同文件和目錄

這個 inode 表是核心的一部分嗎?我的意思是當核心掛載另一個文件系統時索引節點表是否更新?

還是核心以某種方式使用驅動程序和 inode 表地址讀取文件系統本身的一部分?

這裡有一些混亂,因為核心原始碼和文件對於它如何使用術語“inode”是草率的。

文件系統可以被認為有兩部分——記憶體中的文件系統程式碼和數據,以及磁碟上的文件系統。

磁碟上的文件系統是自包含的,具有文件的所有非易失性數據和元數據。對於大多數 linux 文件系統,這包括磁碟上的 inode 以及文件的其他元數據和數據。

但是當文件系統被掛載時,文件系統程式碼也會在記憶體中保存正在使用的文件的 inode 的記憶體副本。所有文件活動都使用和更新記憶體中的 inode 副本,因此核心程式碼實際上只考慮記憶體副本中的這一點,並且大多數核心文件都沒有區分磁碟 inode 和記憶體 inode。此外,記憶體中的 inode 包含額外的臨時元數據(例如文件的記憶體頁面在記憶體中的位置以及哪些程序打開了文件),這些元數據不包含在 inode 的磁碟副本中。記憶體中的 inode 會定期同步並寫回磁碟。核心沒有全部記憶體中的索引節點——只是正在使用的文件和最近使用的文件。最終,記憶體中的 inode 被刷新並釋放記憶體。磁碟上的 inode 始終存在。

因為 unix 中的文件活動與 inode 緊密相關,所以不使用 inode 的文件系統(如 vfat)在核心記憶體中仍然具有文件系統程式碼動態建構的虛擬 inode。這些記憶體中的虛擬 inode 仍然保存文件元數據,這些元數據會根據需要同步到磁碟上的文件系統。

在傳統的 Unix 文件系統中,inode 是文件的關鍵資料結構。文件名只是指向 inode 的指針,一個 inode 可以有多個文件名連結到它。在其他不使用 inode 的文件系統中,一個文件通常只能有一個名稱,並且元數據與文件名而不是 inode 相關聯。

inode、空閒塊等由文件系統驅動程序處理。這個文件系統程式碼為核心提供了一個通用介面,這意味著核心可以訪問一系列文件系統上的文件,而無需在這個“使用者端”進行調整。

然而,許多文件系統驅動程序也包含在核心中(在原始碼的單獨區域中)。這包括 ext4 和其他 Linux 本機文件系統的驅動程序和邏輯。

如果掛載了第二個文件系統,則會生成該文件系統的另一個實例(RAM 中的資料結構),因此每個磁碟分區都彼此分開處理。兩個磁碟上的文件訪問可能使用相同的驅動程式碼(例如 ext4 文件系統的常式)但使用不同的數據。

文件系統驅動程序本身只需要它下面的塊設備訪問(“讀取塊 17”、“寫入塊 23”),這意味著它可以位於磁碟、分區、LUKS 或 LVM 抽象層等之上而無需修改。

引用自:https://unix.stackexchange.com/questions/704956