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/run es 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):

  1. /etc/tmpfiles.d/ — Personalizaciones del administrador local (mayor prioridad)
  2. /run/tmpfiles.d/ — Configuración en tiempo de ejecución
  3. /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:

CampoDescripciónEjemplo
Tipod = crear directoriod
RutaRuta completa a crear/run/myapp
ModoPermisos (octal)0755
UsuarioUsuario propietariowww-data
GrupoGrupo propietariowww-data
EdadLimpieza automática después de esta edad (- = nunca)10d o -
ArgumentoArgumentos 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.local en Ubuntu moderno. Usa tmpfiles.d en 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

  1. Verifica la sintaxis del archivo de configuración:
sudo systemd-tmpfiles --create --dry-run /etc/tmpfiles.d/myapp.conf
  1. 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:

  1. Crea un archivo en /etc/tmpfiles.d/tuapp.conf
  2. Define tus directorios con el tipo d, especificando ruta, permisos y propietario
  3. 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.

Artículos relacionados