NSFSファイルシステムとは何ですか?

NSFSファイルシステムとは何ですか?

カーネルにはファイルシステムnsfsが含まれています。マウントされたスナップショットごとにsnapdnsfsマウントを作成します/run/snapd/ns/<snapname>.mntls0バイトファイルとして表示します。

カーネルのソースコードには、これに関するドキュメントや説明が含まれていないようです。主な実装は次のとおりです。ここそしてヘッダファイルはこちら

これを見ると、ネームスペースと関連があるようだ。

リポジトリを検索しても、有効または無効の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_USERNSNS_GET_OWNER_UID...)

NSFS/procLinux 3.19 以前では、ファイルシステムで疑似ファイルエントリが提供されていました。ここにいるこの変更をコミットします。

このファイルの存在については、Stephen Kittのコメントをご覧ください。

関連情報