目錄文件包含什麼樣的資訊?
我聽說 Linux 中的一切,包括目錄,都是一個文件。所以我試圖訪問一個目錄文件,但是當我試圖用它來讀取它時,
cat
我得到了錯誤cat: xp: Is a directory
。使用less
,more
,head
,tail
andnl
給出了類似的結果,使用 Vim 讓我進入了某種導航菜單。因此,由於我似乎無法找到自己,所以我來到這裡尋找答案。
那麼……目錄文件包含什麼樣的資訊?
我假設答案包括指向該目錄中文件 inode 的某種連結,但它包含哪些其他類型的資訊?
還有一種方法可以訪問該文件並可能對其進行編輯嗎?
目錄是文件,因為它們通常具有 inode 結構,並且數據塊被保留,就像它們用於任何其他文件一樣。
目錄必須包含一些包含文件名和相應 inode 編號的資料結構。該結構可能是一個簡單的列表,或者某種樹,這是一個實現細節。在某些文件系統上,一些 inode 數據(如文件類型,它是不變的)也會在目錄中複製,以便更快地訪問。(當然,如果 FS 是 VFAT,那麼目錄條目幾乎也是 inode。)
Linux 不允許使用 讀取目錄的內容
read()
,可能是因為原始數據對使用者空間無用,因為它在不同的文件系統上會有所不同,並且使用者空間程序需要了解所有文件系統的內部結構才能能夠利用它。或者,核心需要讓每個文件系統呈現一個兼容的目錄視圖,但這就是getdents()
/readdir()
呼叫的目的。其他一些 Unixen 可能允許讀取目錄內容,例如,至少舊版本的 FreeBSD 允許它。但即使在那些上,您也可能應該使用
readdir()
.大多數實用程序只是嘗試像讀取正常文件一樣讀取目錄,從而導致該錯誤,但是像 Vim 這樣的智能編輯器以及可能
less
使用某些腳本使用目錄系統呼叫來代替並為您生成文本列表。您可以使用
debugfs
ext2/ext3/ext4 等特殊工具進行一些目錄編輯。但我認為即使它也不允許對原始數據進行任意編輯,這聽起來像是在訪問目錄或文件系統驅動程序崩潰時出錯的秘訣。