Linux 檔案硬鏈結和軟連線

2021-07-23 15:51:40 字數 1407 閱讀 1326

一.概念

硬鏈結(hard link):a是b的硬鏈結(a和b都是檔名),則a的目錄項中的inode節點號與b的目錄項中的inode節點號相同,即乙個inode節點對應兩個不同的檔名,兩個檔名指向同乙個檔案,a和b對檔案系統來說是完全平等的。如果刪除了其中乙個,對另外乙個沒有影響。每增加乙個檔名,inode節點上的鏈結數增加一,每刪除乙個對應的檔名,inode節點上的鏈結數減一,直到為0,inode節點和對應的資料塊被**。注:檔案和檔名是不同的東西,rm a刪除的只是a這個檔名,而a對應的資料塊(檔案)只有在inode節點鏈結數減少為0的時候才會被系統**。

軟鏈結(soft link):a是b的軟鏈結(a和b都是檔名),a的目錄項中的inode節點號與b的目錄項中的inode節點號不相同,a和b指向的是兩個不同的inode,繼而指向兩塊不同的資料塊。但是a的資料塊中存放的只是b的路徑名(可以根據這個找到b的目錄項)。a和b之間是「主從」關係,如果b被刪除了,a仍然存在(因為兩個是不同的檔案),但指向的是乙個無效的鏈結。

注:為何不能對目錄建立硬鏈結(ln -d 可以讓超級使用者對目錄作硬連線)

第乙個,如果引入了對目錄的硬連線就有可能在目錄中引入迴圈,那麼在目錄遍歷的時候系統就會陷入無限迴圈當中。也許您會說,符號連線不也可以引入迴圈嗎,那麼為什麼不限制目錄的符號連線呢?原因就在於在linux系統中,每個檔案(目錄也是檔案)都對應著乙個inode結構,其中inode資料結構中包含了檔案型別(目錄,普通檔案,符號連線檔案等等)的資訊,也就是說作業系統在遍歷目錄時可以判斷出符號連線,既然可以判斷出符號連線當然就可以採取一些措施來防範進入過大的迴圈了,系統在連續遇到8個符號連線後就停止遍歷,這就是為什麼對目錄符號連線不會進入死迴圈的原因了。但是對於硬連線,由於作業系統中採用的資料結構和演算法限制,目前是不能防範這種死迴圈的。

在說明第二個原因之前,我們先來看看檔案的目錄項(dentry)結構在系統空間中長什麼樣子和它們是怎麼存放在系統空間的。dentry結構主要包含了檔名,檔案的inode號,指向父目錄dentry結構的指標和其他一些與本次討論無關的指標,這裡關鍵是那個指向父目錄的指標;系統中所有的dentry結構都是按雜湊值存放在雜湊表中的,這裡的雜湊演算法很重要,它是取檔名和檔案的父目錄dentry結構的位址一起雜湊運算出雜湊值的。現在我們假設有兩個目錄 /a和/b,其中/b是我們通過ln -d命令建立起來的對/a的硬連線。這個時候核心空間中就會存在乙個/a的dentry結構和乙個/b的dentry結構,由上面的知識可知,/a和/b目錄下面的每乙個檔案或目錄都各自有對應的dentry結構(因為雖然/a目錄下面的檔名沒有改變,但是因為dentry結構有指向父目錄dentry 的指標和計算雜湊值時考慮了父目錄dentry結構的位址,這個時候dentry結構就分身乏術了),而且這種繼承還會影響到所有子目錄下面的檔案,這樣下來就會浪費很多系統空間了,特別是如果被硬連線的目錄中存在大量檔案和子目錄的時候就更加明顯了。這也許是第二個原因。

linux軟連線和硬鏈結

一 鏈結檔案 鏈結有兩種方式,軟鏈結和硬鏈結。1 軟鏈結檔案 軟鏈結又叫符號鏈結,這個檔案包含了另乙個檔案的路徑名。可以是任意檔案或目錄,可以鏈結不同檔案系統的檔案。鏈結檔案甚至可以鏈結不存在的檔案,這就產生一般稱之為 斷鏈 的問題 或曰 現象 鏈結檔案甚至可以迴圈鏈結自己。類似於程式語言中的遞迴。...

linux軟連線和硬鏈結

一 鏈結檔案 鏈結有兩種方式,軟鏈結和硬鏈結。1 軟鏈結檔案 軟鏈結又叫符號鏈結,這個檔案包含了另乙個檔案的路徑名。可以是任意檔案或目錄,可以鏈結不同檔案系統的檔案。鏈結檔案甚至可以鏈結不存在的檔案,這就產生一般稱之為 斷鏈 的問題 或曰 現象 鏈結檔案甚至可以迴圈鏈結自己。類似於程式語言中的遞迴。...

Linux軟連線和硬鏈結

原部落格 1.linux鏈結概念 linux鏈結分兩種,一種被稱為硬鏈結 hard link 另一種被稱為符號鏈結 symbolic link 預設情況下,ln命令產生硬鏈結。硬連線 硬連線指通過索引節點來進行連線。在linux的檔案系統中,儲存在磁碟分割槽中的檔案不管是什麼型別都給它分配乙個編號,...