在 Linux/Unix 系統中,硬連結( Hard Link ) 是一種給檔案取「別名」的方法。它讓多個檔名指向同一個檔案的資料( inode ),就算原本的檔名被刪除了,其他硬連結依然可以存取檔案內容。
在 Linux/Unix 系統中,檔案並不是直接由檔名指向內容。
事實上,檔名只是「標籤」,真正存放檔案資訊的地方叫做 inode( index node,索引節點)。
每個檔案在檔案系統中都會有一個 唯一的 inode 編號,它負責存放檔案的「中繼資料( metadata )」,也就是除了檔名以外的所有資訊。
硬連結就是讓不同的檔名,指向同一個 inode。
檔名是存在目錄( directory )裡,目錄會建立一個檔名 → inode 編號的對應表。
也就是說:
在 Linux 終端機輸入:
ls -li
輸出範例:
123456 -rw-r--r-- 2 user user 12 Sep 17 23:10 file1.txt
123456 -rw-r--r-- 2 user user 12 Sep 17 23:10 file2.txt
123456
→ 這就是 inode 編號2
→ 硬連結數量(有兩個檔名指向這個 inode)file1.txt
和 file2.txt
雖然有不同的名字,但它們的 inode 編號一樣,所以它們其實是同一個檔案。每個檔案系統(filesystem)在建立時就會分配固定數量的 inode。
即使磁碟還有空間,如果 inode 用完了,也無法再建立新檔案。
可以用以下指令查看 inode 使用情況:
df -i
輸出範例:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 6553600 1200000 5353600 18% /
使用 ln
指令來建立硬連結
ln [原始檔案名稱] [新檔案名稱]
echo "Hello World" > file1.txt
ln file1.txt file2.txt
file1.txt
與 file2.txt
都指向同一個 inode。file1.txt
與 file2.txt
都會輸出 Hello World
,不過兩者是獨立的檔案。file1.txt
,file2.txt
仍然能使用。特性 | 軟連結 (symlink) | 硬連結 (hard link) |
---|---|---|
指向 | 檔案路徑 | 檔案內容 (inode) |
類似 | Windows 捷徑 | 同一份檔案的另一個檔名 |
是否可跨檔案系統 | 可以 | 不行 |
原始檔刪除後 | 連結失效 | 另一個仍可用 |
建立在目錄上 | 可以 | 不行 |
使用場景 | 建立捷徑、快速存取 | 檔案多個名稱、確保資料一致性 |
ls -l
-rw-r--r-- 1 user user 12 Sep 17 file.txt
lrwxrwxrwx 1 user user 8 Sep 17 softlink.txt -> file.txt
l
開頭代表這是連結檔softlink.txt
指向 file.txt
ls -l
-rw-r--r-- 2 user user 12 Sep 17 file.txt
-rw-r--r-- 2 user user 12 Sep 17 hardlink.txt
rw-r--r--
→ 檔案的權限2
→ 硬連結數(這個檔案有多少個檔名指向同一個 inode)ls -l
內容說明補充-rw-r--r-- 2 user user 4096 Sep 17 22:30 hello.txt
user
→ 檔案的擁有者(owner)
user
→ 檔案的群組(group)
4096
→ 檔案大小(bytes)Sep 17 22:30
→ 修改時間hello.txt
→ 檔案名稱ls -l
ln
(硬連結)、ln -s
(軟連結)