如果 root 用户取消共享当前命名空间并挂载目录而不更新 mtab,则有一种方法可以创建隐藏的挂载点。有没有一种简单的方法可以列出它而不必通过 proc 文件系统进行过滤?
答案1
如果 root 用户取消共享当前命名空间并挂载目录而不更新 mtab,则有一种方法可以创建隐藏的挂载点。有没有一种简单的方法可以列出它而不必通过 proc 文件系统进行过滤?
首先,/proc
是访问 Linux 上当前挂载信息的主要方式。
许多现代 Linux 发行版绝不更新 mtab;它只是一个符号链接/proc/self/mounts
。(取消共享挂载命名空间的能力以及通过“忘记”更新 mtab 来隐藏挂载,都是进行此更改的主要原因。当然,重复内核已经完成的工作有什么意义呢?)
同样,命名空间标识符本身也是仅有的通过 公开/proc/$PID/ns/mnt
。没有其他方法可以检查哪些进程位于与主命名空间不同的命名空间中。
因此,说了这么多,列出全部安装是cat /proc/*/mounts
。但如果你不想这样做,util-linux v2.28介绍了lsns可以快速列出所有唯一命名空间以及它们的“第一个”进程的工具:
$ sudo lsns --type=mnt NS 类型 NPROCS PID 用户命令 4026531840 mnt 300 1 根 /sbin/init 4026531860 mnt 1 38 根 kdevtmpfs 4026532247 mnt 1 271 根 /usr/lib/systemd/systemd-udevd 4026532359 mnt 2 524 root /usr/bin/NetworkManager --no-daemon 4026532369 mnt 2 267304 root nginx:主进程/usr/bin/nginx -g pid /run/nginx.pid 4026532557 mnt 1 892 colord /usr/lib/colord
一旦获得了进程 ID,就可以使用以下命令查看其挂载表:
$ sudo findmnt --tab=/proc/267304/mountinfo
(您应该始终使用该/proc/$PID/mountinfo
文件,因为它包含比 /etc/mtab 多一点的信息mounts
。例如,它描述了当挂载以意外的方式重叠时的实际层次结构,并且当绑定挂载是文件或子目录时,它更准确地报告绑定挂载的“源”。)
至于说有哪个工具可以简单地显示主命名空间中“缺少”哪些挂载点,我还没听说过。(目前 coreutils 或 util-linux 中还没有这个工具,不过如果允许它挖掘 /proc,编写一个应该不难。)