Linux中為什麼硬鏈結不能指向目錄

2021-06-29 03:39:45 字數 1748 閱讀 7545

說法一:

如果使用 hard link 鏈結到目錄時, 鏈結的資料需要連同被鏈結目錄底下的所有資料都建立鏈結,舉例來說,如果你要將 /etc 使用實體鏈結建立乙個 /etc_hd 的目錄時,那麼在 /etc_hd 底下的所有檔名同時都與 /etc 底下的檔名要建立 hard link 的,而不是僅鏈結到 /etc_hd 與 /etc 而已。 並且,未來如果需要在 /etc_hd 底下建立新檔案時,連帶的, /etc 底下的資料又得要建立一次 hard link ,因此造成環境相當大的複雜度。 所以囉,目前 hard link 對於目錄暫時還是不支援的啊!

說法二:

先假設可以:即現在你有目錄/d1/d2和目錄/d3/d4硬鏈結,都指向同一結點(inode),現在分別在兩個目錄(d2和d4)下進行cd ..

結果會是怎樣呢?

也許你認為,它們有相同的結點,故他們應該指向同一父目錄,這應該是d1,但對於d4,其父目錄又是d3,於是問題就產生了,

這取決於d2和d4是哪個先建立的,這將會給目錄結構造成混亂……

說法三:

直觀理解是,如果允許硬鏈結指向目錄,假設目錄.../d1/...與.../d2/...互為硬鏈結,那麼在d1下必然包含目錄項「..」,試問這個「..」應該指向d1還是d2?

深層剖析如下:

linux系統中的硬連線有兩個限制:不能跨越檔案系統和不允許普通使用者對目錄作硬連線。至於第乙個限制,很好理解,而第二個就不那麼好理解了。我們對任何乙個目錄用ls -l 命令都可以看到其連線數至少是2,這也說明了系統中是存在硬連線的,而且命令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結構就分身乏術了),而且這種繼承還會影響到所有子目錄下面的檔案,這樣下來就會浪費很多系統空間了,特別是如果被硬連線的目錄中存在大量檔案和子目錄的時候就更加明顯了。這也許是第二個原因。

ps: 雜湊就是 hash,hash演算法,hash表等。

為什麼硬鏈結不能指向目錄

linux系統中的硬連線有兩個限制 不能跨越檔案系統和不允許普通使用者對目錄作硬連線。至於第乙個限制,很好理解,而第二個就不那麼好理解了。我們對任何乙個目錄用ls l 命令都可以看到其連線數至少是2,這也說明了系統中是存在硬連線的,而且命令ln d 也可以讓超級使用者對目錄作硬連線,這些都說明了系統...

硬鏈結為什麼不能跨目錄和檔案系統

關於為什麼不能跨檔案系統?首先,不同的檔案系統的檔案管理方式不同,甚至有些檔案系統不是索引檔案系統,並不一定兩個檔案系統的inode有相同的含義。再者,即使有相同inode含義,硬鏈結的幾個檔案,具有相同的inode號碼。不同檔案系統中,也可能有使用該inode號的檔案,這將產生矛盾。那不能 har...

linux 為什麼要用硬連線

linux 為什麼要用硬連線 author hjjdebug date 2017年 12月 15日 星期五 09 46 44 cst 軟連線是符號,是路徑.是連線 硬連線是別名.是主體,無路徑資訊.其實它不是連線.軟連線有主次,硬連線無主次.看的懂嗎?看的懂就不用看了,看不懂繼續.用linux有不少...