奧推網

選單
財經

Linux檔案系統中的硬連結及常見面試題

如果能對inode的概念有所瞭解,對理解本文會有所幫助。如果對inode的概念不太清楚也沒有關係,我們會捎帶介紹一下。在檔案系統的實現層面,我們可以認為包含兩個元件:一個是包含資料塊的池子,池子中的資料塊是等大小的,比如4KB,8KB等;另外一個是管理這些資料塊的資料庫。當普通使用者訪問檔案資料時,正是透過前面所說的資料庫來找到檔案對應的資料塊的。

什麼是inode

inode是Linux(Unix)作業系統中檔案系統的一個概念。inode的全稱為index node,也就是索引節點。那麼inode是用來索引什麼的呢?其實inode表示的是一個檔案,它是用來索引檔案資料的。以Ext3檔案系統為例,其檔案資料透過間接塊的方式來管理,inode透過一個間接塊樹來管理整個檔案的資料。

圖1 Ext3間接塊陣列組織形式

如圖所示,inode中包含索引資訊,透過檔案的邏輯地址和inode中的索引資訊,可以很方面的找到檔案特定位置的資料。關於inode與檔案系統的更多知識,大家可以翻閱本號的其它文章,本文不再贅述。

需要注意的是,在inode中並沒有檔名稱相關的資訊。檔名稱相關的資訊是儲存在目錄當中,在目錄當中有檔名稱與inode ID之間的對應關係,具體如下所示。由於有兩者之間的對應關係,因此可以根據檔名輕鬆地獲取到inode ID,進而得到inode的資訊。

圖2 目錄內資料格式

什麼是硬連結

檔案的硬連結是一個指向inode的目錄項。硬連結從表面上來說就是一個檔案,但是該檔案是基於原始檔案建立的連結檔案。硬連結與原始檔指向相同的inode,因此其資料也是完全一樣的。

相對於硬連結,還有一個軟連結的概念。軟連結是指向一個具體的檔案的,而非檔案的inode,所以當檔案重新命名時,軟連結就會失效。因為該軟連結原本指向的檔案不存在了。而硬連結則不會存在這種情況。

假設如圖所示的目錄結構,在目錄Linux中有file1和file2兩個檔案。目錄程式語言中有file2檔案一個指向目錄linux中file1的硬連結。

這是在使用者層面的形態,那麼在檔案系統層面是如何的呢?

在檔案系統層面,我們知道檔案系統透過一個inode來指示一個檔案(包括目錄)的內容。目錄“電子書”的inode ID是15,其內容圖下圖所示,包含Linux,程式語言等子目錄,對應的inode ID分別如圖所示。

對於目錄“Linux”來說,其中包含檔案file1和file2,inode ID分別是19和20。目錄“程式語言”的包含檔案file2和硬連結file1_hlink,可以看出file1的inode ID和硬連結file1_hlink的inode ID是相同的,都指向19。inode 19 的內容如下所示。

透過上圖可以看出硬連結與原始檔的對應關係。

如何在Linux建立一個硬連結

前面介紹了很多原理性的內容,那麼如何在Linux中建立一個硬連結呢?很簡單,透過ln命令即可,如下是建立硬連結的命令格式。

ln target_file link_name

上述命令將為檔案target_file建立一個名為link_name的硬連結。透過對比你會發現兩者沒有任何差異,包括檔案內容和屬性。

如果你透過ls -li命令可以看到,兩個檔案的inode ID是相同的(第一列的內容),而檔案的計數則是2(rwx許可權後面的數字),說明有兩個檔名稱指向該inode。

134195 -rw-r——r—— 2 sunnyzhang sunnyzhang 0 Jul 17 19:49 target_file

134195 -rw-r——r—— 2 sunnyzhang sunnyzhang 0 Jul 17 19:49 link_name

下面這些知識點在面試中經常遇到

在後端程式設計師面試過程中經常會遇到連結相關的面試題,下面幾個面試題是硬連結相關的題目。

如果一個檔案有硬連結,刪除原始檔會怎樣?

如果存在硬連結,刪除原檔案將不會刪除檔案的資料。透過硬連結仍然能夠訪問檔案的資料。

為什麼會出現這種情況?這是因為當有目錄項指向inode的時候,inode會增加引用計數。通常情況下引用計數是1,當有一個硬連線時為2,再有一個硬連結的時候就變成了3。

當我們刪除普通檔案(無硬連結)的時候,首先會刪除目錄項中的內容,然後將inode的引用計數減1,如果此時inode中引用計數為0,則刪除該inode,同時刪除相關聯的資料。如果非0,則只刪除目錄項,而不刪除相關內容。所以,如果存在硬連結則可以正常訪問檔案內容。

為什麼沒法為目錄建立硬連結?

我們可以為目錄建立一個軟連結,但是當我們為目錄建立硬連結的時候將會出現如下錯誤提示:

ln: newdir/test_dir: hard link not allowed for directory

為什麼不能為目錄建立硬連結呢?這是因為在目錄中除了檔案相關內容外,還有一個指向父目錄的目錄項,具體如下圖所示的“。。”目錄。如果我們在其它目錄建立該目錄的硬連結,那麼該內容就會被改寫,從而導致混亂。

除了導致目錄資料混亂外,還有一種問題就是會形成路徑環。至於如何形成路徑環本文不再贅述,大家可以自己思考一下。

能否區分原始檔與硬連結?

實際上並沒有任何資訊區分硬連結和原始檔。如果我們在檔名命名規則上沒有限制,那麼我們將無法區分兩者。也就是說,檔案本身也是一個硬連結。

134195 -rw-r——r—— 2 sunnyzhang sunnyzhang 0 Jul 17 19:49 target_file134195 -rw-r——r—— 2 sunnyzhang sunnyzhang 0 Jul 17 19:49 link_target_file

比如上面這個例子,我們可以透過檔名稱來知道哪個是硬連結。但是並沒有其它資訊進行區分。

如何查詢一個檔案的硬連結?

如果你發現一個檔案的引用計數大於1,那麼該檔案肯定是有硬連結的。那麼如何找到這個檔案的所有硬連結呢?其實很簡單,透過find命令就行。find命令有個-inum選項,用於查詢指定inode ID的檔案,具體如下。

find 。 -inum inode_number

今天的內容先到這裡,更多關於Linux作業系統及檔案系統的內容,請關注本號。