Linux mount namespace选择 shared、private 与 slave 传播属性的实现方法
我在排查容器或服务的挂载隔离时,最容易踩的坑不是命令不会写,而是把 namespace 隔离和挂载传播混成了一件事。创建新的 mount namespace 只复制挂载视图;如果挂载点仍属于 shared peer group,后续 mount、umount 事件仍可能沿着传播关系进入另一个 namespace。选择 shared、private 还是 slave,关键看事件方向:双向同步用 shared,只接收上游变化用 slave,完全不互通用 private。
- shared 会在同一 peer group 的挂载之间双向传播直接子挂载事件。
- slave 接收 master shared group 的事件,但不会把本地事件传回上游。
- private 不加入 peer group,事件既不进入也不出去;递归变更要显式使用 r 变体。
- 复查时看 /proc/self/mountinfo 的 shared:X、master:X 等可选字段,不要只看目录是否存在。
资料入口:https://man7.org/linux/man-pages/man7/mount_namespaces.7.html
先按事件方向区分三种传播属性
把一个挂载点想成 namespace 边界上的“接收器”。shared 既接收也转发:同一 peer group 中某个挂载点下面创建或卸载直接子挂载,其他 peer 会看到对应变化。private 没有 peer group,变化停留在当前挂载树。slave 则保留一条从 master 到本地的输入通道,本地发生的挂载变化不会反向污染 master。
这也解释了为什么“我要隔离 namespace”并不自动等于“我要 private”。有些守护进程需要感知宿主的新挂载,但不能把自己的临时挂载带回宿主,这时 slave 比 private 更合适;需要多个 namespace 共享设备挂载时,才选择 shared。

按 namespace 的职责选择传播策略
可以先问三个问题:这个 namespace 是否要把新挂载同步给其他 namespace?是否只需要接收宿主或上游的挂载事件?是否要求本地 mount 和 umount 对外完全不可见?答案分别对应 shared、slave 和 private。
| 目标 | 建议属性 | 事件方向 | 常见边界 |
|---|---|---|---|
| 多个视图共同管理挂载 | shared | 双向 | 任一 peer 的直接子挂载变化可能传播 |
| 观察上游挂载但隔离本地操作 | slave | 上游到本地 | 本地事件不回传 master |
| 测试或沙箱完全隔离 | private | 无 | 要注意父挂载的继承和递归范围 |
传播属性是每个 mount point 的设置,不是整个 namespace 的抽象标签。父挂载是 shared 时,新建子挂载通常会继承 shared;否则新挂载通常是 private。使用 unshare 创建 namespace 时,util-linux 还可能把挂载递归改成 private;如果要保留原传播关系,需要显式关注 unshare 的 propagation 选项。
用 mount 的 make 变体设置传播属性
命令行操作最好先限定到明确的挂载点。下面的命令只展示配置语义,实际执行前应确认目标不是根文件系统上的关键共享路径:
# 双向传播:把 /srv/shared 加入一个 shared peer group mount --make-shared /srv/shared # 单向接收:/srv/worker 接收上游事件,但本地事件不回传 mount --make-slave /srv/worker # 完全隔离:/srv/sandbox 不接收也不发送传播事件 mount --make-private /srv/sandbox # 递归修改目标及其下方的挂载点;参数中的 r 表示 recursive mount --make-rprivate /srv/sandbox
单点形式只改变目标 mount,递归形式会把目标以下的挂载一起处理。不要把 --make-private 和“删除挂载”混用:它不会卸载已有文件系统,只是改变后续 mount、umount 事件的传播关系。内核还不允许在一次底层 mount(2) 调用里混合多个传播标志,因此脚本里应把策略变更和其他挂载操作分开记录。

