カーネルにはファイルシステムnsfsが含まれています。マウントされたスナップショットごとにsnapd
nsfsマウントを作成します/run/snapd/ns/<snapname>.mnt
。ls
0バイトファイルとして表示します。
カーネルのソースコードには、これに関するドキュメントや説明が含まれていないようです。主な実装は次のとおりです。ここそしてヘッダファイルはこちら。
これを見ると、ネームスペースと関連があるようだ。
リポジトリを検索しても、有効または無効のKconfigエントリが見つかりませんでした。
このファイルシステムの目的と用途は何ですか?
答え1
で述べたようにカーネルコミットログ上記のjiliagreにリンクされているこのnsfs
ファイルシステムは、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ファイルシステムを介しては作成できず、システムコールを介してのみ作成できます。クローン()(CLONE_NEW...
)と共有をキャンセル。nsfs
ネームスペースの現在のカーネル状態のみを反映するだけで、作成または削除することはできません。
名前空間は、参照やプロセスがない限り自動的に削除されます(したがって、no /proc/$PID/ns/...
)。そして上記の例で見たように、バインドマウントもありません。
答え2
これは、次によって生成された「名前空間ファイルシステム」です。setns
ソースコードに示すように、システムコールはioctlに関連する名前空間(たとえばNS_GET_USERNS
、NS_GET_OWNER_UID
...)
NSFS
/proc
Linux 3.19 以前では、ファイルシステムで疑似ファイルエントリが提供されていました。ここにいるこの変更をコミットします。。
このファイルの存在については、Stephen Kittのコメントをご覧ください。