「名前空間ファイル」とはどのような種類のファイルを指しますか?

「名前空間ファイル」とはどのような種類のファイルを指しますか?

私は周りを見回し、/proc/*/ns名前空間ファイルが奇妙に見えることを発見しました。

# example from `man namespaces`
$ ls -l /proc/$$/ns
total 0
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 cgroup -> cgroup:[4026531835]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 ipc -> ipc:[4026531839]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 mnt -> mnt:[4026531840]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 net -> net:[4026531969]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 pid -> pid:[4026531836]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 pid_for_children -> pid:[4026531834]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 user -> user:[4026531837]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 uts -> uts:[4026531838]

だから名前空間ファイルは...何へのシンボリックリンクですか? 10桁の識別子を持つ「何か」?私は、「すべてがファイルです」ということを知っていますが、以前はこのようなファイルパスを見たことがありません。どこにありますか?

そして邪悪な憎悪者たちで、私が今私の一般的なファイルや現在のファイルを指しているとしたらtouch "/proc/$$/ns/cgroup:[4026531835]"どうなりますかcgroup

答え1

これは、新しいタイプのものを表現するために既存の抽象化を使用するための鍵です。これらのファイルは、実際には伝統的なシンボリックリンクの意味で何も「指定」しません。この値は名前空間への有効なハンドルです。カーネルはこの情報を内部的に使用して、内部データ構造内の適切な名前空間を見つけます。

/proc/<pid>/fdプロセスにソケットがある場合は、次の内容が表示されます。

lrwx------ 1 user group 64 Jun 28 14:35 3 -> 'socket:[17257]'

カーネルはこれらの内容を書き込む試みを拒否します。たとえば、

# echo hi > /proc/self/ns/ipc
bash: /proc/self/ns/ipc: Operation not permitted

また、そのディレクトリに名前付きファイルを作成することはできませんipc:[4026531839]。これはprocファイルシステムにあるため、ファイル/ディレクトリはカーネルの状態を抽象化するだけであり、カーネルはそのディレクトリに新しいファイル/ディレクトリを作成できません。ディレクトリ 。

答え2

これらのファイルはシンボリックリンクとして表示されます。これは、擬似ファイルシステムに属する擬似ファイルを指しますnsfs。特別な名前空間操作は含まれません(クローン(2)設定(2)共有キャンセル(2)ioctl_ns(2)など)、私が知っている限り、これらのファイルに対して許可されている唯一の作業は、ファイルを開いて閉じたり、名前ページを操作したときに参照を取得したり、ファイルがなくても名前空間への参照が保持されるようにマウントすることです。プロセスはすでに使用中です。実行中の操作など、もはや存在しませんip netns add mynetnamespace

簡単に使用できる唯一の有用な情報は、疑似シンボリックリンクとして表示されるinodeです(そしてスクリプトを使用して検索できますstat -L -c %i)。これはグローバルに一意であるため、他の種類の名前空間全体に含まれるため、プロのツールなしで他の同様の値と比較できます。同じは同じ擬似ファイルなので、同じ名前空間を意味します。

$ ls -l /proc/$$/ns/net
lrwxrwxrwx. 1 user user 0 Jun 29 17:37 /proc/23615/ns/net -> net:[4026531992]
$ stat -c %F /proc/$$/ns/net
symbolic link
$ stat --file-system -L -c %T /proc/$$/ns/net
nsfs
$ stat -L -c %i /proc/$$/ns/net
4026531992

返品:

$ ip netns show
test
$ grep test /proc/mounts
nsfs /run/netns/test nsfs rw 0 0

私の答えの1つでネットワークネームスペースケースのシェルスクリプトを使用する例:コンテナのインターフェイスを含む、Linuxで設定されているすべてのインターフェイスを見つける方法は?

関連情報