Ubicación idiomática para sockets basados ​​en archivos en sistemas Debian

13

Estoy escribiendo un proceso de demonio para un sistema Debian en el Cque se utiliza un socket de dominio Unix .

Si el directorio de trabajo del proceso daemon es el directorio raíz, ¿hay un directorio idiomático para colocar el socket en el sistema de archivos?

recursion.ninja
fuente
¿Por qué no dejas que eso sea configurable?
BatchyX
3
@BatchyX Bueno, algún tipo de valor predeterminado (en lugar de obligar a cada administrador a tomar una decisión completamente por su cuenta) sin duda puede ser bueno. :)
un CVn

Respuestas:

17

Se encuentran comúnmente en /tmpo un subdirectorio del mismo. Tenga en cuenta que todo /tmpestá sujeto a borrado en el apagado, no es que se borre necesariamente, solo tenga en cuenta que puede ser así que, si lo usa, verifique si tiene que crear su subdirectorio cada vez. Deberá utilizar un subdirectorio si desea restringir el acceso mediante permisos, ya que /tmpes legible en todo el mundo.

/runy /var/run(que se pueden vincular entre sí) se usan de manera similar, pero generalmente se montan como sistemas de archivos tmpfs, lo que significa que se crean en el arranque y residen en la memoria , no en el disco (así que no lo use como un lugar para volcar grandes cantidades de datos). Para un socket de tiempo de ejecución, probablemente sea una buena opción.

Tenga en cuenta que /run, y todos los otros directorios mencionados aquí , excepto /tmp , solo se pueden escribir por root. Para un proceso del sistema, esto está bien, pero si la aplicación puede ser ejecutada por un usuario sin privilegios, desea usar /tmpo crear un directorio permanente en algún lugar y establecer permisos sobre eso, o usar una ubicación en el $ HOME del usuario.

Es posible crear un directorio en /usr/share(o /usr/local/share) durante la instalación. Los directorios y contenidos allí no se cosechan potencialmente en las botas como lo estarían en /tmpo /run. Sin embargo, como lo señala jordanm en los comentarios, /usrpuede montarse como de solo lectura y las directrices de la jerarquía del sistema de archivos de Linux lo reflejan . Por supuesto, no puede ser de solo lectura cuando su aplicación está instalada, por lo que si se siente cómodo creando un socket allí, puede dejarlo y usarlo más tarde (aún podrá escribir en el socket aunque el el archivo es de solo lectura).

Si desea un lugar persistente a través de botas que no se monten solo lectura, /etces una apuesta bastante segura, ya que a menudo se usa para configuraciones y reconfiguraciones de todo el sistema. OTOH, es posible tener sistemas en los que el dispositivo subyacente a todo el sistema de archivos raíz sea de solo lectura (por ejemplo, sistemas integrados), con / tmp y / run en otro dispositivo (probablemente: tmpfs en la memoria). Entonces, las dos estrategias más sólidas parecen ser:

  • Instale el zócalo en una ubicación permanente cuando se instala la aplicación.

  • Cree un directorio en /runo /var/runen tiempo de ejecución y coloque el socket allí.

  • Haz lo mismo solo en /tmp.

La ventaja de la primera es que pase lo que pase, una vez que la aplicación esté instalada, tendrá un socket para usar. La ventaja de la segunda es que puede ser más propicio para una programación sensata. La ventaja del tercero es que no requiere privilegios de superusuario. Debería ser fácil cambiar de una implementación a otra si cambia de opinión más adelante.

Finalmente, como mencionó BatchyX , al menos debería ofrecer una opción de configuración para esto, recurriendo a su opción predeterminada.

encerrada dorada
fuente
2
/runo /var/runtambién se usa a menudo para procesos raíz.
BatchyX
Derecha. Esos son aún más tmp que /tmp. Lo editaré en.
goldilocks
/usrse puede montar como solo lectura. Los archivos nunca deben crearse allí en tiempo de ejecución. Las otras sugerencias son buenas.
jordanm
1
Gracias a todos por sus comentarios, la discusión fue muy informativa. Decidí hacer la ubicación predeterminada /tmp/.APPNAME/.APPSOCKporque el daemon no necesita datos persistentes.
recursion.ninja
1
Otra diferencia clave entre /tmpy /run, es que solo la raíz tiene permisos de escritura /run.
BatchyX