~からhttps://man7.org/linux/man-pages/man1/n.1.html:
デフォルトでは、新しい名前空間は、メンバープロセスが1つ以上ある場合にのみ存在します。対応するタイプの/proc/PID/ns/nsをバインドしてインストールすると、名前空間を永続化できます。つまり、メンバープロセスがなくても永久に存在する可能性があります。
バインドインストールソースのファイルパスにはどのPIDが使用されますか?名前空間がPIDの存在に依存しないように、名前空間を作成するときにマウントポイントをバインドすることは重要ではありませんか?
clone()
そのフラグを使用してネットワーク名前空間を作成し、生成された新しいCLONE_NEWNET
プロセスのPIDでバインドマウントを作成し、その新しいプロセスを終了するとファイルが消えたと思います/proc/PID/ns/net
が、ファイル/var/run/netns/<netns name>
も削除されます。ネットワーク名前空間は持続しません。
答え1
プロセスで実行されているユーザーモードソフトウェアは、プロセスの外部に名前空間を作成できません。
したがって、名前空間を使用してプロセス(またはそのサブプロセスの1つ)のPIDを生成できます。
CLONE_NEWNETフラグを指定してclone()を使用してネットワーク名前空間を作成し、生成された新しいプロセスのPIDでバインドマウントを作成してから、新しいプロセスを終了すると、/proc/PID/ns/ .netが見つかります。ファイルが消え、
ここでは二重引用符のある「ファイル」を使用します。仮想ファイルシステムのエントリが消えたが…
しかし、/var/run/netns/も削除されます。
「削除」は、実際のファイルに対して実行する操作であり、ここには適用されません。 PIDは消えますが、PIDを含むパスの下の一部の仮想ファイルシステムエントリでアクセスできるエントリはアクセスできません。それ方法。しかし:
ただし、/var/run/netns/も削除され、ネットワーク名前空間は保持されません。
バインドマウントがネームスペースにカーネル内部参照を追加して、ネームスペースが使用されずに永続化されるため、間違っています。