De acuerdo con FHS-3.0 , /tmp
es para archivos temporales y /run
para datos variables en tiempo de ejecución. Los datos /run
deben eliminarse en el próximo inicio, lo cual no es necesario /tmp
, pero los programas aún no deben suponer que los datos /tmp
estará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 /tmp
o 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, /run
se introdujo para superar el problema que /var
se montó demasiado tarde, de modo que se necesitaban trucos sucios para ponerlos a /var/run
disposición lo suficientemente pronto. Sin embargo, ahora que /run
se introdujo, y dada su descripción en el FHS, no parece haber una razón clara para tener ambos /run
y /tmp
.
fuente
Respuestas:
No hay razón para tener tanto / run como / tmp
Creo que tienes razón.
/tmp
Es 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.conf
ysystemd-tmpfiles
crea 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/tmp
que se puede escribir en el mundo."Programas sin privilegios" que no se pueden usar
/run
directamenteLa 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/run
también. Sin embargo, la ubicación no está garantizada; Los programas siempre deben usar la variable de entorno./tmp
solo 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 deltalk
demonio, 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
/tmp
sería útil para "archivos pequeños", mientras/run
que solo debería usarse para "primitivas de comunicación". Tampoco creo que esta distinción sea cierta. El chico del cartel/run
esudev
, y estoy bastante seguro de que/run/udev
incluye bases de datos internas. Una vez que tenga un/run
directorio, no creo que nadie quiera seguir la distinción reclamada y crear otro directorio, para desordenar/tmp
. Entonces, en la práctica, solo usamos/run
hoy en día....
...
...
...
De alguna manera nos salimos con elYo leí mal/tmp
socket 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/run
es 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
/tmp
y/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.pid
osshd.pid
). (Sin embargo, en la práctica, los scripts de inicio podrían eliminar esos archivos falsos primero)./run
se 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/tmp
y los trabajos que limpian allí. De hecho: dos distribuciones que ejecuto (sin juego de palabras) tienen permisos 755/run
, mientras que/tmp
y/var/tmp
(y/dev/shm
para 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
./run
y eche un vistazo a la estructura de directorios compleja (bueno ...) causada porudev
,udisk
etc. 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.pid
pero ya existe debido a algún programa que se está portando mal./run/
evita esto al requerir privilegios para escribir./tmp
es 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/run
si 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
.socket
archivos 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/tmp
directorio compartido con aún más archivos.De acuerdo con el Estándar de jerarquía del sistema de archivos,
/run
es para datos variables de tiempo de ejecución, es decir, información sobre el sistema en ejecución desde el reinicio/tmp
es 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
/run
mientras entraban los archivos temporales creados por un programa/tmp
.Editar: como señaló @JdeBP en el comentario a continuación,
fuente
/tmp
archivos "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/run
un sistema en funcionamiento continuo, también se espera que se arreglen más.