Boas Praticas de Limpeza do /tmp - tmpfiles.d e systemd-tmpfiles

Boas Praticas de Limpeza do /tmp - tmpfiles.d e systemd-tmpfiles

O Que Voce Vai Aprender

  • Como /tmp, /var/tmp e /run sao gerenciados pelo systemd
  • Como escrever regras tmpfiles.d para limpeza personalizada
  • Como executar systemd-tmpfiles manualmente e de forma agendada

Resumo Rapido

  • A limpeza automatica do /tmp e feita pelo systemd-tmpfiles-clean.timer
  • Regras personalizadas vao em /etc/tmpfiles.d/*.conf
  • Formato da regra: tipo caminho modo uid gid idade argumento

Pre-requisitos

  • SO: Ubuntu ou qualquer Linux baseado em systemd
  • Acesso root ou sudo necessario

Por Que o /tmp Precisa de Limpeza?

/tmp e onde as aplicacoes gravam arquivos temporarios. Na maioria dos sistemas Ubuntu, ele e um tmpfs em RAM - limpo na reinicializacao. Servidores de longa duracao, porem, acumulam arquivos temporarios entre reinicializacoes, o que pode esgotar o espaco em disco e causar referencias obsoletas de arquivos PID ou socket.

  • Usos tipicos: arquivos intermediarios de compressao, dados de sessao, arquivos socket
  • Padrao Ubuntu: /tmp e montado como tmpfs, entao e limpo na reinicializacao
  • /var/tmp: persiste entre reinicializacoes por design - requer gerenciamento explicito
$ mount | grep /tmp
tmpfs on /tmp type tmpfs (rw,nosuid,nodev)

Se /tmp e tmpfs, os arquivos desaparecem na reinicializacao. Se e baseado em disco, a limpeza e ainda mais critica. Verifique o uso com df -h /tmp.

O Que E o systemd-tmpfiles?

systemd-tmpfiles e a ferramenta declarativa para gerenciar diretorios temporarios - criando-os no boot, definindo permissoes e excluindo arquivos obsoletos de forma agendada.

Tres modos de operacao:

Modo Flag Acao
Create --create Criar arquivos/dirs conforme regras
Clean --clean Excluir entradas mais antigas que o limite de idade
Remove --remove Excluir tudo que corresponde as regras
$ sudo systemd-tmpfiles --create
$ sudo systemd-tmpfiles --clean
$ sudo systemd-tmpfiles --remove

Duas unidades systemd executam isso automaticamente:

  • systemd-tmpfiles-setup.service - executa --create no boot
  • systemd-tmpfiles-clean.timer - executa --clean periodicamente (padrao: 15 min apos o boot, depois diariamente)

Como Escrever Regras tmpfiles.d

Coloque arquivos de configuracao em /etc/tmpfiles.d/. Os padroes do sistema ficam em /usr/lib/tmpfiles.d/ - nunca edite esses diretamente, pois atualizacoes de pacotes os sobrescrevem.

Formato

tipo caminho modo uid gid idade argumento
Campo Descricao Exemplo
tipo Tipo de operacao d, f, x, e
caminho Caminho alvo /tmp/myapp
modo Permissoes (octal) 0755
uid/gid Proprietario (- = manter atual) root / -
idade Limite de exclusao para --clean 7d, 1h, - (nunca)
argumento Conteudo inicial para arquivos -

Tipos Comuns

Tipo Significado
d Criar diretorio se ausente; --clean remove arquivos antigos dentro
D Como d, mas --remove tambem exclui o conteudo do diretorio
f Criar arquivo se ausente
f+ Criar ou truncar arquivo
x Excluir de --clean e --remove
e Definir permissoes em uma entrada existente
z Definir permissoes e rotulos SELinux

Como Executar a Limpeza Periodica

Verifique o timer de limpeza:

$ systemctl status systemd-tmpfiles-clean.timer
● systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
     Loaded: loaded (/lib/systemd/system/systemd-tmpfiles-clean.timer; static)
     Active: active (waiting) since Mon 2024-01-01 00:00:00 UTC; 3h ago
    Trigger: Tue 2024-01-02 00:15:30 UTC; 20h left

Acionar uma limpeza imediata:

$ sudo systemctl start systemd-tmpfiles-clean

--clean so age em entradas onde o campo de idade esta definido. Uma entrada com idade - nunca e excluida automaticamente.

Exemplos Praticos

Exemplo 1: Diretorio temporario por aplicacao com limpeza automatica

# /etc/tmpfiles.d/myapp.conf
d /tmp/myapp 0750 myapp myapp 1d

Cria /tmp/myapp de propriedade de myapp:myapp com modo 0750, e exclui arquivos internos mais antigos que 1 dia.

Exemplo 2: Limpar logs da aplicacao em /var/tmp apos 7 dias

# /etc/tmpfiles.d/clean-var-tmp.conf
d /var/tmp/app-logs 0755 root root 7d

Exemplo 3: Criar diretorio /run no boot sem exclusao automatica

# /etc/tmpfiles.d/myapp-run.conf
d /run/myapp 0755 myapp myapp -

Idade - significa: criar no boot, nunca excluir automaticamente.

Exemplo 4: Excluir um caminho da limpeza

# /etc/tmpfiles.d/exclude.conf
x /tmp/persistent-cache

--clean ignora /tmp/persistent-cache independentemente da idade.

Aplicar e verificar regras imediatamente

# Aplicar regras de criacao agora
$ sudo systemd-tmpfiles --create /etc/tmpfiles.d/myapp.conf

# Dry run: visualizar o que --clean excluiria
$ sudo systemd-tmpfiles --clean --dry-run /etc/tmpfiles.d/myapp.conf

Sempre use --dry-run antes de executar --clean em uma nova regra. Ele mostra o que seria excluido sem fazer nenhuma alteracao.

Problemas Comuns

Arquivos nao estao sendo excluidos

Verifique se o campo de idade nao e -. Note tambem que --clean usa o atime (ultimo tempo de acesso) como limite, nao o mtime.

$ stat /tmp/myfile | grep Access

Se o sistema de arquivos e montado com noatime, o atime nunca e atualizado, entao os arquivos podem parecer mais antigos do que sao. Use touch -a /tmp/myfile para atualizar o atime manualmente ao testar.

Regras nao estao tendo efeito

Valide a configuracao diretamente:

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

Verifique o journal em busca de erros:

$ journalctl -u systemd-tmpfiles-setup

Sobrescrever uma regra do sistema em /usr/lib/tmpfiles.d/

Coloque um arquivo com o mesmo nome em /etc/tmpfiles.d/ - ele tem prioridade. Ordem de carregamento: /etc > /run > /usr/lib.

# Visualizar a regra do sistema
$ cat /usr/lib/tmpfiles.d/tmp.conf

# Criar sua sobreposicao e edita-la
$ sudo cp /usr/lib/tmpfiles.d/tmp.conf /etc/tmpfiles.d/tmp.conf

O que nao fazer

  • Editar arquivos em /usr/lib/tmpfiles.d/ diretamente - atualizacoes de pacotes os sobrescrevem
  • Usar tipo D em um diretorio critico sem limite de idade - --remove excluira todo o conteudo

Proximas Leituras