文件系统
mount的高级用法
有时候,Linux中的文件系统是一个相当简单的树。进程可以对本身执行 chroot(),使其文件系统树的根成为系统文件系统根的一个子目录。在树中的任何节点上,可以用来自新设备的树覆盖文件系统。 在 2000 年,Al Viro 为 Linux 引入了绑定挂载和文件系统名称空间:
- 绑定挂载(bind mount)允许从任何其他位置访问任何文件或目录。
- 文件系统名称空间(filesystem namespace)是与不同进程相关联的完全独立的文件系统树。
在执行 clone(2) 时,进程请求它当前的文件系统树的拷贝(更多信息见 参考资料);在此之后,新进程就拥有与原进程的文件系统树相同的拷贝。在建立拷贝之后,在这两个树中的任何挂载操作都不会影响另一个拷贝。------?????????
尽管每个进程使用单独的文件系统名称空间在理论上非常有意义,但是在实践中,完全隔离它们会造成较大的限制性。进程克隆了系统的文件系统名称空间之后,已经运行的系统守护进程无法为这个用户自动挂载 CD-ROM,因为在原文件系统名称空间中执行的挂载无法影响用户的拷贝。 2006 年引入的挂载传播(mount propagation)解决了这个问题,挂载传播定义了挂载对象之间的关系。系统用这些关系决定任何挂载对象中的挂载事件如何传播到其他挂载对象:
- 如果两个挂载对象具有共享关系,那么一个挂载对象中的挂载事件会传播到另一个挂载对象,反之亦然。
- 如果两个挂载对象形成从属(slave)关系,那么一个挂载对象中的挂载事件会传播到另一个挂载对象,但是反过来不行;在这种关系中,从属对象是事件的接收者。
传播事件的挂载对象称为共享挂载(shared mount);接收挂载事件的挂载对象称为从属挂载(slave mount)。既不传播也不接收挂载事件的挂载对象称为私有挂载(private mount)。另一种特殊的挂载对象称为不可绑定的挂载(unbindable mount),它们与私有挂载相似,但是不允许执行绑定挂载。不可绑定的挂载对于快速增长挂载对象尤其有意义(后面会进一步讨论这个概念)。
在默认情况下,所有挂载都是私有的。可以用以下命令将挂载对象显式地标为共享挂载:
mount --make-shared <mount-object>
例如,如果 / 上的挂载必须是共享的,那么执行以下命令:
mount --make-shared /
从共享挂载克隆的挂载对象也是共享的挂载;它们相互传播挂载事件。
通过执行以下命令,可以显式地将一个共享挂载转换为从属挂载:
mount --make-slave <shared-mount-object>
从从属挂载克隆的挂载对象也是从属的挂载,它也从属于原来的从属挂载的主挂载对象。
通过执行以下命令,可以将挂载对象标为私有的:
mount --make-private <mount-object>
通过执行以下命令,可以将挂载对象标为不可绑定的:
mount --make-unbindable <mount-object>
最后,这些设置都可以递归地应用,这意味着它们将应用于目标挂载之下的所有挂载。
例如:
mount --make-rshared /
将 / 之下的所有挂载转换为共享挂载。