mount --make-shared 用来显式启用挂载事件跨命名空间传播,而非加强隔离;它将挂载点标记为共享根节点,使 mount/umount 事件可被其他设为 shared 或 slave 的命名空间接收,适用于需协同感知挂载变更的场景,但须谨慎使用以防破坏隔离。

在多命名空间隔离环境下,mount --make-shared 不是用来“加强隔离”的,而是用来**显式启用挂载事件跨命名空间传播**——这与默认的隔离行为相反。它适用于需要多个命名空间协同感知同一挂载变更的场景(如统一挂载新设备、动态注入配置卷),但必须谨慎使用,否则会破坏隔离边界。
共享挂载的底层逻辑
Mount Namespace 默认以 private 模式创建:新命名空间获得父命名空间挂载状态的副本,后续 mount/umount 互不影响。而 --make-shared 将某个挂载点标记为“共享挂载树根节点”,使其挂载/卸载事件可被其他标记为 shared 或 slave 的命名空间接收。
- 一个挂载点需先执行
mount --make-shared /path才能成为传播源 - 其他命名空间中对应路径需设为
shared或slave(如mount --make-slave /path)才能接收传播 - 仅靠
unshare --mount不会自动设置 shared;必须手动配置传播关系
典型配置步骤(以双命名空间同步挂载为例)
假设你有两个隔离环境(如租户A和租户B),希望它们都自动看到宿主机挂载的新 NFS 共享:
- 在宿主机上挂载 NFS 并设为 shared:
sudo mount -t nfs 192.168.1.100:/data /mnt/sharedsudo mount --make-shared /mnt/shared - 为租户A创建带 mount 命名空间的 shell,并将 /mnt/shared 设为 slave:
sudo unshare --user --mount --fork bashmount --make-slave /mnt/shared - 同理为租户B创建另一个命名空间并执行
mount --make-slave /mnt/shared - 此时在宿主机执行
sudo mount -t tmpfs tmpfs /mnt/shared/cache,两个租户命名空间内也会自动出现该子挂载
风险与规避要点
误用 --make-shared 容易导致逃逸或干扰:
- 不要对根目录
/或关键系统路径(如/proc、/sys)设为 shared,否则子命名空间的挂载可能反向影响宿主机 - 生产环境多租户隔离中,应优先使用
mount --make-rprivate /(递归设为 private)来阻断所有传播,这是更安全的默认做法 - 若必须共享,建议限定在专用挂载点(如
/runtime/shared),并配合绑定挂载(bind mount)提供只读视图
验证传播是否生效
检查各命名空间的挂载传播类型:
- 查看当前命名空间中某路径的传播标志:
findmnt -o TARGET,PROPAGATION /mnt/shared - 对比不同命名空间下
/proc/self/mountinfo中对应条目的shared:字段是否存在 - 在源命名空间挂载一个临时文件系统(如
mount -t tmpfs tmpfs /mnt/shared/test),再进入目标命名空间运行ls /mnt/shared/test确认是否可见











