linux系統下的軟連接與硬鏈接

  前幾天在linux系統下安裝mongoDB,然後運行腳本導入數據的時候遇到了鏈接庫查詢不到的情況,如圖 1所示。當時是通過創建軟連接的方式解決的這個問題。雖然,通過網上的教程解決了這個問題,但是對於軟連接和硬鏈接始終不是很明白。趁着週末的時間補補課,將軟連接和硬鏈接的概念、特點以及創建的限制系統的學習一下。

圖 1 缺少文件的提示

  Linux下的連接文件分爲兩種,一種是類似於windows的快捷方式的軟連接,另一種是就是通常所說的硬鏈接。這兩種鏈接方式都是爲了實現文件的共享而存在的。下面根據自己的理解做一個介紹,如果有不對的地方,歡迎大家批評指正。

  在介紹硬鏈接和軟連接之前,首先說明一下linux系統的對於文件的設置。文件都是有文件名和文件中存儲的數據組成的,這在linux上被分成兩個部分:用戶數據部分和元數據部分。用戶數據就是文件數據塊,記錄着文件中真實的內容;元數據包含的是文件的附加屬性,如,文件的大小、創建時間、所有者信息、所屬的組等。在Linux中用戶數據的內容是通過元數據中的inode標識的,也就是說inode號纔是文件的唯一標識,而不是文件名。文件名只是爲了使用者的記憶和使用的方便,用戶可以通過文件名得到對應的inode號碼,系統或者程序通過inode號尋找正確的文件數據塊,如圖2所示。

 

圖 2 文件系統設置

  一、硬鏈接

  在硬鏈接下一個inode一般對應多個而文件名,可以通過link或者是ln創建,其本質是在某個目錄文件下創建一個文件名鏈接到某個inode號碼的關聯記錄而已,如圖3所示。其有以下特點:

  1. 硬鏈接具有相同的inode和data,如圖4;
  2. 只能對已經存在的文件創立硬鏈接,而不能對不存在的文件創建硬鏈接,如圖5;
  3. 只能對文件創建硬鏈接,不能對目錄創建硬鏈接,如圖6;
  4. 由於linux系統將不同的文件分類存放在不同的目錄系統下,因此不能對不同的文件文件系統交叉建立硬鏈接,如圖7;
  5. 由於硬鏈接是不同的文件引用相同的inode和data,因此刪除一個硬鏈接不會導致inode和data的消失;只有當所有的鏈接到這個inode的鏈接都被刪除的時候,最終的data纔會被刪除;也就是說不同的硬鏈接彼此之間不相互影響;這種引用的方式類似於智能指針的應用;

圖 3 硬鏈接

圖 4 硬鏈接相同的inode

 

圖 5 創建不存在的文件的鏈接

圖 6 創建目錄的硬鏈接失敗的情況

 

圖 7 不同設備之間創建硬鏈接

  二、軟連接

  和硬連接不同,軟連接一般存放的是另一文件的目錄名的指向(即另一個文件的路徑),而不是具有的inode值。因此軟連接有着自己的inode的data,這個inod的值是可以和要指向的文件具有的inode值具有相同的值的(如果軟連接和所指向的文件具有不同的文件系統),如圖8所示。基於上述對於軟鏈接的定義,可以得到軟鏈接的定義如下:

  1. 軟鏈接具有自己的元數據和用戶數據;
  2. 可以對不存在的文件創建軟鏈接,甚至可以對文件夾創建軟連接;如果對不存在的文件創建軟鏈接,則最終該軟鏈接稱爲死鏈接,如果後來創建了該軟鏈接指向的文件,那麼該軟鏈接將不再是死鏈接,如圖9所示;
  3. 因爲軟鏈接是中的用戶數據是另一個文件的路徑,因此如果該被指向的文件被刪除,那麼該鏈接失效,成爲死鏈接,如下圖用紅色表示;
  4. 軟鏈接可以交叉文件系統創建,因此軟鏈接的inode和指向的文件的inode可以具有相同的值,可以通過find / -inum xxxx找出具有相同的inod值得文件;

圖 8 軟連接

圖 9 軟連接測試用例

  總結:

  鏈接機制可以減少不必要文件的重複存在,減輕磁盤的壓力,歡迎吐槽!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章