¿Qué denota el símbolo @ al comienzo de una ruta de socket de dominio Unix en Linux?

17

Cuando ejecuto netstat --protocol unixo lsof -Uveo que algunas rutas de socket de Unix se anteponen con el símbolo @, por ejemplo, @ / tmp / dbus-qj8V39Yrpa . Luego, cuando ejecuto ls -l /tmp, no veo el archivo llamado dbus-qj8V39Yrpa allí.

La cuestión es lo que hace que antepone el símbolo @, significan? Y la segunda pregunta relacionada es: ¿dónde puedo encontrar ese archivo de socket Unix ( @ / tmp / dbus-qj8V39Yrpa ) en el sistema de archivos?

golem
fuente
1
Por si sirve de algo, el más moderno ssprograma también muestra zócalo criterios de valoración como "@ / tmp / .X11 en UNIX / X0"
Bruce Ediger

Respuestas:

33

El @probablemente indica una toma realizada en una abstract namespace, que no pertenece a un archivo en el sistema de archivos.

Citando La programación Linux Interfaz de Michael Kerrisk :

57.6 El espacio de nombres de sockets abstractos de Linux

El llamado espacio de nombres abstracto es una característica específica de Linux que nos permite vincular un socket de dominio UNIX a un nombre sin que ese nombre se cree en el sistema de archivos. Esto proporciona algunas ventajas potenciales:

  • No debemos preocuparnos por posibles colisiones con nombres existentes en el sistema de archivos.
  • No es necesario desvincular el nombre de ruta del socket cuando hayamos terminado de usar el socket. El nombre abstracto se elimina automáticamente cuando se cierra el socket.
  • No necesitamos crear una ruta de acceso del sistema de archivos para el socket. Esto puede ser útil en un entorno chroot, o si no tenemos acceso de escritura a un sistema de archivos.

Para crear un enlace abstracto, especificamos el primer byte de la sun_path campo como un byte nulo (\ 0). [...]

Mostrar un signo null byteinicial para denotar ese tipo de socket puede ser difícil, por lo que tal vez esa sea la razón del @signo inicial.

Flo Mismo
fuente
2
Es de destacar que el carácter ASCII NUL se ingresa en muchos terminales como ^ @ ([Ctrl] + [@]) y puede aparecer como ^ @ cuando lo muestran varios comandos de Unix (como GNU cat -a).
Jim Dennis el
7

Según man 7 unix

  • abstract: una dirección de socket abstracta se distingue por el hecho de que sun_path [0] es un byte nulo ( \0). Todos los bytes restantes en sun_path definen el "nombre" de la toma de corriente. (Los bytes nulos en el nombre no tienen un significado especial). El nombre no tiene conexión con los nombres de ruta del sistema de archivos. La dirección socketâs en este espacio de nombres está dada por el resto de los bytes en sun_path. Cuando la dirección de una toma de extracto es devuelto por getsockname (2), getpeername (2), y acepta (2), su longitud es sizeof (struct sockaddr_un), y sun_path contiene el nombre abstracto. El espacio de nombres de socket abstracto es una extensión de Linux no portátil.

Miradas como estos son 'abstracta' - por lo que hay una verdadera ruta está presente en el sistema de archivos

VenkatC
fuente