임의 프로세스의 마운트 네임스페이스를 보거나 조작할 수 있는 방법이 있습니까?
예를 들어 실행 중인 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/
예를 들어 호스트 및/또는 컨테이너에 사용할 수 있는 환경 및 명령이 없는 경우(예: 셸 없음) 호스트 및/또는 컨테이너 간에 파일을 복사하는 것이 편리합니다. 를 사용할 때는 nsenter
적어도 나중에 포크/실행에 의존하지 않는 특수 소프트웨어 없이는 불가능합니다 .