上記の jiliagre によってリンクされたカーネル コミット ログで説明されているように、 nsfs
filesystem は、Linux カーネルの名前空間を利用可能にする仮想ファイルシステムです。 /proc
とは別のものです 一部のプロセス ディレクトリ エントリが nsfs
の inode を参照する「proc」ファイルシステム 特定のプロセス (またはスレッド) が現在使用している名前空間を表示するためのファイルシステム。
nsfs
/proc/filesystems
にリストされません (一方 proc
したがって、明示的にマウントすることはできません。 mount -t nsfs ./namespaces
「不明なファイルシステムの種類」で失敗します。これは nsfs
です proc
と密接に絡み合っているため ファイルシステム。
ファイルシステム タイプ nsfs
/proc/$PID/mountinfo
経由でのみ表示されます 既存の(!)名前空間ファイルシステムリンクを別のターゲットにバインドマウントするとき。 Stephen Kitt が上で正しく示唆しているように、これは、名前空間を使用しているプロセスがなくなった場合でも、名前空間の存在を維持するためです。
たとえば、新しいネットワーク名前空間で新しいユーザー名前空間を作成し、それをバインドマウントしてから終了します。名前空間はまだ存在しますが、lsns
/proc/$PID/ns
にリストされていないため、見つかりません (バインド) マウント ポイントとして存在します。
# bind mount only needs an inode, not necessarily a directory ;)
touch mynetns
# create new network namespace, show its id and then bind-mount it, so it
# is kept existing after the unshare'd bash has terminated.
# output: net:[##########]
NS=$(sudo unshare -n bash -c "readlink /proc/self/ns/net && mount --bind /proc/self/ns/net mynetns") && echo $NS
# notice how lsns cannot see this namespace anymore: no match!
lsns -t net | grep ${NS:5:-1} || echo "lsns: no match for net:[${NS:5:-1}]"
# however, findmnt does locate it on the nsfs...
findmnt -t nsfs | grep ${NS:5:-1} || echo "no match for net:[${NS:5:-1}]"
# output: /home/.../mynetns nsfs[net:[##########]] nsfs rw
# let the namespace go...
echo "unbinding + releasing network namespace"
sudo umount mynetns
findmnt -t nsfs | grep ${NS:5:-1} || echo "findmnt: no match for net:[${NS:5:-1}]"
# clean up
rm mynetns
出力は次のようになります:
net:[4026532992]
lsns: no match for net:[4026532992]
/home/.../mynetns nsfs[net:[4026532992]] nsfs rw
unbinding + releasing network namespace
findmnt: no match for net:[4026532992]
nsfs ファイルシステム経由で名前空間を作成することはできず、syscalls clone() (CLONE_NEW...
)、共有を解除します。 nsfs
現在のカーネル ステータス w.r.t のみを反映します。名前空間を作成または破棄することはできません。
名前空間は、それらへの参照が残っておらず、プロセスがない場合は常に自動的に破棄されます (したがって、/proc/$PID/ns/...
はありません)。 ) かつ 上記の例で調べたように、バインド マウントもありません。
それが setns
で使用される「名前空間ファイル システム」です。 システムコールと、そのソースコードが示すように、名前空間関連の ioctl (例:NS_GET_USERNS
、 NS_GET_OWNER_UID
...)
NSFS
/proc
によって提供されていた疑似ファイル エントリ Linux 3.19 までのファイル システム。これがこの変更のコミットです。
このファイルの存在について考えられる説明については、Stephen Kitt のコメントを参照してください。