我們可以通過mount --bind命令來將兩個目錄連接起來,mount --bind命令是將前一個目錄掛載到后一個目錄上,所有對后一個目錄的訪問其實都是對前一個目錄的訪問,如下所示:
## 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值對應關系。
命令執行完后,當訪問 /test2下的文件時,系統會告知 /test2 的目錄項被屏蔽掉了,自動轉到內存里找VFS,通過vfsmount了解到 /test2 和 /test1 的對應關系,從而讀取到 /test1 的inode,這樣在 /test2 下讀到的全是 /test1 目錄下的文件。
1.mount --bind連接的兩個目錄的inode號碼並不一樣,只是被掛載目錄的block被屏蔽掉,inode被重定向到掛載目錄的inode(被掛載目錄的inode和block依然沒變)。
2.兩個目錄的對應關系存在於內存里,一旦重啟掛載關系就不存在了。
在固件開發過程中常常遇到這樣的情況:為測試某個新功能,必需修改某個系統文件。而這個文件在只讀文件系統上(總不能為一個小小的測試就重刷固件吧),或者是雖然文件可寫,但是自己對這個改動沒有把握,不願意直接修改。這時候mount --bind就是你的好幫手。
假設我們要改的文件是/etc/hosts,可按下面的步驟操作:
1. 把新的hosts文件放在/tmp下。當然也可放在硬盤或U盤上。
2. mount --bind /tmp/hosts /etc/hosts 此時的/etc目錄是可寫的,所做修改不會應用到原來的/etc目錄,可以放心測試。測試完成了執行 umount /etc/hosts 斷開綁定。