天天看點

Linux中硬連接配接(hard link)與軟連接配接(symbolic link)

參考文章:

https://blog.csdn.net/gxzc936733992/article/details/49340429

https://www.cnblogs.com/jackhub/p/3779917.html

https://blog.csdn.net/bitboss/article/details/53940236

在Linux系統(Ubuntu)的ext4檔案系統中,根據資料的不同,可以将記憶體分為以下3種類型:

  • inode 記錄檔案的屬性,一個檔案占用一個inode,同時記錄此檔案的資料所在的block号碼;
  • block 實際記錄檔案的内容,如果檔案太大,則會占用多個block;
  • super block 記錄檔案系統的整體資訊,包括inode/block的總量、使用量、剩餘量,以及檔案系統的格式與相關資訊;

Linux檔案連結分兩種,一種被稱為硬連結(Hard Link),另一種被稱為符号連結(Symbolic Link)。預設情況下,ln指令産生硬連結,ln -s 産生軟連接配接。

硬連接配接定義:

硬連接配接 指通過索引節(inode)點來進行連接配接。在Linux的檔案系統中,儲存在磁盤分區中的檔案不管是什麼類型都給它配置設定一個編号,稱為索引節點号(Inode Index),通過指令ls -li顯示 。在Linux中,多個檔案名指向同一索引節點是存在的,一般這種連接配接就是硬連接配接。

硬連接配接的作用 是允許一個檔案擁有多個有效路徑名,這樣使用者 就可以建立硬連接配接到重要檔案,以防止“誤删”的功能。其原因如上所述,因為對應該目錄的索引節點有一個以上的連接配接。隻删除一個連接配接并不影響索引節點本身和 其它的連接配接,隻有當最後一個連接配接被删除後,檔案的資料塊及目錄的連接配接才會被釋放。也就是說,檔案真正删除的條件是與之相關的所有硬連接配接檔案均被删除。 和記憶體管理中的“引用記數”機制類似。

硬連結的限制:

我們在使用硬連結的同時也需要對硬連結的限制有所了解;

  1. 不能跨檔案系統
  2. 不能連結到目錄(== 軟連結可以連結到目錄 ==)

分析:第一點很好了解,我們就第二點作一些解釋;

假如你嘗試連結目錄,系統會報錯:

Linux中硬連接配接(hard link)與軟連接配接(symbolic link)

因為如果給目錄建立連結的話,關系的可不是目錄本身,關乎目錄下的所有檔案,比如你在硬連結的ld-hd 目錄下要建立一個新檔案,必須在ld目錄下有一個與之對應的檔案,可想而知如果目錄的連結多了,這是多麼繁多的工程,正是因為這個複雜的原因,Linux不允許為目錄建立硬連結。

【軟連接配接】

另外一種連接配接稱之為符号連接配接(Symbolic Link),也叫軟連接配接。軟連結檔案有類似于Windows的快捷方式。它實際上是一個特殊的文本檔案,内容是另一檔案的位置資訊(在同一目錄下建立軟連結,内容是所指檔案的檔案名;在不同目錄下建立,内容是所指檔案的絕對路徑)。

下面是一些例子:

[email protected] ~> touch f1       #建立一個測試檔案f1
[email protected] ~> ln f1 f2        #建立f1的一個硬連接配接檔案f2
[email protected] ~> ln -s f1 f3    #建立f1的一個符号連接配接檔案f3
[email protected] ~> ls -li            # -i參數顯示檔案的inode節點資訊
#或者用stat指令來檢視檔案或檔案系統的詳細資訊

1284 -rw-r--r-- 2 keney keney    0 2009-05-24 10:44 f1  #權限後面的2就是硬連接配接數
1284 -rw-r--r-- 2 keney keney    0 2009-05-24 10:44 f2
1340 lrwxrwxrwx 1 keney keney    2 2009-05-24 10:45 f3 -> f1 #修改日期前面的2是檔案大小,
#說明軟連接配接f3是個特殊的文本檔案,裡面儲存者它所指向的檔案f1的路徑。
#inode index 1340後面的'l'說明是 連結,f1,f2是‘-’,普通檔案。

           

從上面的結果中可以看出,硬連接配接檔案f2與原檔案f1的inode節點相同,均為1284,說明它們是同一檔案。然而符号連接配接檔案的inode節點不同。

[email protected] ~> echo "I am f1 file" >> f1
[email protected] ~> cat f1
I am f1 file
[email protected] ~> cat f2
I am f1 file
[email protected] ~> cat f3
I am f1 file
[email protected] ~> rm -f f1
[email protected] ~> ls -li f2
1284 -rw-r--r-- 1 keney keney    0 2009-05-24 10:54 f2 #引用記數減1
[email protected] ~> cat f2
I am f1 file
[email protected] ~> cat f3
cat: f3: No such file or directory
           

當删除原始檔案f1後,硬連接配接f2不受影響,但是符号連接配接f1檔案無效

依此可見:

1).删除符号連接配接f3,對f1,f2無影響;

2).删除硬連接配接f2,對f1,f3也無影響;

3).删除原檔案f1,對硬連接配接f2沒有影響,導緻符号連接配接f3失效;

4).同時删除原檔案f1,硬連接配接f2,整個檔案會真正的被删除,此時引用記數減為0。

繼續閱讀