標籤:

mount --bind 可以算是ln一個目錄么?

如題,我感覺很像...求大神解答...


要釐清這個概念,我們首先要建立一個合理的名稱空間。我們從用戶態建立這個名稱空間,和內核中的概念不直接對應。

我們把存在磁碟上那個文件叫做inode,inode裡面是文件真正的內容。

把用來訪問這個文件的那個路徑,叫做一個dentry。比如/tmp/foo。

目錄是一個保存目錄中dentry的inode,這個inode也有自己的dentry。

軟鏈接(soft_link)是一個獨立的inode,它的內容是被鏈接的dentry。

硬鏈接(hard_link)不是一個inode,它是一個dentry,指向鏈接對象inode的另一個dentry。

bind_mount是在dentry之上覆蓋了一層dentry(是的,bind_mount可以同時作用在目錄和普通文件身上),也就是你通過這個dentry訪問inode的時候,你再也訪問不到原來的inode了,它指向了被你bind_mount的對象的inode。比如你原來有兩個dentry:/tmp/a和/tmp/b,你做mount --bind /tmp/a /tmp/b後,你訪問/tmp/b,修改的是原來/tmp/a的inode的內容,你umount後,/tmp/b中原來的內容不會改變,改變的是/tmp/a中的內容

有趣的是,當你用mount(或者mount --bind)查看你建立的bind mount鏈接的時候,它不會顯示被你鏈接的對象文件,而是現實那個文件所在的mount point,比如你mount --bind a b然後你看mount的結果,它可能顯示的是:

/dev/sda1 on /home/rancher/test2/b type ext4 (rw,relatime,data=ordered)

這是mount這個構架的原始設計導致的,它僅僅記錄每個真正的mountpoint,而不是bind的時候的文件,要知道實際的binding是什麼,可以查看這個文件:/proc/self/mountinfo。這個特性在2.6.28版本中由Alexey Dobriyan合入。

所以,ln -s和mount --bind是不同的。前者要求應用程序「知道」這是個鏈接,後者應用程序會「以為」這個文件是個真正的普通文件。

bind可以起到很多ln不能實現的效果(當然,前提是你有root許可權)。比如你要修改一個只讀文件系統的內容,比如你的/etc/hostname是只讀的,你想臨時修改,可以在/tmp目錄下寫一個/tmp/hostname,然後做mount --bind /etc/hostname /tmp/hostname,然後修改後者,就可以了。


這裡假設你說的ln是指的"ln -s"。先說答案:"mount --bind"不能算成是"ln -s"似的一個目錄。

從原理上來看,「ln -s」是在文件系統的inode中創建了一個符號鏈接,就像是建了一個跳轉指令/介面。而"mount --bind"是在已有的設備或文件系統上創建了「第二個掛載點」,與「ln -s」相比「mount --bind」更像是建了個路由器。

不少軟體對"ln -s"不是很友好,而「mount --bind」就沒有這個問題。典型的如vsftpd,「ln -s」對其完全無效。

不過"mount --bind"需要root許可權才能使用,而「ln -s 」沒有這個限制。


推薦閱讀:

長期使用一種linux發行版沒有重裝過是一種什麼樣的體驗?
進程地址空間

TAG:Linux | Linux內核 |