任意のプロセスのマウント名前空間を表示または操作する方法はありますか?
たとえば、NFSサーバーへのローカルマウントを持つDockerコンテナが実行されています。コンテナの内側から見ることができますが、外側では、ホストはそれを認識していません。ネットワーク名前空間を使用すると、これは実行可能です。例えば パイプワーク
ただし、マウント名前空間についてはこれについて何もわかりません。これらのマウントを表示し、新しいマウントを操作または作成するために公開されているAPIまたはsysfsレイヤーはありますか?
はい。 /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).
カーネルは、特定のpid/tidのマウント名前空間の特定のケースへの簡単な直接アクセスも提供します: /proc/<pid>/root/
。
これは、すべてのマウントポイントを含むそのプロセスのルート(/
)ディレクトリへのリンクです(/
へのシンボリックリンクとして表示されますが、実際にはプロセス '/
に解決されます。 /proc/<pid>/fd/
内の削除されたファイルのシンボリックリンクを動作しています)。
これは、たとえば、ホストやコンテナ間でファイルをコピーする場合に便利です。これらのコンテナには、使用可能な環境とコマンド(シェルがないなど)がありません。これは、nsenter
を使用する場合、少なくとも後でfork/execに依存しない専用ソフトウェアがなければ不可能です。