inode

inode (index node) 是一種廣泛用於類 Unix 作業系統中的 file system 的資料結構

(*file system:file system 是作業系統組織電腦資料的方法,通常是層狀的結構)

每個 inode 都儲存了 file 的 metadata,像是 file 的修改時間,存取權限,擁有者,儲存位置(在磁碟中的位置)等等,但不包含 file 本身的 data,也不包含 filename

file system 中的每一個 file 都會被分配到一個獨特的 inode number,可以用 inode number 對應到 inode。 此外,UNIX file system 中的每一個 directory(可以當成資料夾)也是一種特別的 file,所以也有 inode 跟 inode number。 在 directory 的 data 裏面裝著許多 entry,每個 entry 都裝著一組 filename 和 inode number,代表在這個 directory 下的一個檔案

當程式要用 filename 來指定 file 時,OS 會先用 filename 找到其所對應的 inode number,然後在 file system 維護的 inode table 上面用 inode number 找到對應的 inode。最後再根據 inode 上的 metadata 找到 file 的儲存位置。

inode 的存在讓系統可以實現 hardlink,當今天有兩個 entry 的 inode 一模一樣,那就會說這兩個 entry 是這個 file 的 hardlink。這些 entry 的 filename 可以不同,所在的 directory 也可以不同。

hard link 最常見的應用是 . 跟 ..。在每個 directory 中都會有這兩個 entry。其中 . 是當前 directory 的 hardlink,而 .. 則是 parent directory 的 hardlink。

值得注意的是,hard link 和我們熟知的捷徑(symbolic link)並不相同:如果一個 inode 被很多 hardlink 連結,那在所有這些 hardlink 都被刪除之前,這個 inode 和其對應的 file 都不會被刪除。 換言之,刪除一個 hardlink 不會對其他 hardlink 有任何影響。 (inode 上會記錄有幾個 hardlink 連結到他,如果數量變成 0,那 OS 會回收對應的 file 的空間,然後回收 inode)

在 filesystem 被創建時,他的 inode 總數就已經被決定好了。所以是有可能發生磁碟容量還沒用完,但是 inode 數量已經用完,所以不能創建新檔案的情況

可以透過以下指令來查詢 inode:

ls -i #列出當前 directory 下的 entry 的 filename 和 inode number
df -hi #列出每一個 filesystem 下可用的 inode 數量,用比較可讀的方式列出。

ref:

(1) http://www.linfo.org/inode.html

(2) https://zh.wikipedia.org/zh-tw/Inode