檔案系統與儲存

目錄項(directory entry)

如果 inode 才是真正的檔案、而它不帶名字,那名字住在哪裡?它住在目錄裡。一個目錄,儘管在檔案管理員裡看起來不像,其實只是一個特殊的檔案,其內容是一串配對:一個名字、以及那個名字所指向的 inode 號。每一個這樣的配對就是一個目錄項。目錄並不包含檔案;它包含的是通往檔案的標籤。

具體而言,當你在 /tmp 裡建立 hello.txt,檔案系統為新檔的後設資料與資料配置一個 inode(假設是 500 號),然後在 /tmp 的資料裡加一個目錄項,實質上說:名字 hello.txt 對應到 inode 500。列出目錄(ls)就是讀這些目錄項。開啟 /tmp/hello.txt 的意思是:把 /tmp 解析成它的 inode、讀那個目錄的目錄項找到名為 hello.txt 的那一個、取其 inode 號 500、再載入 inode 500。這正是為何同一個 inode 能有好幾個名字:每個名字都只是另一個指向同一個 inode 號的目錄項,這恰恰就是硬連結。符號連結則不同——它是自己的一個小檔案,其資料是一條要去循的路徑字串,而非直接的 inode 號。

為何重要:這種「名字到 inode」的間接層是整個 Unix 檔案模型的樞紐。它解釋了為何 rename() 很便宜(你移動或重寫一個目錄項,而非資料)、為何硬連結共用儲存且有相同的連結計數、以及為何刪除一個多重連結檔案的某個名字並不會刪掉資料。誠實的微妙之處:目錄項把名字綁到一個 inode「號」,而非綁到一條路徑,所以硬連結不能跨檔案系統(inode 號只在單一檔案系統內有意義)、通常也不能指向目錄(以避免循環)。

/tmp 目錄資料(概念上): "." -> inode 391 ".." -> inode 2 "hello.txt" -> inode 500 "copy.txt" -> inode 500 # 一個硬連結:同一 inode、第二個名字

目錄是一串「名字到 inode 號」的目錄項;兩個都命名 inode 500 的目錄項就是一個硬連結。

目錄項把名字對應到一個 inode「號」,而非一條路徑。這正是為何硬連結不能跨越檔案系統邊界、以及為何符號連結(它存的是一條路徑字串)可能懸空——指向一個不再存在的名字——而硬連結因直接共用 inode 故永不懸空。

又称
direntname-to-inode mapping目錄項名稱到 inode 的對應