Boas Práticas de Limpeza do /tmp - tmpfiles.d e systemd-tmpfiles

Boas Práticas de Limpeza do /tmp - tmpfiles.d e systemd-tmpfiles

O Que Você Vai Aprender

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

Resumo Rápido

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

Pré-requisitos

  • SO: Ubuntu ou qualquer Linux baseado em systemd
  • Acesso root ou sudo necessário

Por Que o /tmp Precisa de Limpeza?

/tmp é onde as aplicações gravam arquivos temporários. Na maioria dos sistemas Ubuntu, ele é um tmpfs em RAM - limpo na reinicialização. Servidores de longa duração, porém, acumulam arquivos temporários entre reinicializações, o que pode esgotar o espaço em disco e causar referências obsoletas de arquivos PID ou socket.

  • Usos típicos: arquivos intermediários de compressão, dados de sessão, arquivos socket
  • Padrão Ubuntu: /tmp é montado como tmpfs, então é limpo na reinicialização
  • /var/tmp: persiste entre reinicializações por design - requer gerenciamento explícito
$ mount | grep /tmp
tmpfs on /tmp type tmpfs (rw,nosuid,nodev)

Se /tmp é tmpfs, os arquivos desaparecem na reinicialização. Se é baseado em disco, a limpeza é ainda mais crítica. Verifique o uso com df -h /tmp.

O Que É o systemd-tmpfiles?

systemd-tmpfiles é a ferramenta declarativa para gerenciar diretórios temporários - criando-os no boot, definindo permissões e excluindo arquivos obsoletos de forma agendada.

Três modos de operação:

Modo Flag Ação
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 (padrão: 15 min após o boot, depois diariamente)

Como Escrever Regras tmpfiles.d

Coloque arquivos de configuração em /etc/tmpfiles.d/. Os padrões do sistema ficam em /usr/lib/tmpfiles.d/ - nunca edite esses diretamente, pois atualizações de pacotes os sobrescrevem.

Formato

tipo caminho modo uid gid idade argumento
Campo Descrição Exemplo
tipo Tipo de operação d, f, x, e
caminho Caminho alvo /tmp/myapp
modo Permissões (octal) 0755
uid/gid Proprietário (- = manter atual) root / -
idade Limite de exclusão para --clean 7d, 1h, - (nunca)
argumento Conteúdo inicial para arquivos -

Tipos Comuns

Tipo Significado
d Criar diretório se ausente; --clean remove arquivos antigos dentro
D Como d, mas --remove também exclui o conteúdo do diretório
f Criar arquivo se ausente
f+ Criar ou truncar arquivo
x Excluir de --clean e --remove
e Definir permissões em uma entrada existente
z Definir permissões e rótulos SELinux

Como Executar a Limpeza Periódica

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 só age em entradas onde o campo de idade está definido. Uma entrada com idade - nunca é excluída automaticamente.

Exemplos Práticos

Exemplo 1: Diretório temporário por aplicação com limpeza automática

# /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 aplicação em /var/tmp após 7 dias

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

Exemplo 3: Criar diretório /run no boot sem exclusão automática

# /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 excluído sem fazer nenhuma alteração.

Problemas Comuns

Arquivos não estão sendo excluídos

Verifique se o campo de idade não é -. Note também que --clean usa o atime (último tempo de acesso) como limite, não o mtime.

$ stat /tmp/myfile | grep Access

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

Regras não estão tendo efeito

Valide a configuração 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 não fazer

  • Editar arquivos em /usr/lib/tmpfiles.d/ diretamente - atualizações de pacotes os sobrescrevem
  • Usar tipo D em um diretório crítico sem limite de idade - --remove excluirá todo o conteúdo

Próximas Leituras