web-dev-qa-db-ja.com

Linuxでマウント名前空間を表示/操作する

任意のプロセスのマウント名前空間を表示または操作する方法はありますか?

たとえば、NFSサーバーへのローカルマウントを持つDockerコンテナが実行されています。コンテナの内側から見ることができますが、外側では、ホストはそれを認識していません。ネットワーク名前空間を使用すると、これは実行可能です。例えば パイプワーク

ただし、マウント名前空間についてはこれについて何もわかりません。これらのマウントを表示し、新しいマウントを操作または作成するために公開されているAPIまたはsysfsレイヤーはありますか?

8
Matt H

はい。 /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).
6
mikeserv

カーネルは、特定のpid/tidのマウント名前空間の特定のケースへの簡単な直接アクセスも提供します: /proc/<pid>/root/

これは、すべてのマウントポイントを含むそのプロセスのルート(/)ディレクトリへのリンクです(/へのシンボリックリンクとして表示されますが、実際にはプロセス '/に解決されます。 /proc/<pid>/fd/内の削除されたファイルのシンボリックリンクを動作しています)。

これは、たとえば、ホストやコンテナ間でファイルをコピーする場合に便利です。これらのコンテナには、使用可能な環境とコマンド(シェルがないなど)がありません。これは、nsenterを使用する場合、少なくとも後でfork/execに依存しない専用ソフトウェアがなければ不可能です。

0
A.B