mount --bind和硬鏈接的區別

你們知道,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

相關文章
相關標籤/搜索