如果使用 hard link 鏈接到目錄時, 鏈接的數(shù)據(jù)需要連同被鏈接目錄底下的所有數(shù)據(jù)都創(chuàng)建鏈接,舉例來說,如果你要將 /etc 使用實體鏈接創(chuàng)建一個 /etc_hd 的目錄時,那么在 /etc_hd 底下的所有檔名同時都與 /etc 底下的檔名要創(chuàng)建 hard link 的,而不是僅連結(jié)到 /etc_hd 與 /etc 而已。 并且,未來如果需要在 /etc_hd 底下創(chuàng)建新文件時,連帶的, /etc 底下的數(shù)據(jù)又得要創(chuàng)建一次 hard link ,因此造成環(huán)境相當(dāng)大的復(fù)雜度。 所以啰,目前 hard link 對于目錄暫時還是不支持的啊!
說法二:
先假設(shè)可以:即現(xiàn)在你有目錄/d1/d2和目錄/d3/d4硬鏈接,都指向同一結(jié)點(inode),現(xiàn)在分別在兩個目錄(d2和d4)下進行cd ..
結(jié)果會是怎樣呢?
也許你認為,它們有相同的結(jié)點,故他們應(yīng)該指向同一父目錄,這應(yīng)該是d1,但對于d4,其父目錄又是d3,于是問題就產(chǎn)生了,
這取決于d2和d4是哪個先創(chuàng)建的,這將會給目錄結(jié)構(gòu)造成混亂……
說法三:
直觀理解是,如果允許硬鏈接指向目錄,假設(shè)目錄.../d1/...與.../d2/...互為硬鏈接,那么在d1下必然包含目錄項“..”,試問這個“..”應(yīng)該指向d1還是d2?
深層剖析如下:
linux系統(tǒng)中的硬連接有兩個限制:不能跨越文件系統(tǒng)和不允許普通用戶對目錄作硬連接。至于第一個限制,很好理解,而第二個就不那么好理解了。我們對任何一個目錄用ls -l 命令都可以看到其連接數(shù)至少是2,這也說明了系統(tǒng)中是存在硬連接的,而且命令ln -d 也可以讓超級用戶對目錄作硬連接,這些都說明了系統(tǒng)限制對目錄進行硬連接只是一個硬性規(guī)定,并不是邏輯上不允許或技術(shù)上的不可行。那么操作系統(tǒng)為什么要進行限制呢?答案可能有兩個。
先來說第一個,如果引入了對目錄的硬連接就有可能在目錄中引入循環(huán),那么在目錄遍歷的時候系統(tǒng)就會陷入無限循環(huán)當(dāng)中。也許您會說,符號連接不也可以引入循環(huán)嗎,那么為什么不限制目錄的符號連接呢?原因就在于在linux系統(tǒng)中,每個文件(目錄也是文件)都對應(yīng)著一個inode結(jié)構(gòu),其中inode數(shù)據(jù)結(jié)構(gòu)中包含了文件類型(目錄,普通文件,符號連接文件等等)的信息,也就是說操作系統(tǒng)在遍歷目錄時可以判斷出符號連接,既然可以判斷出符號連接當(dāng)然就可以采取一些措施來防范進入過大的循環(huán)了,系統(tǒng)在連續(xù)遇到8個符號連接后就停止遍歷,這就是為什么對目錄符號連接不會進入死循環(huán)的原因了。但是對于硬連接,由于操作系統(tǒng)中采用的數(shù)據(jù)結(jié)構(gòu)和算法限制,目前是不能防范這種死循環(huán)的。
在說明第二個原因之前,我們先來看看文件的dentry結(jié)構(gòu)在系統(tǒng)空間中長什么樣子和它們是怎么存放在系統(tǒng)空間的。dentry結(jié)構(gòu)主要包含了文件名,文件的inode 號,指向父目錄dentry結(jié)構(gòu)的指針和其他一些與本次討論無關(guān)的指針,這里關(guān)鍵是那個指向父目錄的指針;系統(tǒng)中所有的dentry結(jié)構(gòu)都是按雜湊值存放在雜湊表中的,這里的雜湊算法很重要,它是取文件名和文件的父目錄dentry結(jié)構(gòu)的地址一起雜湊運算出雜湊值的?,F(xiàn)在我們假設(shè)有兩個目錄 /a和/b,其中/b是我們通過ln -d命令建立起來的對/a的硬連接。這個時候內(nèi)核空間中就會存在一個/a的dentry結(jié)構(gòu)和一個/b的dentry結(jié)構(gòu),由上面的知識可知,/a和/b 目錄下面的每一個文件或目錄都各自有對應(yīng)的dentry結(jié)構(gòu)(因為雖然/a目錄下面的文件名沒有改變,但是因為dentry結(jié)構(gòu)有指向父目錄dentry 的指針和計算雜湊值時考慮了父目錄dentry結(jié)構(gòu)的地址,這個時候dentry結(jié)構(gòu)就分身乏術(shù)了),而且這種繼承還會影響到所有子目錄下面的文件,這樣下來就會浪費很多系統(tǒng)空間了,特別是如果被硬連接的目錄中存在大量文件和子目錄的時候就更加明顯了。這也許是第二個原因。