用 mountinfo 复查,而不是凭目录现象猜测
设置后可以检查当前进程看到的挂载元数据。输出中的可选字段位于文件系统类型字段之前,常见标记如下:
# 只提取挂载点与传播相关的可选字段,便于人工核对
awk '{
# 分隔符 “ - ” 左侧包含挂载点和可选字段
split($0, left, " - ");
if (left[1] ~ /shared:|master:|propagate_from:/) print left[1];
}' /proc/self/mountinfo
shared:X表示该挂载属于编号为 X 的 peer group。master:X表示它是某个 shared peer group 的 slave。- 没有这些可选字段时,通常表示 private;如果看到
propagate_from:X,说明当前进程看不到 slave 的直接 master,但仍能观察到传播来源。
复查时要看目标挂载和它的父挂载。一个子目录显示为 shared,并不代表所有兄弟目录都共享;递归 bind、move 以及父挂载的传播属性都可能改变新挂载的最终状态。尤其在 shared 父挂载下移动挂载,可能受到内核共享子树语义的限制,不能只用“目录存在”判断操作成功。
常见问题
shared 和 slave 最大的区别是什么
shared 在 peer group 内双向传播挂载事件;slave 只从 master 接收,不能把本地事件传回 master。
private 会不会删除当前挂载
不会。private 只改变传播属性,已有挂载仍在,后续 mount 和 umount 事件不再跨该边界传播。
为什么设置 private 后子目录看起来仍有挂载
传播属性不会清除已有子挂载,而且单点设置不覆盖整棵树。需要隔离整棵树时使用 --make-rprivate,再用 mountinfo 逐级复查。
slave 能否同时参与其他传播关系
可以。一个 mount 既可能作为某个 peer group 的 slave 接收上游事件,也可能在另一个 peer group 中共享本地事件;排查时要同时关注 master 和 shared 标记。
实际选择时不要从命令名倒推结果,先画出“谁产生挂载事件、谁需要看到、谁不能被影响”的边界,再决定传播方向。最后把命令和 mountinfo 复查放在同一份部署记录里,后续迁移 namespace 或升级容器运行时才不容易出现隐性的挂载串线。
Go sync.Pool归还对象前清空敏感内容的安全处理
- 上一篇
- Go sync.Pool归还对象前清空敏感内容的安全处理
- 下一篇
- Go net.Resolver调整 IPv4 与 IPv6 地址选择的兼容边界
-
- 文章 · linux | 44分钟前 | Linux 文件句柄 ulimit /proc/PID/limits Max open files
- Linux /proc/PID/limits核对服务实际文件句柄上限的实现方法
- 253浏览 收藏
-
- 文章 · linux | 3小时前 | Linux · 策略路由 ip rule Linux ip route fibmatch
- Linux ip route读取策略路由表的命中路径的实现方法
- 451浏览 收藏
-
- 文章 · linux | 4天前 | Linux · IN_Q_OVERFLOW Linux inotify inotify事件丢失 Linux目录监控 inotify重扫
- Linux inotify处理目录监控事件丢失风险的实现方法
- 223浏览 收藏
-
- 文章 · linux | 4天前 | Linux · Linux OOM cgroup v2 memory.events oom_kill
- Linux cgroup v2用 memory.events 区分 oom 与 oom_kill的实现方法
- 281浏览 收藏
-
- 文章 · linux | 4天前 | Linux · 故障排查 · Linux systemd systemctl journalctl ExecStartPre
- Linux systemd识别 ExecStartPre 失败导致的未启动状态的实现方法
- 114浏览 收藏
-
- 文章 · linux | 4天前 | linux运维 · Linux systemd StartLimitBurst StartLimitIntervalSec Restart
- Linux systemd StartLimitBurst 如何限制失败重启频率
- 211浏览 收藏
-
- 文章 · linux | 4天前 |
- Linux procfs fd 链接如何确认文件仍被进程持有
- 206浏览 收藏
-
- 文章 · linux | 4天前 | Linux Rsync --checksum
- Linux rsync --checksum 何时值得付出额外扫描成本
- 381浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 122次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 196次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 139次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 114次使用
-
- CMMLU
- 深入了解CMMLU中文评估基准,涵盖67个学科主题,提供数据集下载、Zero-shot/Five-shot评估方法及排行榜,助力优化中文语言模型性能。
- 98次使用
-
- Linux vmstat 如何分辨内存抖动与磁盘等待:si、so、wa 与复测顺序
- 2026-08-30 501浏览
-
- Linux搭建vsftpdFTP服务器教程
- 2026-04-30 501浏览
-
- Shell脚本安装教程:.sh一键安装指南
- 2026-03-16 501浏览
-
- Linux清空文件内容的几种方法
- 2025-12-01 501浏览
-
- Linux命令行下载文件技巧
- 2025-11-23 501浏览

