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):
/etc/tmpfiles.d/— Personalizações do administrador local (maior prioridade)/run/tmpfiles.d/— Configuração em tempo de execução/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:
| Campo | Descrição | Exemplo |
|---|---|---|
| Tipo | d = criar diretório | d |
| Caminho | Caminho completo a criar | /run/myapp |
| Modo | Permissões (octal) | 0755 |
| Usuário | Usuário proprietário | www-data |
| Grupo | Grupo proprietário | www-data |
| Idade | Limpeza automática após esta idade (- = nunca) | 10d ou - |
| Argumento | Argumentos 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.localno Ubuntu moderno. Usetmpfiles.dem 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
- Verifique a sintaxe do arquivo de configuração:
sudo systemd-tmpfiles --create --dry-run /etc/tmpfiles.d/myapp.conf
- 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:
- Crie um arquivo em
/etc/tmpfiles.d/seuapp.conf - Defina seus diretórios com o tipo
d, especificando caminho, permissões e proprietário - 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.