Cómo se crean las carpetas en / var / run en cada reinicio

60

En ubuntus reciente (específicamente, lo que más me interesa es 12.04) /var/runes tmpfs y, por lo tanto, supongo que comienza vacío con cada reinicio.

Sin embargo, veo allí algunas carpetas, como /var/run/mysqldy muchas otras. ¿Cómo se crean esas carpetas en cada reinicio? ¿Hay alguna carpeta de plantilla que se copió /var/run/(y si es así, qué script hace eso), o cada carpeta se mkdireditó por separado, o qué?

EDITAR:
Por favor, no responda que /var/runes persistente o que /runes persistente. Porque no lo es.

Incluso si es así en su sistema, no es así en un 12.04 normal.

Sandman4
fuente
Hmm, entonces voy a tener 50 repeticiones. desperdiciado en una de las dos respuestas que obviamente son claramente incorrectas ...
Sandman4
Alguien, por favor conteste CUALQUIER COSA sensata y obtendrá +50 rep. :)
Sandman4

Respuestas:

82

(Gracias a @Zulakis y una respuesta en Serverfault por señalar que esta respuesta no se había mantenido al día con el desarrollo continuo de Ubuntu).

Con la adopción a systemdpartir del 15.04 , ahora existe un mecanismo centralizado para la creación de archivos y directorios temporales como estos. Un servicio que deseen utilizar este método puede eliminar mkdircomandos en su propio fichero de arranque y en su lugar colocar un .confarchivo en /etc/tmpfiles.d, /run/tmpfiles.do /usr/lib/tmpfiles.d, con servicios de Ubuntu que parece preferir la última opción. Por ejemplo, mi sistema ahora tiene:

$ egrep -r /var/run /usr/lib/tmpfiles.d

/usr/lib/tmpfiles.d/var.conf:L /var/run - - - - ../run
/usr/lib/tmpfiles.d/sudo.conf:d /var/run/sudo 0711 root root
/usr/lib/tmpfiles.d/sudo.conf:D /var/run/sudo/ts 0700 root root
/usr/lib/tmpfiles.d/postgresql.conf:d /var/run/postgresql 2775 postgres postgres - -
/usr/lib/tmpfiles.d/sshd.conf:d /var/run/sshd 0755 root root
/usr/lib/tmpfiles.d/screen-cleanup.conf:d /var/run/screen 0775 root utmp

Los dmedios para crear un directorio si aún no existe, después de eso es la ruta, y el resto son los permisos, el usuario y el grupo. Estos directorios se crearán independientemente de si alguna vez se inició el servicio correspondiente.

Para la documentación completa, ver man tmpfiles.d.


ANTIGUA RESPUESTA PRE-SISTEMA:

Parece que fueron creados dinámicamente por servicios individuales cuando comienzan:

$ sudo egrep -r 'mkdir.*/var/run' /etc

/etc/init.d/ssh:        mkdir /var/run/sshd
/etc/init.d/bind9:      mkdir -p /var/run/named
/etc/init.d/timidity:    mkdir -p /var/run/timidity
/etc/init.d/bzflag:                mkdir -p /var/run/bzflag
/etc/init.d/dns-clean:mkdir /var/run/pppconfig >/dev/null 2>&1 || true
/etc/init/winbind.conf: mkdir -p /var/run/samba/winbindd_privileged
/etc/init/dbus.conf:    mkdir -p /var/run/dbus
/etc/init/ssh.conf:    mkdir -p -m0755 /var/run/sshd
/etc/init/libvirt-bin.conf:     mkdir -p /var/run/libvirt
/etc/init/cups.conf:    mkdir -p /var/run/cups/certs

Creo que este es el que maneja mysqld:

[ -d /var/run/mysqld ] || install -m 755 -o mysql -g root -d /var/run/mysqld
/lib/init/apparmor-profile-load usr.sbin.mysqld

man install dice que el formulario -d "creará todos los componentes de los directorios especificados".

Pablo
fuente
1
Este no siempre parece ser el caso: serverfault.com/questions/824393/…
Zulakis
Gracias, @ Zulakis. Hice algunas ediciones y agradecería saber si son correctas en función de su experiencia con esta función.
Paul
1
¡Me parece bien! Gracias por actualizar tu respuesta :)
Zulakis
1
Voto a favor del comando egrep -r. ¡He estado buscando una búsqueda dentro de la búsqueda de archivos! :-)
Nick Woodhams
5

La nueva /runcarpeta montada en tmpfs permite que programas como udev, lvm y mdadm mantengan los datos de tiempo de ejecución desde initrd hasta el apagado.

/var es un directorio estándar de cualquier sistema Linux / UNIX: significa "variable" y es un lugar donde muchos registros, cahces, PERO también programan archivos de configuración variable e incluso algunas bases de datos de configuración del sistema.

