rsync na Pratica: Backups e Espelhamento

rsync na Pratica: Backups e Espelhamento

O Que Voce Vai Aprender

  • Como usar a sincronizacao 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 espaco"

Resumo Rapido

  • Atualizacao unidirecional -> rsync -av src/ dst/
  • Espelho completo (deletar extras tambem) -> rsync -av --delete src/ dst/
  • Manter geracoes (incremental) -> hard-link da execucao anterior com --link-dest
  • Sempre execute --dry-run antes de qualquer operacao destrutiva

Premissas (ambiente alvo)

O que e sincronizacao diferencial do rsync?

Conclusao: rsync compara arquivos ja existentes no destino e transfere apenas o que mudou. A segunda execucao rapida e exatamente por que ele e ideal para backups e espelhamento.

rsync nao e apenas uma ferramenta de copia - e uma ferramenta de sincronizacao que transfere apenas a diferenca entre origem e destino. A primeira execucao e uma copia completa, mas todas as execucoes seguintes enviam apenas arquivos alterados (e apenas blocos alterados), entao mesmo grandes conjuntos de dados sao atualizados rapidamente.

Essa propriedade e o que o torna ideal para backups agendados (atualizar o mesmo diretorio diariamente) e espelhamento (manter dois locais identicos).

Por que a transferencia diferencial e rapida?

Conclusao: Por padrao, rsync pula arquivos cujo tamanho e hora de modificacao correspondem. Apenas arquivos alterados - e dentro deles, apenas blocos alterados - sao enviados, entao a transferencia total e pequena.

A velocidade do rsync vem de dois niveis de deteccao de diferenca.

  1. Verificacao de pulo por arquivo: por padrao, rsync compara o tamanho e hora de modificacao (mtime) de cada arquivo; se ambos correspondem, trata o arquivo como inalterado e o pula.
  2. Transferencia delta no nivel 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 nao sao confiaveis (desvio de relogio, logo apos uma migracao de filesystem), use --checksum (abaixo) para comparar o conteudo real dos arquivos.

Como escrever a forma basica de backup?

Conclusao: rsync -av src/ dst/ e a base. O modo archive (-a) copia recursivamente preservando permissoes, propriedade, timestamps e symlinks.

Backups reais comecam com -a, que preserva atributos.

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

-a (modo archive) agrupa estas opcoes.

Incluido Significado
-r Recursivo (em subdiretorios)
-l Preservar symlinks como symlinks
-p Preservar permissoes
-t Preservar timestamps
-g / -o Preservar grupo / proprietario
-D Preservar device e arquivos especiais

Companheiros comuns.

  • -v: mostrar o que e transferido (-vv para mais detalhes)
  • -z: comprimir durante a transferencia (bom em links lentos; pode ser mais lento em LANs)
  • -h: tamanhos legiveis 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 arvore de backup esta um nivel errado" vem disso.

Como espelhar um diretorio? (--delete)

Conclusao: Para um espelho verdadeiro, adicione --delete para remover arquivos do destino ausentes na origem. E destrutivo, entao sempre execute --dry-run primeiro.

Um backup simples com -a apenas adiciona e atualiza. Arquivos que voce deletou da origem permanecem no destino para sempre. Para tornar origem e destino identicos (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 saida 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

Voce pode controlar quando a delecao acontece.

  • --delete-after: deletar apenas apos toda a transferencia ter sucesso (menos provavel de danificar o destino em uma falha no meio da execucao)
  • --delete-excluded: tambem remover arquivos que --exclude pulou do destino

Como fazer snapshots geracionais (incrementais)?

Conclusao: --link-dest cria hard-links de arquivos inalterados do backup anterior, entao cada geracao parece um backup completo mas consome disco apenas para as diferencas.

Um backup que sobrescreve o mesmo diretorio todos os dias nao consegue responder "restaurar o estado de tres dias atras." Para manter geracoes, use --link-dest.

--link-dest=DIR grava o destino criando hard links para arquivos inalterados em DIR (geralmente o backup anterior). Arquivos identicos nao consomem disco duas vezes, entao voce pode manter muitas geracoes 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 execucao de ontem, entao o disco real extra usado e apenas o delta.

  • O caminho --link-dest e relativo ao diretorio de destino (ou absoluto). Observe isso ao usar um caminho relativo
  • Para deletar uma geracao, basta rm -rf seu diretorio com data. Por causa dos hard links, arquivos ainda referenciados por outras geracoes nao sao realmente removidos

Como excluir arquivos indesejados? (--exclude)

Conclusao: --exclude=PADRAO pula alvos; quando ha muitos, reuna-os em --exclude-from=ARQUIVO. Excluir caches, logs e arquivos temporarios torna os backups mais leves.

Incluir caches e arquivos temporarios desperica espaco e tempo de transferencia. Pule-os com --exclude.

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

Para muitos padroes, 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 padrao significa relativo a 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 voce nao esta excluindo mais do que pretendia.

Como controlar banda, retomada e progresso?

Conclusao: -P (--partial --progress) da retomada e progresso; --bwlimit limita a banda. Ambos sao essenciais para grandes dados, links lentos ou transferencias durante horario comercial.

Enviar grandes dados para um host remoto pode saturar o link ou falhar no meio e comecar do zero. Controle com estas opcoes.

# 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/
Opcao Efeito
-P --partial (manter arquivos parciais) + --progress
--partial Manter arquivos parcialmente transferidos e retomar na proxima vez
--bwlimit=RATE Taxa de transferencia maxima (ex. 10M = 10 MB/s)
-e "ssh -p PORT" Especificar o shell remoto (porta nao padrao, etc.)

-z (compressao) custa CPU. Em uma LAN ou com dados ja comprimidos (video, imagens, arquivos compactados), desativar -z e frequentemente mais rapido. Compensa em links WAN lentos.

Quando usar comparacao por checksum?

Conclusao: --checksum (-c) compara o conteudo dos arquivos em vez de tamanho e mtime. Use quando timestamps nao sao confiaveis (desvio de relogio, verificacao pos-migracao). Evite para sincronizacoes de rotina - e lento.

A verificacao padrao "tamanho + mtime" e rapida mas pode perder mudancas quando timestamps nao sao confiaveis. --checksum calcula um checksum para cada arquivo e compara por conteudo - confiavel mas lento.

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

Quando usar.

  • Verificar se uma copia esta completa apos uma migracao de filesystem ou servidor
  • Garantir conteudo identico entre origem e destino (mtimes podem diferir)

--checksum le cada arquivo em ambos os lados, entao e muito lento em grandes conjuntos de dados. Use a verificacao padrao de mtime para sincronizacao de rotina e adicione --checksum apenas para verificacao.

Checklist para prevenir desastres (resumo)

Conclusao: Torne --dry-run obrigatorio para qualquer rsync com --delete, e verifique barras finais e variaveis de caminho vazias toda vez. Isso sozinho previne quase todo acidente serio com rsync.

Proximas Leituras