在 Linux 中查看/操作挂载命名空间

在 Linux 中查看/操作挂载命名空间

有没有办法查看或操作任意进程的挂载命名空间?

例如,正在运行的 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 的专用软件的情况下是不可能的。

相关内容