La mayoría de las cosas /vardeben ser purgadas y reguladas adecuadamente por el sistema. Sus archivos de intercambio para memoria virtual también viven, /varasí que no se meta con eso. /var/runtambién contiene mucha información sobre el estado y los parámetros de los daemans de proceso que se ejecutan activamente.

Este directorio contiene datos de información del sistema que describen el sistema desde que se inició. Los archivos de este directorio deben borrarse (eliminarse o truncarse según corresponda) al comienzo del proceso de arranque. Los programas pueden tener un subdirectorio de /var/run; Esto se recomienda para los programas que utilizan más de un archivo de tiempo de ejecución.

Bueno ya que /var/runestá montado como tmpfs. Eso significa que está totalmente vacío cuando su máquina arranca y está destinado a ser así para evitar que cosas como los demonios no se inicien debido a un archivo PID sobrante.

Los scripts de inicio generalmente crean los directorios que necesitan antes de usarlos. Si desea almacenar un archivo PID, póngalo /var/rundirectamente o cree un directorio antes de crear el archivo PID. Este no es un lugar para almacenar datos que deben permanecer allí durante los reinicios.

Fuentes: Nombre del camino y Guía del administrador del sistema Linux

Mitch
fuente
5

Para cualquiera que se encuentre con este hilo porque está buscando una solución a cómo puede configurar una aplicación para que cree el directorio /var/runy pueda almacenar su archivo sock o pid o lo que sea ... aquí hay un ejemplo. Encontré este hilo porque quería almacenar el archivo de calcetín MySQL /var/run/mysqld. Entonces, después de encontrar este hilo, comencé a buscar /etc/initejemplos en los archivos. dbus fue bueno. Y se me ocurrió esta configuración de inicio de MySQL:

start on runlevel [2345] 
stop on runlevel [!2345] 
expect daemon 

pre-start script 
    mkdir -p -m0755 /var/run/mysqld 
    chown mysql:mysql /var/run/mysqld 
end script 

exec /etc/init.d/mysql start 
pre-stop exec /etc/init.d/mysql stop 

La parte del guión previo al inicio hizo el truco.

dcarrith
fuente
2

Sin embargo, veo algunas carpetas, como / var / run / mysqld y muchas otras. ¿Cómo se crean esas carpetas en cada reinicio? ¿Hay alguna carpeta de plantillas que se copió a / var / run / (y si es así, qué script hace eso), o cada carpeta se creó por separado, o qué?

Como se define en la jerarquía de archivos estándar de la /var/runo /runse utiliza para almacenar los datos de tiempo de ejecución volátiles.

Todas las carpetas y archivos creados allí son administrados por el programa respectivo que creó los archivos. No existe una carpeta de plantillas que se copie, cada programa puede usar esa carpeta para almacenar información volátil. Los datos almacenados se pierden cuando el sistema se reinicia.

Una cosa común para usar la /runcarpeta es almacenar los piddemonios en ejecución, archivos de marcador que contienen el número de proceso de un proceso. Se utilizan principalmente para los scripts de inicio / detención que puede encontrar, por ejemplo, en/etc/init.d/

¡Espero que esto te haya aclarado las cosas!

br

Ortang
fuente
1

Su suposición no es absolutamente correcta. La ubicación de la /varcarpeta es negociable, es decir, puede usar una partición o volumen alternativo para ubicar la /varcarpeta. Independientemente de dónde /varse encuentre la /var/runcarpeta , la carpeta es un enlace simbólico a la /runcarpeta y su contenido permanece después del reinicio, aunque muchos de los archivos /runse generan o modifican en el arranque por los servicios que comienzan durante el arranque. Por lo tanto, son los servicios, como por ejemplo mysqld, los que requieren cargar archivos en el /var/rundirectorio y están configurados para crear subdirectorios si no existen actualmente.

douggro
fuente
1
Creé algunas carpetas en / var / run y desaparecieron después de reiniciar. (específicamente el 12.04)
Sandman4
También vea aquí que / var / run es de hecho tmpfs askubuntu.com/questions/57297/…
Sandman4
-2

douggro tiene toda la razón, / var / run está montado como tmpfs y / var / run es un enlace simbólico a / run que es persistente en todos los reinicios, por lo que todo lo que entra / ejecuta también aparecerá en (y permanecerá) / var / correr.

Por lo tanto, cualquier servicio de arranque como mysqld, que es un demonio que se inicia en el momento del arranque, que crea archivos en / run, también tendrá archivos visibles en / var / run (enlace simbólico a / run remember). Si desea crear un archivo que persista durante un reinicio en / var / run, créelo en / run y luego reinicie.

Espero que esto responda a su pregunta.

nisshh
fuente
3
Ambos están equivocados o están usando configuraciones no estándar. Compruébalo por ti mismo. monte | grep / run .... tmpfs on / run type tmpfs
Steven K
1
"Si desea crear un archivo que persista durante un reinicio en / var / run, créelo en / run y luego reinicie". Eso no es correcto. tmpfses volátil y se pierden los cambios.
ortang