原因:引入了對目錄的硬連接就有可能在目錄中引入循環,在目錄遍歷的時候系統就會陷入無限循環當中,這樣導致無法定位到訪問目錄。 Linux的目錄結構是一棵以「/目錄」為根節點的樹,如果允許自訂硬連接,則很有可能會破壞這個結構,甚至形成循環;而一旦形成循環,對於需要遍歷目錄樹的命令,是致命的。所以為了避免對目錄樹結構的破壞,linux不允許使用者自訂硬連接在目錄上。
本教學操作環境:linux7.3系統、Dell G3電腦。
LINUX的硬連結不能連結到目錄是因為引入了對目錄的硬連結就有可能在目錄中引入循環,在目錄遍歷的時候系統就會陷入無限循環當中,這樣導致無法定位到訪問目錄。
linux系統中,每個文件(目錄也是文件)都對應著一個inode結構,其中inode資料結構中包含了文件類型(目錄,普通文件,符號連接文件等等)的信息,也是說作業系統在遍歷目錄時可以判斷出符號連接,既然可以判斷出符號連接當然就可以採取一些措施來防範進入過大的循環了,系統在連續遇到8個符號連接後就停止遍歷,這就是為什麼對目錄符號連接不會進入死循環的原因了。但對於硬連接,由於作業系統中採用的資料結構和演算法限制,目前是不能防範這種死循環的。
linux硬連結的本質
在探討問題之前,先來談談硬連結的本質。
硬連結其實就是目錄的inode所指向的block的內容。目錄的block中的每一筆記錄,都是一個硬連接。目錄本身是Linux中文件的一種(目錄文件,符號為d),而「目錄文件」的文件內容,就是一條條的硬連接。
舉例(注意圖片中目錄連接數的變化):
#tmp目錄連接數變化前後圖示如下(紅線表示連接數來源):
透過上面的例子可以發現,一個目錄剛被建立時的硬連結數就為2,其中一個來自於父目錄,另一個來自於自身的“.”。如果再為目錄建立一個子目錄,那麼硬連結數就會 1變成3,這是因為多了一個來自於子目錄的「..」的連結。
到這裡或許有人會問,不是說硬連結不能用目錄麼?上面的示範又是怎麼回事?
這裡需要澄清一個概念,“硬連接不能用於目錄”,是說不能由使用者自訂目錄的硬連接,而只能由作業系統來維護。實際上目錄和硬連接是不可分隔、互為一體的。 「硬連線」本身,其實就是目錄維護其子檔名&子目錄名的方式。
自訂硬連結的惡夢:循環
#談完了硬連結的本質,就可以回到今天的主題了:為什麼不允許使用者自訂目錄的硬連線?
我們知道Linux的目錄結構是一棵以「/目錄」為根節點的樹,如果允許自訂硬連接,則很有可能會破壞這個結構,甚至形成循環,例如下面的命令如果可以執行成功的話:
一旦形成循環,對於需要遍歷目錄樹的命令,是致命的(例如從上向下遍歷的du指令,從下往上遍歷的pwd指令)。所以為了避免對目錄樹結構的破壞,linux不允許使用者自訂硬連接在目錄上。軟連接之所以沒有這個限制,是因為軟連接檔案有一個專門的檔案類型,可供系統識別,而「硬連接檔案」和系統的正常檔案沒有任何不同,無法進行判斷。
相關推薦:《Linux影片教學》
以上是linux硬連結為何不能連結目錄的詳細內容。更多資訊請關注PHP中文網其他相關文章!