鏈接是 Linux 文件系統的核心特性。硬鏈接與軟鏈接(符號鏈接)在底層實現、跨文件系統能力、刪除語義上有本質區別。本文結合 inode 機制深度解析,並提供實驗驗證。
| 特性 | 硬鏈接 | 軟鏈接 |
|---|---|---|
| 本質 | 指向同一 inode 的目錄項 | 獨立文件,存儲目標路徑字符串 |
| inode 號 | 相同 | 不同 |
| 跨文件系統 | 不支援 | 支援 |
| 目標類型 | 僅文件 | 文件/目錄/不存在路徑 |
| 刪除源文件影響 | 鏈接仍有效,數據不丟失 | 斷鏈,訪問報錯 |
| 目錄創建 | 禁止 | 允許 |
| 類比 | 同一文件的別名 | Windows 快捷方式 |
ln 目標文件 鏈接名 # 硬鏈接
ln -s 目標文件 鏈接名 # 軟鏈接(符號鏈接)
[root@server tmp]# touch file
[root@server tmp]# ln file file1 # 硬鏈接
[root@server tmp]# ln -s file file2 # 軟鏈接
[root@server tmp]# ls -il
total 0
27127 -rw-r--r--. 2 root root 0 Nov 20 10:40 file
27127 -rw-r--r--. 2 root root 0 Nov 20 10:40 file1
27132 lrwxrwxrwx. 1 root root 4 Nov 20 10:40 file2 -> file
觀察:
file 與 file1 inode 號均為 27127,鏈接計數為 2file2 inode 為 27132,權限 lrwxrwxrwx,箭頭指向目標rm file # 刪除源文件
ls -l file1 # 硬鏈接仍存在,內容完整
cat file2 # 報錯:No such file or directory(斷鏈)
原理:rm 僅遞減 inode 鏈接計數。計數歸零時才釋放數據塊。硬鏈接本質是增加計數;軟鏈接獨立存儲路徑,目標消失即失效。
ls -l 第 3 欄ls -l 輸出第 3 欄(如上例的 2)即 inode 鏈接計數。只要 > 0,文件實體就存在。這也是為何 rm 源文件後硬鏈接仍可用的原因。
ln -s a a 或 ln -s a b; ln -s b a,ls 會標註循環/usr/bin/python -> python3.9、部署發佈版本切換)