我在 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
在文件夹上运行(是一个简单的文件):user1
123user1
touch /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 和容器工具就可以立即使用。如果特定设置需要其他设置,他们可以根据需要将传播模式重置为私有。请注意,我们仅在内核直接调用时才设置此项。如果我们由容器管理器调用,我们假设容器管理器知道它在做什么(例如,因为它设置了一些具有不同传播模式的目录)。