Linux 文件系統最重要的特點之一是它的文件鏈接。鏈接是對文件的引用,這樣可以讓文件在文件系統中多處被看到。不過,在 Linux 中,鏈接可以如同原始文件一樣來對待。鏈接可以與普通的文件一樣被執行、編輯和訪問。對系統中的其他應用程序而言,鏈接就是它所對應的原始文件。當您通過鏈接對文件進行編輯時,您編輯的實際上是原始文件。鏈接不是副本,linux有兩種類型的鏈接:硬鏈接和符號鏈接(軟鏈接)。
硬鏈接(hard link)只能引用同一文件系統中的文件。它引用的是文件在文件系統中的物理索引(也稱爲 inode)。當您移動或刪除原始文件時,硬鏈接不會被破壞,因爲它所引用的是文件的物理數據而不是文件在文件結構中的位置。硬鏈接的文件不需要用戶有訪問原始文件的權限,也不會顯示原始文件的位置,這樣有助於文件的安全。如果您刪除的文件有相應的硬鏈接,那麼這個文件依然會保留,直到所有對它的引用都被刪除。
另外一種鏈接稱之爲符號鏈接(Symbolic Link),也叫軟鏈接。軟鏈接文件有類似於Windows的快捷方式。它實際上是一個特殊的文件。在軟鏈接中,文件實際上是一個文本文件,其中包含有另一文件的位置信息,如果刪了這個軟鏈接文件,那就等於不需要這個鏈接,和原來存在的實體原文件沒有任何關係,但刪除原來的文件,則相應的軟連接也不可用。
創建硬鏈接:ln filename 【linkname】
創建軟鏈接:ln -s filename 【linkname】
[root@liang opt]# touch aa #創建文件aa [root@liang opt]# ln aa bb #創建aa的硬鏈接bb [root@liang opt]# ln -s aa cc #創建aa的軟鏈接cc [root@liang opt]# ll -i #查看結果及inode值 總用量 0 2490370 -rw-r--r--. 2 root root 0 7月 30 04:36 aa 2490370 -rw-r--r--. 2 root root 0 7月 30 04:36 bb 2490371 lrwxrwxrwx. 1 root root 2 7月 30 04:36 cc -> aa [root@liang opt]# ln ../opt/aa /boot/dd #跨文件系統創建aa的硬鏈接dd,有報錯信息 ln: 創建硬鏈接"/boot/dd" => "../opt/aa": 無效的跨設備連接 [root@liang opt]# ln -s ../opt/aa /boot/ee #跨文件系統創建aa的軟鏈接ee,無報錯信息 [root@liang opt]# ll -i /boot/ #查看結果及inode值 39 lrwxrwxrwx. 1 root root 9 7月 30 04:37 ee -> ../opt/aa [root@liang opt]# ln ff gg #爲不存在的ff創建硬鏈接gg,有報錯信息 ln: 正在訪問"ff": 沒有那個文件或目錄 [root@liang opt]# ln -s ff hh #爲不存在的ff創建軟鏈接hh,無報錯信息 [root@liang opt]# ll -i #查看結果及inode值 總用量 0 2490370 -rw-r--r--. 2 root root 0 7月 30 04:36 aa 2490370 -rw-r--r--. 2 root root 0 7月 30 04:36 bb 2490371 lrwxrwxrwx. 1 root root 2 7月 30 04:36 cc -> aa 2490373 lrwxrwxrwx. 1 root root 2 7月 30 04:37 hh -> ff [root@liang opt]# echo aaaaaaaaaa > aa #在aa文件中寫入內容 [root@liang opt]# cat aa #查看源文件aa的內容 aaaaaaaaaa [root@liang opt]# cat bb #查看硬鏈接bb的內容 aaaaaaaaaa [root@liang opt]# cat cc #查看軟鏈接cc的內容 aaaaaaaaaa [root@liang opt]# rm -f aa #刪除源文件aa [root@liang opt]# cat bb #刪除源文件aa後查看硬鏈接bb的內容 aaaaaaaaaa [root@liang opt]# cat cc #刪除源文件cc後查看軟鏈接cc的內容 cat: cc: 沒有那個文件或目錄 [root@liang opt]# ll -i #刪除源文件後查看鏈接結果及inode值 總用量 4 2490370 -rw-r--r--. 1 root root 11 7月 30 04:45 bb 2490371 lrwxrwxrwx. 1 root root 2 7月 30 04:36 cc -> aa 2490373 lrwxrwxrwx. 1 root root 2 7月 30 04:37 gg -> ff
從以上操作過程中可以看到硬鏈接文件與源文件的inode值一樣,即硬鏈接文件與源文件同屬一個數據塊,軟鏈接文件與源文件的inode值不一樣,即軟鏈接文件是單獨存在的一個文本文件。當源文件被刪除時,硬鏈接文件不受影響,而軟鏈接文件則無效。
硬鏈接特性:
文件有相同的 inode 及 data block;
只能對已存在的文件進行創建;
不能交叉文件系統進行硬鏈接的創建;
不能對目錄進行創建,只可對文件創建;
刪除一個硬鏈接文件並不影響其他有相同 inode 號的文件;
軟鏈接特性:
軟鏈接有自己的文件屬性及權限等;
可對不存在的文件或目錄創建軟鏈接;
軟鏈接可交叉文件系統;
軟鏈接可對文件或目錄創建;
創建軟鏈接時,鏈接計數 i_nlink 不會增加;
刪除軟鏈接並不影響被指向的文件,但若被指向的原文件被刪除,則相關軟連接被稱爲死鏈接(即 dangling link,若被指向路徑文件被重新創建,死鏈接可恢復爲正常的軟鏈接);
如下圖所示軟鏈接、硬鏈接及源文件的關係: