mount --bind使用方法


我們可以通過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 斷開綁定。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM