Si alguna vez has creado un directorio personalizado dentro de /var/run solo para descubrir que desapareció después de reiniciar, no estás solo. Esta es una de las sorpresas más comunes para los administradores de Linux. Esta guía explica por qué sucede y cómo hacer que tus directorios persistan entre reinicios usando systemd-tmpfiles.
Por qué /var/run es volátil
El directorio /var/run (y su equivalente moderno /run) se monta como un sistema de archivos tmpfs — un sistema de archivos basado en RAM que existe solo en memoria. Ubuntu asigna una porción de tu RAM (normalmente alrededor del 10%) para este punto de montaje.
Puedes verificarlo con:
df -h /run
# Salida:
# Filesystem Size Used Avail Use% Mounted on
# tmpfs 1.6G 1.2M 1.6G 1% /run
mount | grep tmpfs | grep run
# Salida:
# tmpfs on /run type tmpfs (rw,nosuid,nodev,noexec,relatime,size=1632548k,mode=755)
Las aplicaciones usan /var/run para almacenar:
- Archivos PID — identificadores de proceso para demonios en ejecución (ej.,
/run/nginx.pid) - Archivos de socket — sockets de dominio Unix para comunicación entre procesos (ej.,
/run/php/php-fpm.sock) - Archivos de bloqueo — para prevenir múltiples instancias de un proceso
- Estado en tiempo de ejecución — datos temporales necesarios solo mientras el sistema funciona
Debido a que estos datos están en RAM, el acceso es extremadamente rápido — pero todo se pierde al reiniciar.
Nota: En Ubuntu moderno (15.04+),
/var/runes un enlace simbólico a/run. Son la misma ubicación.
ls -la /var/run
# Salida:
# lrwxrwxrwx 1 root root 4 ... /var/run -> /run
La solución: systemd-tmpfiles
El servicio systemd-tmpfiles es responsable de crear, eliminar y limpiar archivos y directorios volátiles y temporales durante el arranque. Lee archivos de configuración de tres ubicaciones (en orden de prioridad):
/etc/tmpfiles.d/— Personalizaciones del administrador local (mayor prioridad)/run/tmpfiles.d/— Configuración en tiempo de ejecución/usr/lib/tmpfiles.d/— Valores predeterminados de paquetes (menor prioridad)
Paso 1: Crear un archivo de configuración
Crea un archivo .conf en /etc/tmpfiles.d/:
sudo nano /etc/tmpfiles.d/myapp.conf
Paso 2: Agregar la definición del directorio
El formato de configuración es:
# Tipo Ruta Modo Usuario Grupo Edad Argumento
d /run/myapp 0755 myuser mygroup - -
El significado de cada campo:
| Campo | Descripción | Ejemplo |
|---|---|---|
| Tipo | d = crear directorio | d |
| Ruta | Ruta completa a crear | /run/myapp |
| Modo | Permisos (octal) | 0755 |
| Usuario | Usuario propietario | www-data |
| Grupo | Grupo propietario | www-data |
| Edad | Limpieza automática después de esta edad (- = nunca) | 10d o - |
| Argumento | Argumentos adicionales (generalmente -) | - |
Paso 3: Aplicar inmediatamente (sin reiniciar)
sudo systemd-tmpfiles --create /etc/tmpfiles.d/myapp.conf
Paso 4: Verificar
ls -la /run/myapp
# Salida:
# drwxr-xr-x 2 myuser mygroup 40 ... /run/myapp
Ejemplos prácticos
Directorio PID de Nginx
# /etc/tmpfiles.d/nginx.conf
d /run/nginx 0755 www-data www-data -
Directorio de sockets de PHP-FPM
# /etc/tmpfiles.d/php-fpm.conf
d /run/php 0755 www-data www-data -
Aplicación personalizada con múltiples subdirectorios
# /etc/tmpfiles.d/myapp.conf
d /run/myapp 0755 appuser appgroup -
d /run/myapp/pids 0755 appuser appgroup -
d /run/myapp/sock 0750 appuser appgroup -
Directorio con limpieza automática (eliminar archivos con más de 30 días)
# /etc/tmpfiles.d/myapp-tmp.conf
D /run/myapp/tmp 0755 appuser appgroup 30d
Nota la D mayúscula — esta limpia el contenido del directorio basándose en el parámetro de edad.
Otros tipos de tmpfiles.d
Además de directorios, tmpfiles.d puede gestionar otros recursos:
# Crear un archivo vacío
f /run/myapp/status 0644 appuser appgroup -
# Crear un enlace simbólico
L /run/myapp/current - - - - /opt/myapp/latest
# Escribir contenido en un archivo
f+ /run/myapp/config 0644 appuser appgroup - "key=value"
El método antiguo (pre-systemd)
En sistemas Ubuntu muy antiguos (anteriores a 15.04) que no usan systemd, el mecanismo equivalente era modificar /etc/rc.local o crear scripts de inicio:
# /etc/rc.local (método antiguo — NO usar en sistemas con systemd)
mkdir -p /var/run/myapp
chown myuser:mygroup /var/run/myapp
chmod 0755 /var/run/myapp
Advertencia: No uses
/etc/rc.localen Ubuntu moderno. Usatmpfiles.den su lugar — es el mecanismo adecuado de systemd y se integra correctamente con el proceso de arranque.
Solución de problemas
El directorio no se crea después de reiniciar
- Verifica la sintaxis del archivo de configuración:
sudo systemd-tmpfiles --create --dry-run /etc/tmpfiles.d/myapp.conf
- Busca errores de sintaxis en el journal:
journalctl -u systemd-tmpfiles-setup.service
Permiso denegado
Asegúrate de que el usuario y grupo especificados en el archivo de configuración existan:
id myuser
getent group mygroup
Ver la configuración actual de tmpfiles
Lista todas las reglas activas de tmpfiles:
systemd-tmpfiles --cat-config
O verifica lo que configuró un paquete específico:
cat /usr/lib/tmpfiles.d/nginx.conf
Resumen
Los directorios en /var/run (o /run) desaparecen al reiniciar porque residen en un disco RAM tmpfs. Para crear directorios persistentes que se recreen automáticamente al arrancar:
- Crea un archivo en
/etc/tmpfiles.d/tuapp.conf - Define tus directorios con el tipo
d, especificando ruta, permisos y propietario - Aplica con
sudo systemd-tmpfiles --create
Este es el mecanismo estándar de systemd utilizado por todos los paquetes principales (Nginx, PHP-FPM, MySQL, etc.) para gestionar sus directorios de tiempo de ejecución.