在新挂载命名空间挂载sysfs返回EBUSY:为何部分操作成功?
问题原因解析
核心本质:sysfs与网络命名空间的强绑定
sysfs并非独立的普通文件系统,它的部分目录(比如/sys/net)和当前进程所在的网络命名空间直接绑定。当你仅创建挂载命名空间时,新命名空间内的/sys/net仍挂载着主机网络命名空间对应的sysfs分支,这个活跃的子挂载会占用/sys挂载点,导致无法重新挂载整个sysfs。
分场景拆解
1. 单独unshare -m操作失败的原因
执行sudo unshare -m后,unshare会自动将根目录/重新挂载为MS_REC|MS_PRIVATE以隔离挂载点,但原有/sys/net的子挂载并未被移除——它依然关联着主机的网络命名空间,处于活跃使用状态。此时尝试mount -t sysfs none /sys,mount命令检测到/sys下存在活跃子挂载,就会抛出"mount point busy"的错误。
2. unshare -mn操作成功的原因
同时创建网络命名空间(-n)和挂载命名空间(-m)时,新的网络命名空间是完全空白的,没有任何网络设备,对应的/sys/net分支不会被自动挂载。此时新挂载命名空间内的/sys没有活跃子挂载占用,因此可以顺利重新挂载sysfs。
3. 先unshare -n再unshare -m操作成功的原因
先进入新网络命名空间后,当前进程的网络上下文已切换到空白的新命名空间,此时再创建挂载命名空间,继承而来的/sys里的/sys/net部分已不再关联主机的网络命名空间(原挂载会随网络命名空间切换失效)。新挂载命名空间内的/sys无占用的子挂载,重新挂载sysfs自然成功。
内容的提问来源于stack exchange,提问作者TheDiveO
相关产品推荐
相关产品推荐

