实验环境
内核版本:3.10.0-957.27.2.el7.x86_64
系统版本:CentOS Linux release 7.6.1810 (Core)
创建新的mnt namespace的命令:unshare -m --propagation unchanged sh
实验内容
--make-shared
--make-shared:共享挂载,不同namespace的进程对同一个目录进行挂载、卸载等操作时,会相互影响。比如说在主机上新建一个目录/home/mnt_test,这时把一个磁盘分区挂载在这个目录下,然后使用unshare命令进入一个新的namespace,挂载一个新的磁盘分区到这个目录,会发现在主机上这个目录下的内容已经变了。 验证如下:
1. 在主机上把/dev/sda3 共享挂载到/home/mnt_test下面
2. 进入新的namespace,并把/dev/sdb1共享挂载到/home/mnt_test下面
观察两个图片,可以发现在新的namespace挂载新的分区之后,原主机上的/home/mnt_test内容也相应的发生变化,所以说明共享挂载是能够相互影响的。
--make-private
--make-private:私有挂载,不同namespace的进程对同一个目录进行挂载、卸载等操作时,不会相互影响。和共享挂载不同,不同的namespace对同一个挂载目录进行操作,相互之间没有影响。验证如下:
1. 在主机上把/dev/sda3 私有挂载到/home/mnt_test下面
2. 进入新的namespace,并把/dev/sdb1私有挂载到/home/mnt_test下面。然后观察两个不同namespace的/home/mnt_test目录的区别。
可以看到,当两个namespace都是私有挂载时,在新的namespace下把不同的磁盘分区挂到相同的目录下,并不会影响原主机的挂载内容。
--make-slave
--make-slave:从属挂载,在新的namespace中把某个目录的挂载改成从属挂载之后,在新的namespace中对这个目录进行挂载,不会对老的namespace造成影响。 但在老的namespace中对这个目录进行操作,新的namespace中会对这些操作进行同步。 也就是主、从挂载,主能够影响从,但从不会影响主。
试验从属挂载需要有三个目录:
/home/mnt_test :主机上把/dev/sda3挂载到这个目录上
/home/mnt_test/test1 :新的namespace中,把/dev/sdb2挂载到上面
/home/mnt_test/test2 :主机上把/dev/sdb2挂载到上面
1. 在主机上共享挂载/home/mnt_test
2. 进入新的namespace,把这个挂载目录改成slave模式
3. 在新的namespace中,把/dev/sdb2挂载到/home/mnt_test/test1
此时在新的namespace中可以看到test1中有内容,但原有主机中的test1并没有内容,说明从模式下的操作对主挂载点没有影响。
4. 在主机上,把/dev/sdb2挂载到/home/mnt_test/test2
可以看到,在主的挂载点上挂载新的目录后,在新的namespace,即从节点上也能看到这个挂载点,说明主能对从产生影响。而且在sh-4.2中,把/home/mnt_test/test2卸载后,对原主机的挂载也没有影响。
--make-unbindable
--make-unbindable:不可绑定挂载,把某个挂载目录改成这个选项,那么当另一个目录用--rbind绑定挂载这个目录的父目录时,这个目录不会被挂载,在新的目录下看不到这个目录的内容。
例如:在主机上的/home/mnt_test目录,挂载/dev/sda3
在新的namespace中,/home/mnt_test/mntx目录,不可绑定挂载/dev/sdb1
在新的namespace中,/home/mnt_test/mnty目录,--rbind绑定挂载/home/mnt_test
最后的结果是在/home/mnt_test/mnty目录下,/home/mnt_test/mnty/mntx目录没有内容,而且没有挂载。实操如下:
1. 在主机上进行挂载操作:mount /dev/sda3 /home/mnt_test,挂载完成之后使用mount命令检查
2. 进入新的namespace:unshare -m --propagation unchanged sh
3. 在新的namespace中先把/dev/sdb1挂载到/home/mnt_test/mntx目录:mount /dev/sdb1 /home/mnt_test/mntx,然后mount检查
4. 在新的namespace中把/home/mnt_test目录递归绑定挂载到/home/mnt_test/mnty目录:mount --rbind /home/mnt_test/ /home/mnt_test/mnty,然后mount检查
此时会发现/home/mnt_test/mnty/mntx目录竟然也成了一个挂载点,进入/home/mnt_test/mnty/mntx,进入发现里面有内容:
5. 把第3、4步的挂载点卸载之后,重新使用不可绑定挂载把/dev/sdb1挂载到/home/mnt_test/mntx目录:mount --make-unbindable /dev/sdb1 /home/mnt_test/mntx,然后mount检查:
6. 重复第4步,mount检查:
发现此时已经没有/home/mnt_test/mnty/mntx目录这个挂载点了,进入/home/mnt_test/mnty/mntx,发现里面没有内容:
以上,是我实验出的不可绑定挂载的特性。注意:实验中,只有在同一个namespace中才能生效,跨namespace就没用了,目前不知道是什么原理。