有没有办法查看或操作任意进程的挂载命名空间?
例如,正在运行的 docker 容器具有到 NFS 服务器的本地挂载。从容器内部可以看到,但在外部,主机对此一无所知。对于网络命名空间,这是可行的。例如管道工程
但是,对于挂载命名空间,我没有看到任何关于此的信息。是否有公开的 API 或 sysfs 层来查看这些安装并操作或创建新的安装?
答案1
是的。你可以看看它/proc/$PID/mountinfo
,或者你可以使用findmnt -N
开关 - 关于它findmnt --help
说:
-N, --task <tid>
- 使用替代名称空间(
/proc/<tid>/mountinfo
文件)
- 使用替代名称空间(
findmnt
还跟踪PROPAGATION
标志,该标志是一个mountinfo
准确报告此信息的字段 - 哪些进程共享哪些安装。
此外,您始终可以使用nsenter
您喜欢的任何类型的命名空间 - 当然,前提是您拥有正确的权限。
nsenter --help
Usage:
nsenter [options] <program> [args...]
Options:
-t, --target <pid> target process to get namespaces from
-m, --mount [=<file>] enter mount namespace
-u, --uts [=<file>] enter UTS namespace (hostname etc)
-i, --ipc [=<file>] enter System V IPC namespace
-n, --net [=<file>] enter network namespace
-p, --pid [=<file>] enter pid namespace
-U, --user [=<file>] enter user namespace
-S, --setuid <uid> set uid in user namespace
-G, --setgid <gid> set gid in user namespace
-r, --root [=<dir>] set the root directory
-w, --wd [=<dir>] set the working directory
-F, --no-fork do not fork before exec'ing <program>
-h, --help display this help and exit
-V, --version output version information and exit
For more details see nsenter(1).
答案2
内核还为给定 pid/tid 的挂载命名空间的特定情况提供了简单的直接访问:/proc/<pid>/root/
。
这是到该进程的根 ( ) 目录的链接/
,包括所有挂载点(它显示为符号链接,/
但实际上解析为进程' /
,就像 中已删除文件的符号链接一样/proc/<pid>/fd/
)。
例如,当这些容器没有可用的环境和命令(例如:没有 shell)时,在主机和/或容器之间复制文件很方便。使用 时这是不可能的nsenter
,至少在没有稍后不依赖 fork/exec 的专用软件的情况下是不可能的。