標籤:
我們對任何一個目錄用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結構就分身乏術了),而且這種繼承還會影響到所有子目錄下面的檔案,這樣下來就會浪費很多系統空間了,特別是如果被硬串連的目錄中存在大量檔案和子目錄的時候就更加明顯了。這也許是第二個原因。
為什麼永久連結不能連結目錄