netstat --protocol unix
またはlsof -U
を実行すると、一部のUNIXソケットパスの先頭に@記号が付いていることがわかります(例:@/tmp/dbus-qj8V39Yrpa)。次に、ls -l /tmp
を実行すると、dbus-qj8V39Yrpaという名前のファイルがありません。
問題は、その前に付けられた@記号が何を意味するかということです。そして、2番目の関連する質問は、-ファイルシステムでそのUNIXソケットファイル(@/tmp/dbus-qj8V39Yrpa)を実際にどこで見つけることができるかです。
@
はおそらく、ファイルシステム内のファイルに属していないabstract namespace
に保持されているソケットを示しています。
The Linux Programming Interface による引用 Michael Kerrisk による:
57.6 Linux抽象ソケット名前空間
いわゆる抽象名前空間はLinux固有の機能であり、ファイルシステムでその名前を作成しなくても、UNIXドメインソケットをその名前にバインドできます。これには、いくつかの潜在的な利点があります。
- ファイルシステム内の既存の名前との衝突の可能性について心配する必要はありません。
- ソケットの使用が終了したときに、ソケットのパス名をリンク解除する必要はありません。ソケットを閉じると、抽象名は自動的に削除されます。
- ソケットのファイルシステムパス名を作成する必要はありません。これは、chroot環境で、またはファイルシステムへの書き込みアクセス権がない場合に役立ちます。
抽象バインディングを作成するには、Sun_pathフィールドの最初のバイトをnullバイト(\ 0)として指定します。 [...]
そのようなタイプのソケットを示すために先頭のnull byte
を表示することは難しい場合があるため、先頭の@
記号の理由はおそらくそれです。
man 7 unix
- 抽象:抽象ソケットアドレスは、Sun_path [0]がnullバイト(
\0
)。 Sun_pathの残りのすべてのバイトは、ソケットの「名前」を定義します。 (名前のNULLバイトには特別な意味はありません。)名前は、ファイルシステムのパス名とは関係ありません。この名前空間のソケットのアドレスは、Sun_pathの残りのバイトによって指定されます。抽象ソケットのアドレスがgetsockname(2)、getpeername(2)、およびaccept(2)によって返される場合、その長さはsizeof(struct sockaddr_un)であり、Sun_pathには抽象名が含まれます。抽象ソケット名前空間は、移植性のないLinux拡張です。
これらは「抽象的」のように見えます-したがって、ファイルシステムには実際のパスはありません