咱們能夠經過mount --bind命令來將兩個目錄鏈接起來,mount --bind命令是將前一個目錄掛載到後一個目錄上,全部對後一個目錄的訪問其實都是對前一個目錄的訪問,以下所示:node
## test1 test2爲兩個不一樣的目錄 linux-UMLhEm:/home/test/linux # ls test1 11.test 1.test linux-UMLhEm:/home/test/linux # ls test2 22.test 2.test linux-UMLhEm:/home/test/linux # ls -lid test1 1441802 drwx------ 2 root root 4096 Feb 13 09:50 test1 linux-UMLhEm:/home/test/linux # ls -lid test2 1441803 drwx------ 2 root root 4096 Feb 13 09:51 test2 ## 執行mount --bind 將test1掛載到test2上,inode號都變爲test1的inode linux-UMLhEm:/home/test/linux # mount --bind test1 test2 linux-UMLhEm:/home/test/linux # ls -lid test1 1441802 drwx------ 2 root root 4096 Feb 13 09:50 test1 linux-UMLhEm:/home/test/linux # ls -lid test2 1441802 drwx------ 2 root root 4096 Feb 13 09:50 test2 linux-UMLhEm:/home/test/linux # ls test2 11.test 1.test ## 對test2的訪問或修改其實是改動test1目錄 linux-UMLhEm:/home/test/linux # cd test2 linux-UMLhEm:/home/test/linux/test2 # touch 3.test linux-UMLhEm:/home/test/linux/test2 # ls 11.test 1.test 3.test linux-UMLhEm:/home/test/linux/test2 # cd .. linux-UMLhEm:/home/test/linux # ls test1 11.test 1.test 3.test ## 解掛載後,test1目錄保持修改,test2保持不變 linux-UMLhEm:/home/test/linux # umount test2 linux-UMLhEm:/home/test/linux # ls test1 11.test 1.test 3.test linux-UMLhEm:/home/test/linux # ls test2 22.test 2.test ## 將test2掛載到test1上 linux-UMLhEm:/home/test/linux # ls -lid test2 1441803 drwx------ 2 root root 4096 Feb 13 09:51 test2 linux-UMLhEm:/home/test/linux # mount --bind test2 test1 linux-UMLhEm:/home/test/linux # ls -lid test1 1441803 drwx------ 2 root root 4096 Feb 13 09:51 test1 linux-UMLhEm:/home/test/linux # ls -lid test2 1441803 drwx------ 2 root root 4096 Feb 13 09:51 test2 linux-UMLhEm:/home/test/linux # ls test1 22.test 2.test
mount --bind test1 test2爲例,當mount --bind命令執行後,Linux將會把被掛載目錄的目錄項(也就是該目錄文件的block,記錄了下級目錄的信息)屏蔽,即test2的下級路徑被隱藏起來了(注意,只是隱藏不是刪除,數據都沒有改變,只是訪問不到了)。同時,內核將掛載目錄(test1)的目錄項記錄在內存裏的一個s_root對象裏,在mount命令執行時,VFS會建立一個vfsmount對象,這個對象裏包含了整個文件系統全部的mount信息,其中也會包括本次mount中的信息,這個對象是一個HASH值對應表(HASH值經過對路徑字符串的計算得來),表裏就有 /test1 到 /test2 兩個目錄的HASH值對應關係。linux
命令執行完後,當訪問 /test2下的文件時,系統會告知 /test2 的目錄項被屏蔽掉了,自動轉到內存裏找VFS,經過vfsmount瞭解到 /test2 和 /test1 的對應關係,從而讀取到 /test1 的inode,這樣在 /test2 下讀到的全是 /test1 目錄下的文件。測試
1.mount --bind鏈接的兩個目錄的inode號碼並不同,只是被掛載目錄的block被屏蔽掉,inode被重定向到掛載目錄的inode(被掛載目錄的inode和block依然沒變)。spa
2.兩個目錄的對應關係存在於內存裏,一旦重啓掛載關係就不存在了。code
在固件開發過程當中經常遇到這樣的狀況:爲測試某個新功能,必需修改某個系統文件。而這個文件在只讀文件系統上(總不能爲一個小小的測試就重刷固件吧),或者是雖然文件可寫,可是本身對這個改動沒有把握,不肯意直接修改。這時候mount --bind就是你的好幫手。
假設咱們要改的文件是/etc/hosts,可按下面的步驟操做:
1. 把新的hosts文件放在/tmp下。固然也可放在硬盤或U盤上。
2. mount --bind /tmp/hosts /etc/hosts 此時的/etc目錄是可寫的,所作修改不會應用到原來的/etc目錄,能夠放心測試。測試完成了執行 umount /etc/hosts 斷開綁定。 對象