mount --bind和硬链接的区别

你们知道,hard link没法链接目录,而symbolic link虽然能够链接目录,但在有些程序里对符号链接的支持并很差,这个时候咱们能够经过mount --bind命令来将两个目录链接起来



如上图,新建两个目录   /test1    /test2    ,能够发现两个目录的inode号不一样



将两个目录bind起来  ,会发现inode号所有变成 以前  /test1 的inode号了,因此

mount --bind命令是将前一个目录挂载到后一个目录上,全部对后一个目录的访问其实都是对前一个目录的访问


看起来,mount --bind命令和硬链接很像,都是链接到同一个inode上面,只不过hard link没法链接目录,而mount --bind命令弥补了这个缺陷,因此不少人将这个命令理解为针对目录的硬链接

但这种想法是错的!

由于这二者的系统执行原理是不同的。

当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 目录下的文件

由上述过程可知,mount --bind 和硬链接的重要区别有:

1.mount --bind链接的两个目录的inode号码并不同,只是被挂载目录的block被屏蔽掉,inode被重定向到挂载目录的inode(被挂载目录的inode和block依然没变)

2.两个目录的对应关系存在于内存里,一旦重启挂载关系就不存在了
————————————————
版权声明:本文为CSDN博主「dAng1r0Us」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。
原文连接:https://blog.csdn.net/shengxia1999/article/details/52060354node

相关文章
相关标签/搜索