De acuerdo con FHS-3.0 , /tmpes para archivos temporales y /runpara datos variables en tiempo de ejecución. Los datos /rundeben eliminarse en el próximo inicio, lo cual no es necesario /tmp, pero los programas aún no deben suponer que los datos /tmpestarán disponibles en el próximo inicio del programa. Todo esto me parece bastante similar.
Entonces, ¿cuál es la diferencia entre los dos? ¿Con qué criterio debe decidir un programa si se deben incluir /tmpo no datos temporales /run?
De acuerdo con la FHS:
Los programas pueden tener un subdirectorio de
/run; Esto se recomienda para los programas que usan más de un archivo de tiempo de ejecución.
Esto indica que la distinción entre "programas del sistema" y "programas ordinarios" no es un criterio, ni tampoco lo es la vida útil del programa (como el proceso de larga duración versus el de corta duración).
Aunque la siguiente justificación no se da en el FHS, /runse introdujo para superar el problema que /varse montó demasiado tarde, de modo que se necesitaban trucos sucios para ponerlos a /var/rundisposición lo suficientemente pronto. Sin embargo, ahora que /runse introdujo, y dada su descripción en el FHS, no parece haber una razón clara para tener ambos /runy /tmp.
fuente

Respuestas:
No hay razón para tener tanto / run como / tmp
Creo que tienes razón.
/tmpEs esencialmente obsoleto ahora tenemos/run. Si su programa está en condiciones de hacerlo (lo que requiere que se haya instalado como una operación privilegiada), entonces hoy en día usaría un subdirectorio de/run. Esto es por razones de seguridad.Por ejemplo, el demonio de impresión CUPS no se ejecuta como root, pero generalmente se instala desde un paquete del sistema operativo. El paquete se instala
/usr/lib/tmpfiles.d/cups.confysystemd-tmpfilescrea un directorio al que puede acceder. Dado que el directorio está debajo/run, el nombre no puede haber sido reclamado maliciosamente por un usuario sin privilegios, a diferencia de lo/tmpque se puede escribir en el mundo."Programas sin privilegios" que no se pueden usar
/rundirectamenteLa verdadera distinción es si su programa está siendo ejecutado por un usuario arbitrario sin privilegios, bajo su propia identificación de usuario. Pero, en general, aún no desea usarlo
/tmp, ya que otros usuarios sin privilegios pueden acceder a él. Prefieres usar$XDG_RUNTIME_DIR. Por lo general, esto se implementa como/run/user/$(id -u), por lo que resulta ser un subdirectorio/runtambién. Sin embargo, la ubicación no está garantizada; Los programas siempre deben usar la variable de entorno./tmpsolo sería útil para la cooperación ad-hoc entre diferentes usuarios sin privilegios en el sistema. Dichos sistemas ad-hoc son vulnerables a que un usuario malintencionado se niegue a cooperar y estropee las cosas para todos :). Un ejemplo serían los usuarios no privilegiados que deciden ejecutar una versión deltalkdemonio, utilizando un socket Unix.Información original de Lennart Poettering
Tenga en cuenta que la lista de verificación de Poettering a continuación afirmaba que
/tmpsería útil para "archivos pequeños", mientras/runque solo debería usarse para "primitivas de comunicación". Tampoco creo que esta distinción sea cierta. El chico del cartel/runesudev, y estoy bastante seguro de que/run/udevincluye bases de datos internas. Una vez que tenga un/rundirectorio, no creo que nadie quiera seguir la distinción reclamada y crear otro directorio, para desordenar/tmp. Entonces, en la práctica, solo usamos/runhoy en día....
...
...
...
De alguna manera nos salimos con elYo leí mal/tmpsocket heredado utilizado por el sistema de ventanas X, como se describió anteriormente.tmpfiles.d/x11.conf. Parece más que depende de la cooperación :). Supongo que el código ha sido auditado, de modo que la denegación de servicio es lo peor que puede suceder.fuente
/tmp("las únicas API para usarlo deberían ser mkstemp (), mkdtemp () (y amigos) para que sean completamente seguras")./var/runes de todo el sistema (por ejemplo, para comunicarse con la base de datos local),/tmp/ahora se crea por usuario . Históricamente, también la cuota de / tmp se estableció de manera diferente. Y la respuesta omite que una distinción semántica de uso también es importante.Los directorios
/tmpy/usr/tmp(más tarde/var/tmp) solían ser el vertedero de todo y de todos. El único mecanismo de protección para los archivos en estos directorios es el bit fijo que restringe la eliminación o el cambio de nombre de los archivos a sus propietarios. Como marcelm señaló en un comentario, en principio no hay nada que impida que alguien cree archivos con nombres que son utilizados por los servicios (comonginx.pidosshd.pid). (Sin embargo, en la práctica, los scripts de inicio podrían eliminar esos archivos falsos primero)./runse estableció para datos de tiempo de ejecución no persistentes de servicios de larga duración, como bloqueos, sockets, archivos pid y similares. Como no se puede escribir para el público, protege los datos de tiempo de ejecución del servicio del desorden/tmpy los trabajos que limpian allí. De hecho: dos distribuciones que ejecuto (sin juego de palabras) tienen permisos 755/run, mientras que/tmpy/var/tmp(y/dev/shmpara el caso) tienen permisos 1777.fuente
/tmp- También para proporcionar un puerto seguro para dichos datos de los diversos trabajos de limpieza que pisotean en todo momento/tmp./runy eche un vistazo a la estructura de directorios compleja (bueno ...) causada porudev,udisketc. No soy un experto en este tema en particular, pero supongo que los scripts de arranque (que se ejecutan como superusuario) configuran todo./tmp/nginx.pidpero ya existe debido a algún programa que se está portando mal./run/evita esto al requerir privilegios para escribir./tmpes la ubicación para la creación de archivos y directorios temporales. No es utilizable para almacenar "nombres conocidos" (es decir, nombres que otro proceso podría tener en cuenta sin que tenga que transmitir el nombre de alguna manera) porque nadie tiene la propiedad sobre el espacio de nombres; cualquiera puede crear archivos allí. Como tal, generalmente lo usa cuando tiene una utilidad que necesita un archivo (es decir, no una tubería o tal) como entrada o salida, donde cualquier nombre (generado aleatoriamente) funcionará siempre que pase el nombre.Históricamente, algunas cosas (como X) violaron este principio y pusieron nombres conocidos (como
.X11-unix)/tmp. Por supuesto, esto tiene errores y permite a cualquier usuario hacer el servicio que necesita hacerlo simplemente compitiendo para crear un archivo con el nombre deseado primero. Tales cosas pertenecen a/run(o equivalente/var/runsi no se suscribe al revisionismo de Freedesktop.org). Por supuesto, incluso mejor sería arreglarlos para que no usen nombres conocidos en un espacio de nombres global, sino que pasen un nombre de ruta.fuente
.socketarchivos de systemd ... pero eso no ayuda para directorios completos, ni para servicios recién instalados/run/fue adoptado por FHS, no puedo ver cómo tiene algo que ver con fd.o. A menos que lo que realmente quisiéramos quejarnos sean esfuerzos de desarrollo no especificados que hayan contribuido a ambos./run, debajo , podría optar por evitar saturar el/tmpdirectorio compartido con aún más archivos.De acuerdo con el Estándar de jerarquía del sistema de archivos,
/runes para datos variables de tiempo de ejecución, es decir, información sobre el sistema en ejecución desde el reinicio/tmpes un lugar genérico para archivos temporales.Por lo tanto, cualquier cosa relacionada con el estado del demonio, los usuarios registrados, los dispositivos extraíbles montados, etc. entraría
/runmientras entraban los archivos temporales creados por un programa/tmp.Editar: como señaló @JdeBP en el comentario a continuación,
fuente
/tmparchivos "antiguos"; sin tales mecanismos destinados a/run. De ahí el límite draconiano sobre qué programas pueden esperar de la vida útil de cualquier cosa puesta/tmp. Si bien los programas pueden esperar que los archivos vivan más tiempo en/runun sistema en funcionamiento continuo, también se espera que se arreglen más.