Shared subtrees
简单点说, Shared subtrees 就是一种控制子挂载点能否在其他地方被看到的技术,它只会在 bind mount 和 mount namespace 中用到,属于不怎么常用的功能。本篇将以 bind mount 为例对 Shared subtrees 做一个简单介绍
回想一下上一篇中介绍的bind mount部分,如果bind在一起的两个目录下的子目录再挂载了设备的话,他们之间还能相互看到子目录里挂载的内容吗? 比如在第一个目录下的子目录里面再mount了一个设备,那么在另一个目录下面能看到这个mount的设备里面的东西吗?答案是要看bind mount的propagation type。那什么是propagation type呢?
peer group和propagation type都是随着shared subtrees一起被引入的概念,下面分别对他们做一个介绍。
peer group
peer group 就是一挂载点的集合,他们之间可以共享挂载信息。
mount-bind使得源和目的挂载点属于同一个peer group
创建新的mount namespace,新的和老的namespace里相同挂载点就会属于同一个peer group,因为新namespace会拷贝一份老namespace的挂载点信息
propagation type
这是一个标志,决定修改挂载点的时候会不会影响相同的peer group
MS_SHARED: 挂载信息会在同一个peer group的不同挂载点之间共享传播
MS_PRIVATE: 挂载信息根本就不共享,也即private的挂载点不会属于任何peer group
MS_SLAVE: 信息的传播是单向的,在同一个peer group里面,master的挂载点下面发生变化的时候,slave的挂载点下面也跟着变化,但反之则不然,slave下发生变化的时候不会通知master,master不会发生变化。
MS_UNBINDABLE: 这个和MS_PRIVATE相同,只是这种类型的挂载点不能作为bind mount的源,主要用来防止递归嵌套情况的出现
需要注意的地方
propagation type是挂载点的属性,每个挂载点都是独立的
挂载点是有父子关系的,比如挂载点/和/mnt/cdrom,/mnt/cdrom都是‘/’的子挂载点,‘/’是/mnt/cdrom的父挂载点
默认情况下,如果父挂载点是MS_SHARED,那么子挂载点也是MS_SHARED的,否则子挂载点将会是MS_PRIVATE,跟爷爷挂载点没有关系
实例
准备环境
|
|
|
|
|
|
|
|
查看 propagation type 和 peer group
|
|
|
|
|
|
|
|
|
|
shared 和 private mount
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
slave mount
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
总结
如果用到了 bind mount 和 mount namespace ,在挂载设备的时候就需要注意一下父挂载点是否和其他挂载点有 peer group 关系,如果有且父挂载点是 shared ,就说明你挂载的设备除了在当前挂载点可以看到,在父挂载点的 peer group 的下面也可以看到。