硬連結(hard link)
想像一個人真的有兩個名字——兩個都是同一個人的真正法定名字,而不是一個指向真名的綽號。硬連結就像這樣。它是第二個(或第三個)目錄項目,命名著完完全全同一個檔案——完全相同的底層資料與中繼資料,所以這個檔案真的擁有多個對等的名稱,沒有哪一個比其他更「才是本尊」。
這之所以行得通,是因為目錄與中繼資料是分開的。檔案真正的身分住在一筆中繼資料紀錄裡(在 Unix 系統裡就是 inode),而目錄項目只是一個名稱加上指向那個 inode 的指標。硬連結就只是另一個指向「同一個」inode 的目錄項目。inode 保有一個參考計數,記錄有多少個目錄項目指向它。建立硬連結會新增一個項目、把計數加一;刪除一個名稱會移除那個項目、把計數減一。實際的資料只有在計數歸零時——也就是「最後一個」名稱消失時——才會被釋放。所以刪掉一個名稱,檔案在它其他名稱底下仍完好無缺。
為什麼重要:硬連結讓樹中的好幾個地方共享一個檔案、毫無重複——透過任何一個名稱所做的編輯,透過所有名稱都看得到,因為就只有一個檔案。但它們帶著誠實的限制。因為所有名稱都是指向同一個 inode 的對等者,硬連結通常無法從一個檔案系統跨到另一個(inode 號碼是某檔案系統的局部編號),而且大多數系統禁止對目錄做硬連結,以防止迴圈。這就是它和符號連結的關鍵對比:硬連結是資料的另一個真名;符號連結只是一條指向某個名稱、且可能斷掉的路徑。
建立檔案 a.txt,再對它做一個硬連結 b.txt。這個 inode 的參考計數現在是 2。透過 a.txt 編輯會改變你透過 b.txt 看到的內容——它們是同一個檔案。刪除 a.txt 後 b.txt 仍完美運作;資料只有在 b.txt 也被移除時才釋放。
一個 inode 的兩個對等名稱;檔案一直存在,直到最後一個名稱消失。
硬連結是一個真正對等的名稱,不是指向名稱的指標,所以刪掉一個名稱絕不會破壞其他名稱;資料一直存活到參考計數歸零。硬連結通常無法跨檔案系統,而目錄一般不可被硬連結。