你們知道,hard link沒法鏈接目錄,而symbolic link雖然能夠鏈接目錄,但在有些程序裏對符號鏈接的支持並很差,這個時候咱們能夠經過mount --bind命令來將兩個目錄鏈接起來
如上圖,新建兩個目錄 /test1 /test2 ,能夠發現兩個目錄的inode號不一樣
將兩個目錄bind起來 ,會發現inode號所有變成 以前 /test1 的inode號了,因此
mount --bind命令是將前一個目錄掛載到後一個目錄上,全部對後一個目錄的訪問其實都是對前一個目錄的訪問
看起來,mount --bind命令和硬鏈接很像,都是鏈接到同一個inode上面,只不過hard link沒法鏈接目錄,而mount --bind命令彌補了這個缺陷,因此不少人將這個命令理解爲針對目錄的硬鏈接
但這種想法是錯的!
由於這二者的系統執行原理是不同的。
當mount --bind命令執行後,Linux將會把被掛載目錄的目錄項(也就是該目錄文件的block,記錄了下級目錄的信息)屏蔽,在本例裏就是 /test2 的下級路徑被隱藏起來了(注意,只是隱藏不是刪除,數據都沒有改變,只是訪問不到了)
同時,內核將掛載目錄(本例裏是 /test1)的目錄項記錄在內存裏的一個s_root對象裏
在mount命令執行時,VFS會建立一個vfsmount對象,這個對象裏包含了整個文件系統全部的mount信息,其中也會包括本次mount中的信息,這個對象是一個HASH值對應表(HASH值經過對路徑字符串的計算得來),表裏就有 /test1 到 /test2 兩個目錄的HASH值對應關係
命令執行完後,當訪問 /test2下的文件時,系統會告知 /test2 的目錄項被屏蔽掉了,自動轉到內存裏找VFS,經過vfsmount瞭解到 /test2 和 /test1 的對應關係,從而讀取到 /test1 的inode,這樣在 /test2 下讀到的全是 /test1 目錄下的文件
由上述過程可知,mount --bind 和硬鏈接的重要區別有:
1.mount --bind鏈接的兩個目錄的inode號碼並不同,只是被掛載目錄的block被屏蔽掉,inode被重定向到掛載目錄的inode(被掛載目錄的inode和block依然沒變)
2.兩個目錄的對應關係存在於內存裏,一旦重啓掛載關係就不存在了
————————————————
版權聲明:本文爲CSDN博主「dAng1r0Us」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/shengxia1999/article/details/52060354node