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-deste--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-runantes de qualquer operação destrutiva
Premissas (ambiente alvo)
- SO: Ubuntu (rsync 3.x)
- Cenários local <-> remoto (SSH)
- Para o básico, veja Básico de scp / rsync
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.
- 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.
- 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 (-vvpara 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
--deletepara remover arquivos do destino ausentes na origem. É destrutivo, então sempre execute--dry-runprimeiro.
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
--delete destrói o destino
Se o caminho de origem estiver errado (por exemplo um diretório vazio), --delete pode apagar todos os arquivos no destino. Estas combinações são especialmente perigosas.
- Barra final ausente ou extra na origem
- Um
src/cuja partesrcé uma variável que expandiu para vazio
Nunca execute um rsync com --delete sem um --dry-run primeiro.
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--excludepulou do destino
Como fazer snapshots geracionais (incrementais)?
Conclusão:
--link-destcria 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 -rfseu 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=PADRAOpula 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 apenascachediretamente sob a origem--exclude='cache/': excluircache/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;--bwlimitlimita 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-runobrigató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.
Verificações pré-execução (especialmente com --delete)
- [ ] Os caminhos de origem / destino estão corretos (sem expansão de variável vazia)?
- [ ] A barra final é intencional (
src/vssrcdiferem)? - [ ] Você confirmou deleções/transferências com
--dry-run? - [ ] Há espaço 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/