我們知道文件都有文件名與數據,這在 Linux 上被分成兩個部分:用戶數據 (user data) 與元數據 (metadata)。用戶數據,即文件數據塊 (data block),數據塊是記錄文件真實內容的地方;而元數據則是文件的附加屬性,如文件大小、創建時間、所有者等信息。在 Linux 中,元數據中的 inode 號(inode 是文件元數據的一部分但其並不包含文件名,inode 號即索引節點號)才是文件的唯一標識而非文件名。文件名僅是為了方便人們的記憶和使用,系統或程序通過 inode 號尋找正確的文件數據塊。圖 1.展示了程序通過文件名獲取文件內容的過程。
圖1. 通過文件名打開文件
清單1:移動或重命名文件
在 Linux 系統中查看 inode 號可使用命令 stat 或 ls -i
清單 :1.中使用命令 mv 移動並重命名文件 glibc-2.16.0.tar.xz,其結果不影響文件的用戶數據及 inode 號,文件移動前後 inode 號均為:2485677。
為解決文件的共享使用,Linux 系統引入了兩種鏈接:
硬鏈接 (hard link) 與
軟鏈接(又稱符號鏈接,即 soft link 或 symbolic link)。鏈接為 Linux 系統解決了文件的共享使用,還帶來了隱藏文件路徑、增加權限安全及節省存儲等好處。若一個 inode 號對應多個文件名,則稱這些文件為硬鏈接。換言之,硬鏈接就是同一個文件使用了多個別名(見 圖 2.hard link 就是 file 的一個別名,他們有共同的 inode)。硬鏈接可由命令 link 或 ln 創建。
如下是對文件 oldfile 創建硬鏈接。
[code] link oldfile newfile
ln oldfile newfile
由於硬鏈接是有著相同 inode 號僅文件名不同的文件,因此硬鏈接存在以下幾點特性:
文件有相同的 inode 及 data block; 只能對已存在的文件進行創建; 不能交叉文件系統進行硬鏈接的創建;
不能對目錄進行創建,只可對文件創建; 刪除一個硬鏈接文件並不影響其他有相同 inode 號的文件。
清單2. 硬鏈接特性展示清單 3. 查找有相同 inode 號的文件:值得一提的是,Linux 系統存在 inode 號被用完但磁盤空間還有剩余的情況。我們創建一個 5M 大小的 ext4 類型的 mo.img 文件,並將其掛載至目錄 /mnt。然後我們使用一個 shell 腳本將掛載在 /mnt 下 ext4 文件系統的 indoe 耗盡(見清單 4)。
清單 4. 測試文件系統 inode 耗盡但仍有磁盤空間的情景
硬鏈接不能對目錄創建是受限於文件系統的設計(見 清單2對目錄創建硬鏈接將失敗)。現 Linux 文件系統中的目錄均隱藏了兩個個特殊的目錄:當前目錄(.)與父目錄(..)。查看這兩個特殊目錄的 inode 號可知其實這兩目錄就是兩個硬鏈接(注意目錄 /mnt/lost+found/ 的 inode 號)。若系統允許對目錄創建硬鏈接,則會產生目錄環。
軟鏈接與硬鏈接不同,若文件用戶數據塊中存放的內容是另一文件的路徑名的指向,則該文件就是軟連接。軟鏈接就是一個普通文件,只是數據塊內容有點特殊。軟鏈接有著自己的 inode 號以及用戶數據塊(見 圖 2.)。因此軟鏈接的創建與使用沒有類似硬鏈接的諸多限制:
軟鏈接有自己的文件屬性及權限等;
軟鏈接可對文件或目錄創建;
刪除軟鏈接並不影響被指向的文件,但若被指向的原文件被刪除,則相關軟連接被稱為死鏈接(即 dangling link,若被指向路徑文件被重新創建,死鏈接可恢復為正常的軟鏈接)。
圖 2. 軟鏈接的訪問
清單 5. 軟鏈接特性展示
當然軟鏈接的用戶數據也可以是另一個軟鏈接的路徑,其解析過程是遞歸的。但需注意:軟鏈接創建時原文件的路徑指向使用絕對路徑較好。使用相對路徑創建的軟鏈接被移動後該軟鏈接文件將成為一個死鏈接(如下所示的軟鏈接 a 使用了相對路徑,因此不宜被移動),因為鏈接數據塊中記錄的亦是相對路徑指向。
當前系統已掛著的文件系統類型,除上述使用的命令 df,還可使用命令 mount 或查看文件 /proc/mounts。
命令 ls 或 stat 可幫助我們區分軟鏈接與其他文件並查看文件 inode 號,但較好的方式還是使用 find 命令,其不僅可查找某文件的軟鏈接,還可以用於查找相同 inode 的所有硬鏈接。(見清單 8.)
清單 6. 使用命令 find 查找軟鏈接與硬鏈接
系統根據磁盤的大小默認設定了 inode 的值(見清單 9.),如若必要,可在格式文件系統前對該值進行修改。如鍵入命令 mkfs -t ext4 -I 512/dev/sda4,將使磁盤設備 /dev/sda4 格式成 inode 大小是 512 字節的 ext4 文件系統。
清單 7. 查看系統的 inode 值
附上IBM在關於硬鏈接與軟連接的官方說明
https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/