參考:https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/index.html
硬鏈接
我們知道文件都有文件名與數據,這在 Linux 上被分成兩個部分:用戶數據 (user data) 與元數據 (metadata)。用戶數據,即文件數據塊 (data block),數據塊是記錄文件真實內容的地方;而元數據則是文件的附加屬性,如文件大小、創建時間、所有者等信息。在 Linux 中,元數據中的 inode 號(inode 是文件元數據的一部分但其並不包含文件名,inode 號即索引節點號)纔是文件的唯一標識而非文件名。文件名僅是爲了方便人們的記憶和使用,系統或程序通過 inode 號尋找正確的文件數據塊。
爲解決文件的共享使用,Linux 系統引入了兩種鏈接:硬鏈接 (hard link) 與軟鏈接(又稱符號鏈接,即 soft link 或 symbolic link)。若一個 inode 號對應多個文件名,則稱這些文件爲硬鏈接。換言之,硬鏈接就是同一個文件使用了多個別名。硬鏈接可由命令 link 或 ln 創建。如下是對文件 oldfile 創建硬鏈接。
link oldfile newfile
ln oldfile newfile
inode 是隨着文件的存在而存在,因此只有當文件存在時纔可創建硬鏈接,即當 inode 存在且鏈接計數器(link count)不爲 0 時。inode 號僅在各文件系統下是唯一的,當 Linux 掛載多個文件系統後將出現 inode 號重複的現象,因此硬鏈接創建時不可跨文件系統。
由於硬鏈接是有着相同 inode 號僅文件名不同的文件,因此硬鏈接存在以下幾點特性:
- 文件有相同的 inode 及 data block;
- 只能對已存在的文件進行創建;
- 不能交叉文件系統進行硬鏈接的創建;
- 不能對目錄進行創建,只可對文件創建;
- 刪除一個硬鏈接文件並不影響其他有相同 inode 號的文件。
- 硬鏈接創建時不可跨文件系統
軟鏈接
軟鏈接與硬鏈接不同,它實際上是一個特殊的文件,其中包含的有另一文件的位置信息。比如:A是B的軟鏈接(A和B都是文件名),A的目錄項中的inode節點號與B的目錄項中的inode節點號不相同,A和B指向的是兩個不同的inode,繼而指向兩塊不同的數據塊。但是A的數據塊中存放的只是B的路徑名(可以根據這個找到B的目錄項)。即若文件用戶數據塊中存放的內容是另一文件的路徑名的指向,則該文件就是軟鏈接。軟鏈接就是一個普通文件,只是數據塊內容有點特殊,是另一文件的位置信息。軟鏈接有着自己的 inode 號以及用戶數據塊。因此軟鏈接的創建與使用沒有類似硬鏈接的諸多限制:
- 軟鏈接有自己的文件屬性及權限等;
- 軟鏈接可對文件或目錄創建;
- 可對不存在的文件或目錄創建軟鏈接;
- 軟鏈接可交叉文件系統;
- 創建軟鏈接時,鏈接計數 i_nlink 不會增加;
- 刪除軟鏈接並不影響被指向的文件,但若被指向的原文件被刪除,則相關軟鏈接被稱爲死鏈接(即 dangling link,若被指向路徑文件被重新創建,死鏈接可恢復爲正常的軟鏈接)。
當然軟鏈接的用戶數據也可以是另一個軟鏈接的路徑,其解析過程是遞歸的。但需注意:軟鏈接創建時原文件的路徑指向使用絕對路徑較好。使用相對路徑創建的軟鏈接被移動後該軟鏈接文件將成爲一個死鏈接,因爲鏈接數據塊中記錄的亦是相對路徑指向。
通過下圖可以更好地理解軟鏈接和硬鏈接:
圖中,soft link和hard link分別爲file的軟鏈接和硬鏈接,可以看出:
- hard link和file的inode相同,指向的數據塊是相同的,相當於對同樣的數據塊使用不同的文件名
- soft link則擁有自己的inode,指向另外一塊數據塊,它的數據塊中包含file的的位置信息