前言
我們都知道文件都有文件名和數據,這在 Linux 上被分成兩個部分:用戶數據(user data)與元數據(metadata)。
用戶數據,即文件數據塊(data block),數據塊是記錄文件真實內容的地方;
元數據是文件的附加屬性,如文件大小、創建時間、所有者等信息。
在 Linux 中,元數據中的 inode 號(inode 是文件元數據的一部分但其並不包含文件名,inode 號即索引節點號) 才是文件的唯一標識而非文件名。
文件名僅是為了方便人們的記憶和使用,系統或程序通過 inode 號尋找正確的文件數據塊。
下圖為通過文件名打開文件的過程
在 Linux 系統中查看 inode 號可使用命令 stat 或 ls -li
ls -li test.php
輸出:
total 0 8635155045 -rw-r--r-- 2 zhengjianhong staff 0 Jun 14 13:35 test.php
如果使用命令 mv 移動並重命名文件,不影響文件的用戶數據及 inode 號。
一、什么是軟鏈?
軟鏈接(又稱符號鏈接,即 soft link 或 symbolic link),若文件的數據塊中存放的內容是另一文件的路徑名的指向,則該文件就是軟連接,類似變量引用或 Windows 中的快捷方式。
軟鏈接有着自己的 inode 號以及用戶數據塊。
- 軟鏈接有自己的文件屬性及權限等;
- 可對不存在的文件或目錄創建軟鏈接;
- 軟鏈接可交叉文件系統;
- 軟鏈接可對文件或目錄創建;
- 創建軟鏈接時,鏈接計數 i_nlink 不會增加;
- 刪除軟鏈接並不影響被指向的文件,但若被指向的原文件被刪除,則相關軟連接被稱為死鏈接(即 dangling link,若被指向路徑文件被重新創建,死鏈接可恢復為正常的軟鏈接)。
二、創建軟鏈
ln -s [源文件或目錄] [目標文件或目錄]
軟鏈接的用戶數據也可以是另一個軟鏈接的路徑,其解析過程是遞歸的。
但需注意:軟鏈接創建時原文件的路徑指向使用絕對路徑較好。
使用相對路徑創建的軟鏈接被移動后該軟鏈接文件將成為一個死鏈接(如果軟鏈接使用相對路徑,則不宜被移動),因為鏈接數據塊中記錄的亦是相對路徑指向。
刪除軟鏈接
rm –rf 軟鏈接名稱
修改軟鏈接
ln –snf [新的源文件或目錄] [目標文件或目錄]
這將會修改原有的鏈接地址為新的地址
三、為什么要使用軟鏈
- 節省磁盤空間;
- 實現文件共享;
- 增加權限安全。
當我們需要在不同的目錄,用到相同的文件時,我們不需要在每一個需要的目錄下都放一份相同的文件,我們只要在某個固定的目錄,放上該文件,然后在其他的目錄下用 ln 命令鏈接它就可以,
不必重復的占用磁盤空間。
ln 命令會保持每一處鏈接文件的同步性,不論你改動了哪一處,其他的文件都會發生相同的變化。
四、什么是硬鏈
硬鏈接 (hard link),若一個 inode 號對應多個文件名,則稱這些文件為硬鏈接。換言之,硬鏈接就是同一個文件使用了多個別名。
硬鏈接可由命令 ln 創建。
五、創建硬鏈
ln oldfile newfile
由於硬鏈接是有着相同 inode 號僅文件名不同的文件,因此硬鏈接存在以下幾點特性:
- 文件有相同的 inode 及 data block;
- 只能對已存在的文件進行創建;
- 不能交叉文件系統進行硬鏈接的創建;
- 不能對目錄進行創建,只可對文件創建;
- 刪除一個硬鏈接文件並不影響其他有相同 inode 號的文件。
硬鏈接不能對目錄創建是受限於文件系統的設計。
現 Linux 文件系統中的目錄均隱藏了兩個個特殊的目錄:當前目錄(.)與父目錄(..)。查看這兩個特殊目錄的 inode 號可知其實這兩目錄就是兩個硬鏈接(注意目錄 /mnt/lost+found/ 的 inode 號)。若系統允許對目錄創建硬鏈接,則會產生目錄環。
六、硬鏈和軟鏈的區別
無法為文件夾創建硬鏈接;
只能對已存在的文件創建硬連接;
硬鏈不能交叉文件系統;
硬鏈有相同的 inode 號以及 data block;
無論硬鏈接還是軟鏈接,文件都會保持同步變化。