mount --bind使用方法

咱們能夠經過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 斷開綁定。 對象

相關文章
相關標籤/搜索