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.两个目录的对应关系存在于内存里,一旦重启挂载关系就不存在了


具体关于mount  --bind命令的执行流程,数据结构请参考以下文章

点击打开链接

感谢瑞风轻拂大大的精彩分享!



  • 13
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值