主要观点:介绍 Linux 容器技术中的挂载命名空间(mount namespaces)相关内容,包括创建、持久化新的挂载命名空间,从另一个进程进入命名空间等操作,并给出相关参考。
关键信息:
- 命名空间通常与进程相关,最后一个关联进程终止时删除,要使其持久化需从
/proc
中的关联进程条目进行绑定挂载。 - 创建新的挂载命名空间可使用
unshare --mount=/root/mntns/1
,进入命名空间可使用nsenter --mount=/root/mntns/1
。 - 可通过
findmnt -o+PROPAGATION
检查挂载的传播设置,创建新目录并设置其传播属性为私有mount --bind --make-private /root/mntns /root/mntns
。 - 在命名空间内可进行文件系统更改,如挂载 tmpfs 等,但在命名空间外不可见。
- 可通过进程的
/proc
条目找到命名空间的整数标识符,如readlink /proc/$$/ns/mnt
。
参考: - Building a container by hand using namespaces: The mount namespace
- the unshare(1) man page
重要细节: - 起初感觉将命名空间绑定挂载到文件而非目录很奇怪,符合“一切皆文件”的理念。
lsns
在 util-linux 2.38.1 中不列出没有关联进程的挂载命名空间,而 2.41 中会列出,相关修复于 2022-11-08 完成,还提到命名空间可通过与文件系统解除链接的文件描述符保持持久。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。