TL;DR — Resumo Rápido
Guia rsync: algoritmo delta, flags essenciais, backups remotos por SSH, snapshots com --link-dest, automação com cron e modo daemon no Linux.
rsync é a ferramenta padrão do Linux para cópia eficiente de arquivos e backups remotos. Seu algoritmo de transferência delta calcula checksums em ambos os lados e envia apenas os bytes que diferem — tornando-o muito mais rápido que scp para transferências repetidas de grandes árvores de diretórios. Este guia cobre desde os flags básicos até scripts de backup incremental em produção com rotação --link-dest.
Pré-requisitos
- Sistema Linux (Ubuntu 22.04+, Debian 12+, RHEL 9+ ou qualquer distro moderna).
- rsync instalado nas máquinas de origem e destino (
sudo apt install rsync/sudo dnf install rsync). - Autenticação SSH por chave configurada para transferências remotas.
- Acesso root ou sudo para backups em nível de sistema.
Como o rsync Funciona
O rsync usa o algoritmo de transferência delta para minimizar os dados enviados pela rede:
- O emissor lista arquivos e calcula checksums deslizantes de blocos pequenos.
- O receptor verifica quais blocos já possui.
- Apenas os blocos ausentes ou alterados são transmitidos.
- Os metadados (permissões, timestamps, proprietário) são sincronizados separadamente.
Para um diretório grande que muda apenas 1% por dia, o rsync tipicamente transfere menos de 1% do total nas execuções subsequentes. A primeira transferência é sempre uma cópia completa; cada execução posterior é incremental por padrão.
Propriedades principais:
- Baseado em checksum — detecta alterações mesmo que o timestamp de modificação não tenha sido atualizado.
- Transferência atômica — os arquivos são escritos com nome temporário e renomeados ao concluir.
- Multiplataforma — funciona no Linux, macOS e Windows (via WSL ou Cygwin).
- Versão de protocolo negociada — cliente e servidor concordam na versão mais alta suportada ao conectar.
Sintaxe Básica
rsync [OPÇÕES] ORIGEM DESTINO
| Padrão | Significado |
|---|---|
rsync -a /src/ /dst/ | Copia o conteúdo de /src/ para /dst/ |
rsync -a /src /dst/ | Copia o diretório /src para dentro de /dst/ |
rsync -a usuario@host:/remoto/ /local/ | Puxa do remoto para o local |
rsync -a /local/ usuario@host:/remoto/ | Envia do local para o remoto |
A barra final na origem importa. /src/ significa “copie o conteúdo de src”; /src significa “copie o diretório src para dentro do destino.”
Flags Essenciais
rsync -avzP --delete \
--exclude='*.tmp' \
--exclude='.cache/' \
/home/usuario/ usuario@servidorbackup:/backups/home/
| Flag | Efeito |
|---|---|
-a | Arquivo: recursivo + preserva permissões, proprietário, timestamps, symlinks, dispositivos |
-v | Verbose: exibe cada arquivo transferido |
-z | Comprime dados durante a transferência (útil em links lentos; ignore em LAN rápida) |
-P | Mostra progresso por arquivo + mantém arquivos parciais (--progress --partial combinados) |
--delete | Exclui no destino arquivos ausentes na origem — cria um espelho exato |
-n / --dry-run | Simula a transferência sem realizar alterações |
--exclude=PADRÃO | Ignora arquivos que correspondam ao padrão |
--include=PADRÃO | Força a inclusão mesmo que um exclude mais amplo os ignorasse |
-e ssh | Usa SSH como transporte (padrão no rsync moderno; adicione opções com -e 'ssh -p 2222') |
--checksum | Compara conteúdo dos arquivos (não apenas tamanho+mtime); mais lento mas detecta corrupção silenciosa |
--bwlimit=KBPS | Limita o uso de largura de banda (ex: --bwlimit=10000 para 10 MB/s) |
--log-file=CAMINHO | Grava um log de transferência no arquivo especificado |
--stats | Exibe estatísticas resumidas após a conclusão da transferência |
Sempre faça um dry-run primeiro
rsync -avzn --delete /importante/ usuario@host:/backup/importante/
Revise a saída e depois execute novamente sem -n para aplicar as alterações.
Sincronização Remota por SSH
Enviar (local → remoto)
rsync -avz -e "ssh -i ~/.ssh/backup_ed25519" \
/var/www/html/ \
backupuser@192.168.1.50:/backups/webroot/
Puxar (remoto → local)
rsync -avz -e "ssh -i ~/.ssh/backup_ed25519" \
backupuser@192.168.1.50:/backups/webroot/ \
/var/www/html/
Porta SSH personalizada
rsync -avz -e "ssh -p 2222" /src/ usuario@host:/dst/
Restringir a chave SSH de backup
No servidor de backup, em ~/.ssh/authorized_keys, adicione um comando forçado para que a chave só possa executar rsync:
command="rsync --server --daemon .",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-ed25519 AAAA...chave...
Limitação de Largura de Banda
# Limitar a 5 MB/s
rsync -avz --bwlimit=5000 /origem/ usuario@host:/dest/
# Limitar a 1 MB/s para jobs de backup em segundo plano
rsync -avz --bwlimit=1000 --delete /home/ usuario@host:/backups/home/
Para limitação mais dinâmica:
nice -n 19 ionice -c 3 rsync -avz --bwlimit=2000 /origem/ usuario@host:/dest/
Preservar Permissões, Proprietário e Atributos Estendidos
O flag -a é uma abreviação de -rlptgoD:
| Sub-flag | Preserva |
|---|---|
-r | Recursão |
-l | Symlinks como symlinks |
-p | Permissões (bits chmod) |
-t | Timestamps de modificação |
-g | Proprietário do grupo |
-o | Proprietário do usuário (requer root) |
-D | Arquivos de dispositivo e especiais |
Para ACLs e atributos estendidos:
rsync -aAX /origem/ /destino/
| Flag extra | Preserva |
|---|---|
-A | ACLs POSIX |
-X | Atributos estendidos (xattrs) |
Backups Incrementais com —link-dest
--link-dest permite snapshots baseados em hard links — cada diretório diário parece uma cópia completa, mas apenas arquivos novos ou modificados ocupam espaço extra.
Conceito
/backups/
2026-03-20/ ← dados completos, 50 GB
2026-03-21/ ← arquivos sem alterações hard-linkados + apenas arquivos modificados; ~200 MB extra
2026-03-22/ ← hard-linkado de 2026-03-21 + alterações de hoje; ~150 MB extra
Script
#!/bin/bash
set -euo pipefail
ORIGEM="/home/"
DEST="backupuser@192.168.1.50:/backups"
HOJE=$(date +%Y-%m-%d)
ONTEM=$(date -d "yesterday" +%Y-%m-%d)
SSH_KEY="/root/.ssh/backup_ed25519"
rsync -avz \
-e "ssh -i $SSH_KEY" \
--link-dest="$DEST/daily/$ONTEM" \
--delete \
"$ORIGEM" \
"$DEST/daily/$HOJE/"
echo "Backup completo: $HOJE"
Rotação: diária / semanal / mensal
#!/bin/bash
ORIGEM="/home/"
BASE="/backups"
HOJE=$(date +%Y-%m-%d)
DOW=$(date +%u)
DOM=$(date +%d)
DEST_HOJE="$BASE/daily/$HOJE"
LINK_ULTIMO="$BASE/daily/latest"
rsync -a --delete \
--link-dest="$LINK_ULTIMO" \
"$ORIGEM" "$DEST_HOJE/"
ln -sfn "$DEST_HOJE" "$LINK_ULTIMO"
[ "$DOW" -eq 7 ] && cp -al "$DEST_HOJE" "$BASE/weekly/$(date +%Y-W%V)"
[ "$DOM" -eq 01 ] && cp -al "$DEST_HOJE" "$BASE/monthly/$(date +%Y-%m)"
find "$BASE/daily" -maxdepth 1 -type d | sort | head -n -7 | xargs rm -rf
find "$BASE/weekly" -maxdepth 1 -type d | sort | head -n -4 | xargs rm -rf
find "$BASE/monthly" -maxdepth 1 -type d | sort | head -n -12 | xargs rm -rf
Automação com cron e Timers systemd
cron
crontab -e
# Adicionar:
0 2 * * * /usr/local/bin/rsync-backup.sh >> /var/log/rsync-backup.log 2>&1
Serviço + timer systemd
/etc/systemd/system/rsync-backup.service:
[Unit]
Description=Backup diário com rsync
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
User=root
ExecStart=/usr/local/bin/rsync-backup.sh
StandardOutput=journal
StandardError=journal
/etc/systemd/system/rsync-backup.timer:
[Unit]
Description=Timer de backup diário com rsync
[Timer]
OnCalendar=*-*-* 02:00:00
RandomizedDelaySec=10min
Persistent=true
[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now rsync-backup.timer
Modo Daemon do rsync
Para volumes altos ou pulls agendados sem autenticação SSH interativa:
/etc/rsyncd.conf
uid = nobody
gid = nogroup
use chroot = yes
max connections = 4
log file = /var/log/rsyncd.log
[backups]
path = /backups/shared
comment = Área de backup compartilhada
read only = no
auth users = clientebackup
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.1.0/24
hosts deny = *
chmod 600 /etc/rsyncd.secrets
systemctl enable --now rsync
Uso do cliente
rsync -avz clientebackup@servidorbackup::backups /local/restaurar/
Monitoramento e Logs
rsync -avz --stats /origem/ /dest/ 2>&1 | tee /var/log/rsync-$(date +%Y%m%d).log
Verificar falhas em scripts
rsync -avz /origem/ /dest/
EXIT=$?
if [ $EXIT -ne 0 ] && [ $EXIT -ne 24 ]; then
echo "rsync falhou com código $EXIT" | mail -s "Backup falhou em $(hostname)" admin@exemplo.com
fi
O código de saída 24 (arquivos desapareceram durante a transferência) é normal em sistemas ativos.
rsync vs scp vs sftp vs Borg vs rclone
| Recurso | rsync | scp | sftp | BorgBackup | rclone |
|---|---|---|---|---|---|
| Transferência delta | Sim | Não | Não | Sim (dedup) | Parcial |
| Retomar parciais | Sim (-P) | Não | Sim | Sim | Sim |
| Criptografia | Via SSH | SSH | SSH | AES-256 nativo | Via SSH/API |
| Deduplicação | Não | Não | Não | Sim | Não |
| Snapshots incrementais | Sim (--link-dest) | Não | Não | Sim | Não |
| Backends cloud | Não | Não | Não | Apenas SSH | S3, GCS, muitos |
| Melhor para | Espelhamento, backups | Cópia pontual | Arquivos interativos | Backup eficiente | Sync cloud |
Resumo
- O rsync usa transferência delta — apenas blocos de arquivos modificados são enviados, tornando os backups repetidos muito rápidos.
- Use
-aAXzpara preservar todos os metadados incluindo ACLs e xattrs; adicione-Ppara transferências retomáveis. - Sempre faça um dry-run com
-nantes de usar--deleteem um novo destino. --link-destcria snapshots com hard links eficientes em espaço — a base dos esquemas de rotação profissionais.- Restrinja as chaves SSH de backup em
authorized_keyscom um comando forçado para limitar o raio de impacto. - Prefira timers do systemd em vez de cron para backups automatizados — melhor registro e tratamento de execuções perdidas.
- O código de saída 24 é normal em sistemas ativos; trate-o como sucesso nos scripts.