rsync na Prática: Backups e Espelhamento

rsync na Prática: Backups e Espelhamento

O Que Você Vai Aprender

  • Como usar a sincronização diferencial do rsync para backups e espelhamento reais
  • O uso correto de --delete, --link-dest e --exclude - e como evitar desastres
  • Um fluxo de trabalho seguro que previne "sincronizei e deletou tudo" e falhas de "sem espaço"

Resumo Rápido

  • Atualização unidirecional -> rsync -av src/ dst/
  • Espelho completo (deletar extras também) -> rsync -av --delete src/ dst/
  • Manter gerações (incremental) -> hard-link da execução anterior com --link-dest
  • Sempre execute --dry-run antes de qualquer operação destrutiva

Premissas (ambiente alvo)

O que é sincronização diferencial do rsync?

Conclusão: rsync compara arquivos já existentes no destino e transfere apenas o que mudou. A segunda execução rápida é exatamente por que ele é ideal para backups e espelhamento.

rsync não é apenas uma ferramenta de cópia - é uma ferramenta de sincronização que transfere apenas a diferença entre origem e destino. A primeira execução é uma cópia completa, mas todas as execuções seguintes enviam apenas arquivos alterados (e apenas blocos alterados), então mesmo grandes conjuntos de dados são atualizados rapidamente.

Essa propriedade é o que o torna ideal para backups agendados (atualizar o mesmo diretório diariamente) e espelhamento (manter dois locais idênticos).

Por que a transferência diferencial é rápida?

Conclusão: Por padrão, rsync pula arquivos cujo tamanho e hora de modificação correspondem. Apenas arquivos alterados - e dentro deles, apenas blocos alterados - são enviados, então a transferência total é pequena.

A velocidade do rsync vem de dois níveis de detecção de diferença.

  1. Verificação de pulo por arquivo: por padrão, rsync compara o tamanho e hora de modificação (mtime) de cada arquivo; se ambos correspondem, trata o arquivo como inalterado e o pula.
  2. Transferência delta no nível de bloco: para arquivos marcados como alterados, um checksum rotativo encontra blocos correspondentes e envia apenas as partes alteradas (o algoritmo rsync).
# Primeira execucao: copia completa
$ rsync -av src/ /backup/dst/

# Execucoes seguintes: apenas o delta (quase instantaneo se nada mudou)
$ rsync -av src/ /backup/dst/

Quando mtimes não são confiáveis (desvio de relógio, logo após uma migração de filesystem), use --checksum (abaixo) para comparar o conteúdo real dos arquivos.

Como escrever a forma básica de backup?

Conclusão: rsync -av src/ dst/ é a base. O modo archive (-a) copia recursivamente preservando permissões, propriedade, timestamps e symlinks.

Backups reais começam com -a, que preserva atributos.

$ rsync -av /home/user/data/ /backup/data/

-a (modo archive) agrupa estas opções.

Incluído Significado
-r Recursivo (em subdiretórios)
-l Preservar symlinks como symlinks
-p Preservar permissões
-t Preservar timestamps
-g / -o Preservar grupo / proprietário
-D Preservar device e arquivos especiais

Companheiros comuns.

  • -v: mostrar o que é transferido (-vv para mais detalhes)
  • -z: comprimir durante a transferência (bom em links lentos; pode ser mais lento em LANs)
  • -h: tamanhos legíveis por humanos (combina bem com --progress)

A armadilha da barra final (mais importante)

rsync -av src/ dst/   # coloca o CONTEUDO de src em dst
rsync -av src  dst/   # coloca o DIRETORIO src dentro de dst (dst/src/...)

Uma barra final / na origem muda o resultado. A maioria dos incidentes "minha árvore de backup está um nível errado" vem disso.

Como espelhar um diretório? (--delete)

Conclusão: Para um espelho verdadeiro, adicione --delete para remover arquivos do destino ausentes na origem. É destrutivo, então sempre execute --dry-run primeiro.

Um backup simples com -a apenas adiciona e atualiza. Arquivos que você deletou da origem permanecem no destino para sempre. Para tornar origem e destino idênticos (espelhamento), use --delete.

# Sempre dry-run primeiro para ver O QUE sera deletado
$ rsync -av --delete --dry-run src/ /mirror/dst/

# Se a saida parecer correta, execute de verdade
$ rsync -av --delete src/ /mirror/dst/

Na saída do dry-run, arquivos a serem removidos aparecem em linhas deleting ....

sending incremental file list
deleting old-report.csv
deleting cache/tmp.dat
./
new-report.csv

Você pode controlar quando a deleção acontece.

  • --delete-after: deletar apenas após toda a transferência ter sucesso (menos provável de danificar o destino em uma falha no meio da execução)
  • --delete-excluded: também remover arquivos que --exclude pulou do destino

Como fazer snapshots geracionais (incrementais)?

Conclusão: --link-dest cria hard-links de arquivos inalterados do backup anterior, então cada geração parece um backup completo mas consome disco apenas para as diferenças.

