Se você já criou um diretório personalizado dentro de /var/run apenas para descobrir que ele desapareceu após uma reinicialização, você não está sozinho. Esta é uma das surpresas mais comuns para administradores Linux. Este guia explica por que isso acontece e como tornar seus diretórios persistentes entre reinicializações usando systemd-tmpfiles.

Por que /var/run é volátil

O diretório /var/run (e seu equivalente moderno /run) é montado como um sistema de arquivos tmpfs — um sistema de arquivos baseado em RAM que existe apenas na memória. O Ubuntu aloca uma parte da sua RAM (normalmente cerca de 10%) para este ponto de montagem.

Você pode verificar isso com:

df -h /run
# Saída:
# Filesystem      Size  Used Avail Use% Mounted on
# tmpfs           1.6G  1.2M  1.6G   1% /run

mount | grep tmpfs | grep run
# Saída:
# tmpfs on /run type tmpfs (rw,nosuid,nodev,noexec,relatime,size=1632548k,mode=755)

As aplicações usam /var/run para armazenar:

  • Arquivos PID — identificadores de processo para daemons em execução (ex.: /run/nginx.pid)
  • Arquivos de socket — sockets de domínio Unix para comunicação entre processos (ex.: /run/php/php-fpm.sock)
  • Arquivos de bloqueio — para prevenir múltiplas instâncias de um processo
  • Estado de execução — dados temporários necessários apenas enquanto o sistema está em funcionamento

Como esses dados estão na RAM, o acesso é extremamente rápido — mas tudo é perdido na reinicialização.

Nota: No Ubuntu moderno (15.04+), /var/run é um link simbólico para /run. São o mesmo local.

ls -la /var/run
# Saída:
# lrwxrwxrwx 1 root root 4 ... /var/run -> /run

A solução: systemd-tmpfiles

O serviço systemd-tmpfiles é responsável por criar, excluir e limpar arquivos e diretórios voláteis e temporários durante a inicialização. Ele lê arquivos de configuração de três locais (em ordem de prioridade):

  1. /etc/tmpfiles.d/ — Personalizações do administrador local (maior prioridade)
  2. /run/tmpfiles.d/ — Configuração em tempo de execução
  3. /usr/lib/tmpfiles.d/ — Padrões de pacotes (menor prioridade)

Passo 1: Criar um arquivo de configuração

Crie um arquivo .conf em /etc/tmpfiles.d/:

sudo nano /etc/tmpfiles.d/myapp.conf

Passo 2: Adicionar a definição do diretório

O formato de configuração é:

# Tipo  Caminho       Modo  Usuário  Grupo    Idade  Argumento
d       /run/myapp    0755  myuser   mygroup  -      -

O significado de cada campo:

CampoDescriçãoExemplo
Tipod = criar diretóriod
CaminhoCaminho completo a criar/run/myapp
ModoPermissões (octal)0755
UsuárioUsuário proprietáriowww-data
GrupoGrupo proprietáriowww-data
IdadeLimpeza automática após esta idade (- = nunca)10d ou -
ArgumentoArgumentos adicionais (geralmente -)-

Passo 3: Aplicar imediatamente (sem reiniciar)

sudo systemd-tmpfiles --create /etc/tmpfiles.d/myapp.conf

Passo 4: Verificar

ls -la /run/myapp
# Saída:
# drwxr-xr-x 2 myuser mygroup 40 ... /run/myapp

Exemplos práticos

Diretório PID do Nginx

# /etc/tmpfiles.d/nginx.conf
d /run/nginx 0755 www-data www-data -

Diretório de sockets do PHP-FPM

# /etc/tmpfiles.d/php-fpm.conf
d /run/php 0755 www-data www-data -

Aplicação personalizada com múltiplos subdiretórios

# /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 -

Diretório com limpeza automática (remover arquivos com mais de 30 dias)

# /etc/tmpfiles.d/myapp-tmp.conf
D /run/myapp/tmp 0755 appuser appgroup 30d

Note o D maiúsculo — ele limpa o conteúdo do diretório com base no parâmetro de idade.

Outros tipos de tmpfiles.d

Além de diretórios, tmpfiles.d pode gerenciar outros recursos:

# Criar um arquivo vazio
f /run/myapp/status 0644 appuser appgroup -

# Criar um link simbólico
L /run/myapp/current - - - - /opt/myapp/latest

# Escrever conteúdo em um arquivo
f+ /run/myapp/config 0644 appuser appgroup - "key=value"

O método antigo (pré-systemd)

Em sistemas Ubuntu muito antigos (anteriores a 15.04) que não usam systemd, o mecanismo equivalente era modificar /etc/rc.local ou criar scripts de inicialização:

# /etc/rc.local (método antigo — NÃO usar em sistemas com systemd)
mkdir -p /var/run/myapp
chown myuser:mygroup /var/run/myapp
chmod 0755 /var/run/myapp

Aviso: Não use /etc/rc.local no Ubuntu moderno. Use tmpfiles.d em vez disso — é o mecanismo adequado do systemd e se integra corretamente ao processo de inicialização.

Solução de problemas

O diretório não é criado após a reinicialização

  1. Verifique a sintaxe do arquivo de configuração:
sudo systemd-tmpfiles --create --dry-run /etc/tmpfiles.d/myapp.conf
  1. Procure erros de sintaxe no journal:
journalctl -u systemd-tmpfiles-setup.service

Permissão negada

Certifique-se de que o usuário e o grupo especificados no arquivo de configuração existam:

id myuser
getent group mygroup

Visualizar a configuração atual do tmpfiles

Liste todas as regras tmpfiles ativas:

systemd-tmpfiles --cat-config

Ou verifique o que um pacote específico configurou:

cat /usr/lib/tmpfiles.d/nginx.conf

Resumo

Os diretórios em /var/run (ou /run) desaparecem na reinicialização porque residem em um disco RAM tmpfs. Para criar diretórios persistentes que são automaticamente recriados na inicialização:

  1. Crie um arquivo em /etc/tmpfiles.d/seuapp.conf
  2. Defina seus diretórios com o tipo d, especificando caminho, permissões e proprietário
  3. Aplique com sudo systemd-tmpfiles --create

Este é o mecanismo padrão do systemd utilizado por todos os pacotes principais (Nginx, PHP-FPM, MySQL, etc.) para gerenciar seus diretórios de tempo de execução.

Artigos relacionados