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-deste--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-runantes de qualquer operacao destrutiva
Premissas (ambiente alvo)
- SO: Ubuntu (rsync 3.x)
- Cenarios local <-> remoto (SSH)
- Para o basico, veja Basico de scp / rsync
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.
- 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.
- 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 (-vvpara 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
--deletepara remover arquivos do destino ausentes na origem. E destrutivo, entao sempre execute--dry-runprimeiro.
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
--delete destroi o destino
Se o caminho de origem estiver errado (por exemplo um diretorio vazio), --delete pode apagar todos os arquivos no destino. Estas combinacoes sao especialmente perigosas.
- Barra final ausente ou extra na origem
- Um
src/cuja partesrce uma variavel que expandiu para vazio
Nunca execute um rsync com --delete sem um --dry-run primeiro.
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--excludepulou do destino
Como fazer snapshots geracionais (incrementais)?
Conclusao:
--link-destcria 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-deste relativo ao diretorio de destino (ou absoluto). Observe isso ao usar um caminho relativo - Para deletar uma geracao, basta
rm -rfseu 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=PADRAOpula 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 apenascachediretamente sob a origem--exclude='cache/': excluircache/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;--bwlimitlimita 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-runobrigatorio 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.
Verificacoes pre-execucao (especialmente com --delete)
- [ ] Os caminhos de origem / destino estao corretos (sem expansao de variavel vazia)?
- [ ] A barra final e intencional (
src/vssrcdiferem)? - [ ] Voce confirmou delecoes/transferencias com
--dry-run? - [ ] Ha espaco livre suficiente no destino (
df -h)? :::
Modelos seguros para copiar e colar
# 1. Backup unidirecional (apenas adicionar/atualizar)
rsync -av src/ /backup/dst/
# 2. Espelho completo (dry-run primeiro, sempre)
rsync -av --delete --dry-run src/ /mirror/dst/
rsync -av --delete src/ /mirror/dst/
# 3. Snapshot geracional (hard-link da execucao anterior)
rsync -av --delete --link-dest=/backup/snapshots/latest \
src/ /backup/snapshots/$(date +%F)/
# 4. Para um host remoto (progresso + limite de banda + porta nao padrao)
rsync -avP --bwlimit=10M -e "ssh -p 2222" src/ user@server:/backup/dst/