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/52060354

posted @ 2020-04-17 20:03  洋之悟  阅读(656)  评论(0编辑  收藏  举报