Um backup que sobrescreve o mesmo diretório todos os dias não consegue responder "restaurar o estado de três dias atrás." Para manter gerações, use --link-dest.

--link-dest=DIR grava o destino criando hard links para arquivos inalterados em DIR (geralmente o backup anterior). Arquivos idênticos não consomem disco duas vezes, então você pode manter muitas gerações eficientemente.

# Criar um diretorio de snapshot com data a cada execucao
$ SRC=/home/user/data/
$ DEST=/backup/snapshots
$ TODAY=$(date +%F)          # ex. 2026-06-05
$ LATEST=$DEST/latest        # symlink para o snapshot anterior

$ rsync -av --delete \
    --link-dest="$LATEST" \
    "$SRC" "$DEST/$TODAY/"

# Apontar latest para o snapshot mais recente
$ ln -sfn "$DEST/$TODAY" "$LATEST"

Agora /backup/snapshots/2026-06-05/ mostra todos os arquivos, mas arquivos inalterados desde ontem compartilham hard links com a execução de ontem, então o disco real extra usado é apenas o delta.

  • O caminho --link-dest é relativo ao diretório de destino (ou absoluto). Observe isso ao usar um caminho relativo
  • Para deletar uma geração, basta rm -rf seu diretório com data. Por causa dos hard links, arquivos ainda referenciados por outras gerações não são realmente removidos

Como excluir arquivos indesejados? (--exclude)

Conclusão: --exclude=PADRAO pula alvos; quando há muitos, reuna-os em --exclude-from=ARQUIVO. Excluir caches, logs e arquivos temporários torna os backups mais leves.

Incluir caches e arquivos temporários desperica espaço e tempo de transferência. Pule-os com --exclude.

$ rsync -av --delete \
    --exclude='*.tmp' \
    --exclude='cache/' \
    --exclude='node_modules/' \
    src/ /backup/dst/

Para muitos padrões, coloque-os em um arquivo.

# Conteudo de .rsync-exclude (um padrao por linha)
# *.tmp
# cache/
# node_modules/
# .git/

$ rsync -av --delete --exclude-from='.rsync-exclude' src/ /backup/dst/

Uma / inicial em um padrão significa relativo à raiz da origem.

  • --exclude='/cache': excluir apenas cache diretamente sob a origem
  • --exclude='cache/': excluir cache/ em qualquer profundidade

Use --dry-run para confirmar que você não está excluindo mais do que pretendia.

Como controlar banda, retomada e progresso?

Conclusão: -P (--partial --progress) dá retomada e progresso; --bwlimit limita a banda. Ambos são essenciais para grandes dados, links lentos ou transferências durante horário comercial.

Enviar grandes dados para um host remoto pode saturar o link ou falhar no meio e começar do zero. Controle com estas opções.

# Progresso + manter arquivos parciais em interrupcao (retomada continua)
$ rsync -avP src/ user@server:/backup/dst/

# Limitar banda a 10 MB/s (bom para backups durante horarios de pico)
$ rsync -av --bwlimit=10M src/ user@server:/backup/dst/

# Porta SSH nao padrao
$ rsync -av -e "ssh -p 2222" src/ user@server:/backup/dst/
Opção Efeito
-P --partial (manter arquivos parciais) + --progress
--partial Manter arquivos parcialmente transferidos e retomar na próxima vez
--bwlimit=RATE Taxa de transferência máxima (ex. 10M = 10 MB/s)
-e "ssh -p PORT" Especificar o shell remoto (porta não padrão, etc.)

-z (compressão) custa CPU. Em uma LAN ou com dados já comprimidos (vídeo, imagens, arquivos compactados), desativar -z é frequentemente mais rápido. Compensa em links WAN lentos.

Quando usar comparação por checksum?

Conclusão: --checksum (-c) compara o conteúdo dos arquivos em vez de tamanho e mtime. Use quando timestamps não são confiáveis (desvio de relógio, verificação pós-migração). Evite para sincronizações de rotina - é lento.

A verificação padrão "tamanho + mtime" é rápida mas pode perder mudanças quando timestamps não são confiáveis. --checksum calcula um checksum para cada arquivo e compara por conteúdo - confiável mas lento.

# Diff rigoroso baseado em conteudo (migracao / verificacao de integridade)
$ rsync -avc src/ /backup/dst/

Quando usar.

  • Verificar se uma cópia está completa após uma migração de filesystem ou servidor
  • Garantir conteúdo idêntico entre origem e destino (mtimes podem diferir)

--checksum lê cada arquivo em ambos os lados, então é muito lento em grandes conjuntos de dados. Use a verificação padrão de mtime para sincronização de rotina e adicione --checksum apenas para verificação.

Checklist para prevenir desastres (resumo)

Conclusão: Torne --dry-run obrigatório para qualquer rsync com --delete, e verifique barras finais e variáveis de caminho vazias toda vez. Isso sozinho previne quase todo acidente sério com rsync.

Próximas Leituras