Linux 核心如何看待文件系統
我仍然對核心和文件系統的概念感到困惑
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 抽象層等之上而無需修改。