硬連結 vs 符號連結
給檔案第二個名字有兩種方式。一種是再加一個直接指向同一本實體書的標籤——現在這本書有了兩個同樣真實的名字。另一種是寫一張便利貼說「去那邊找那本書」——若有人搬走或移除了原本,那張便利貼就指向空無。前者是硬連結;後者是符號連結。
硬連結是第二個目錄項目,它指向與原名字完全相同的索引節點。兩個名字都同等地位——沒有哪個才是「真的那個」——而檔案的連結計數加一。因為它們共用索引節點,它們就共用資料、大小、權限、一切。檔案的資料要等到連結計數歸零才釋放,所以刪除其中一個名字,檔案仍完好無缺地存在於另一個名字之下。硬連結不能跨越檔案系統邊界(索引節點號碼只在單一檔案系統內唯一),且通常不能指向目錄。符號連結(symlink,或軟連結)本身是個微小、獨立的檔案,其內容只是一個指向另一個名字的路徑字串。「跟隨」它意味著讀出那個路徑、再重新查找一次。符號連結能跨檔案系統、也能指向目錄,但它可能懸空:若它的目標被更名或刪除,符號連結仍存在、卻指向空無,開啟它便會失敗。
為何重要:這個區別不斷出現。硬連結是讓一個檔案安穩地存在於兩個名字之下、毫無脆弱指標之虞的方式;符號連結則是你做出靈活捷徑與版本別名(像 libfoo.so 指向 libfoo.so.1.4)的方式。知道硬連結共用索引節點、而符號連結只是存了一個路徑,就能解釋它們之間的每一個差異:為何刪除目標會破壞其一卻不破壞另一個、為何一個跨檔案系統而另一個不行。
$ ln a.txt b.txt # 硬連結:b.txt 與 a.txt 共用一個索引節點,連結計數 = 2 $ ln -s a.txt c.txt # 符號連結:c.txt 是個存著字串 "a.txt" 的微小檔案 $ rm a.txt # b.txt 仍可用(資料還在);c.txt 現在懸空了
移除原檔:硬連結完好倖存,符號連結則被留下、指向空無。
硬連結共用索引節點,所以所有名字地位相等,且檔案直到連結計數歸零才消失;符號連結只存一個路徑字串,所以它能懸空、能跨檔案系統、能指向目錄。它們是真正不同的物件,不是同一件事的兩種叫法。