Filesystems
目錄的 inode 是如何將文件名儲存在 ext4 文件系統中的?
目錄 inode 與正常文件的 inode 沒有本質區別,我從Ext4 磁碟佈局中理解的是:
目錄條目:因此,更準確地說,一個目錄是一系列數據塊,每個塊包含目錄條目的線性數組。
目錄條目將文件名連同指向其 inode 的指針一起儲存。因此,如果文件說每個塊都包含目錄條目,為什麼要
debugfs
報告與儲存在目錄的 inode 中的文件名不同的內容?這是 ext4 格式化快閃記憶體驅動器上的調試會話:debugfs: cat /sub � . ..� spam�spam2�spam3��spam4
我認為
inode_i_block
不能儲存這些文件名,我創建的文件名非常長,大小超過 60 個字節。cat
在 inode 上執行debugfs
也顯示了文件名,所以長文件名又在 inode 中了!根據 inode 描述的文件類型,
inode.i_block
可以以不同方式使用 60 字節的儲存空間。一般來說,正常文件和目錄將其用於文件塊索引資訊,特殊文件將其用於特殊目的。此外,沒有提到在 雜湊樹目錄 部分中儲存文件名的 inode,這是較新的實現。我覺得我錯過了該文件中的某些內容。
主要問題是如果目錄的 inode 包含文件名,那麼它的數據塊儲存什麼?
目錄條目既儲存在數據塊中
inode.i_block
,也儲存在數據塊中。請參閱您連結到的文件中的“內聯數據”和“內聯目錄”。
cat
輸出文件內容,即數據塊。類似於/bin/cat
。如果將 inode 結構的字節寫入終端,該
cat
命令將無用。比較inode_dump
和stat
。一些文件會告訴您,歷史上的 unix 允許例如
/bin/cat
讀取這些數據,這是從使用者空間列出目錄條目的原始方式。即ls
會打開目錄、read()
條目並為您解釋它們。與 usingreaddir()
不同,核心以標準格式提供條目,而不管底層文件系統格式如何。