绑定挂载 - CentOS 6 和 CentOS 7 上的结果不同

绑定挂载 - CentOS 6 和 CentOS 7 上的结果不同

我在 chroot 环境中安装了几个目录(绑定安装),但它们在 CentOS 6 和 7 上的行为不同 - 命令完全相同。

例子:

我的 chroot 环境在 中/chroot/base

然后我将其安装到每个用户上:

mount --bind /chroot/base /chroot/$user

然后我/home/$user在同一个用户的 chroot 中挂载:

mount --bind /home/$user /chroot/$user/home/$user

在 CentOS 6 上它工作正常并且挂载了那些目录,但是在 CentOS 7 上我得到了如下信息:

/dev/mapper/cl_cp-home /chroot/user1/home/user1 xfs rw,relatime,attr2,inode64,usrquota 0 0
/dev/mapper/cl_cp-home /chroot/user2/home/user1 xfs rw,relatime,attr2,inode64,usrquota 0 0
/dev/mapper/cl_cp-home /chroot/user3/home/user1 xfs rw,relatime,attr2,inode64,usrquota 0 0
/dev/mapper/cl_cp-home /chroot/user2/home/user2 xfs rw,relatime,attr2,inode64,usrquota 0 0
/dev/mapper/cl_cp-home /chroot/user3/home/user2 xfs rw,relatime,attr2,inode64,usrquota 0 0
/dev/mapper/cl_cp-home /chroot/user1/home/user2 xfs rw,relatime,attr2,inode64,usrquota 0 0
/dev/mapper/cl_cp-home /chroot/user3/home/user3 xfs rw,relatime,attr2,inode64,usrquota 0 0

每个用户的主目录都会挂载在其他用户的 chroot 环境中。

为什么会发生这种情况? CentOS6/7 之间发生了哪些变化,可能导致了这种情况?

编辑:

例如ls在文件夹上运行(是一个简单的文件):user1123user1touch /home/user1/123user1

root@server:~# ls /chroot/user1/home/user1/
123user1
root@server:~# ls /chroot/user2/home/user1/
123user1
root@server:~# ls /chroot/user3/home/user1/
123user1

更奇怪的是:

root@server:~# ls /chroot/base/home/user1/
123user1

我还没有在任何阶段安装它

答案1

行为的根源似乎是共享子树操作. 内核文档文档/sharedsubtree.txt提到这private是默认值,而实际上它是可以通过使用 挂载目录后shared查看获得的。/proc/self/mountinfo--bind

root@localhost ~]# mount --bind /chroot/base /chroot/test
[root@localhost ~]# grep test /proc/self/mountinfo
234 62 253:1 /chroot/base /chroot/test rw,relatime shared:1 - xfs /dev/vda1 rw,attr2,inode64,noquota

这导致坐骑在/chroot/测试回到/chroot/base然后会影响从/chroot/base

要恢复旧的行为,必须--make-private明确指定或private作为 mount 选项/etc/fstab

[root@localhost ~]# umount /chroot/test
[root@localhost ~]# mount --bind --make-private /chroot/base /chroot/test
[root@localhost ~]# grep test /proc/self/mountinfo
234 62 253:1 /chroot/base /chroot/test rw,relatime - xfs /dev/vda1 rw,attr2,inode64,noquota

private我认为将选项应用到您想要的任何绑定安装是安全的老的行为回归。


更新

内核默认设置仍为,private但由于更好的容器支持systemd,正在重新挂载文件系统shared。从systemd github 站点

将根目录标记为共享,以便挂载传播。内核默认为“私有”,但我们认为将默认设置为“共享”更有意义,这样 nspawn 和容器工具就可以立即使用。如果特定设置需要其他设置,他们可以根据需要将传播模式重置为私有。请注意,我们仅在内核直接调用时才设置此项。如果我们由容器管理器调用,我们假设容器管理器知道它在做什么(例如,因为它设置了一些具有不同传播模式的目录)。

相关内容