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:

  1. O emissor lista arquivos e calcula checksums deslizantes de blocos pequenos.
  2. O receptor verifica quais blocos já possui.
  3. Apenas os blocos ausentes ou alterados são transmitidos.
  4. 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ãoSignificado
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/
FlagEfeito
-aArquivo: recursivo + preserva permissões, proprietário, timestamps, symlinks, dispositivos
-vVerbose: exibe cada arquivo transferido
-zComprime dados durante a transferência (útil em links lentos; ignore em LAN rápida)
-PMostra progresso por arquivo + mantém arquivos parciais (--progress --partial combinados)
--deleteExclui no destino arquivos ausentes na origem — cria um espelho exato
-n / --dry-runSimula a transferência sem realizar alterações
--exclude=PADRÃOIgnora arquivos que correspondam ao padrão
--include=PADRÃOForça a inclusão mesmo que um exclude mais amplo os ignorasse
-e sshUsa SSH como transporte (padrão no rsync moderno; adicione opções com -e 'ssh -p 2222')
--checksumCompara conteúdo dos arquivos (não apenas tamanho+mtime); mais lento mas detecta corrupção silenciosa
--bwlimit=KBPSLimita o uso de largura de banda (ex: --bwlimit=10000 para 10 MB/s)
--log-file=CAMINHOGrava um log de transferência no arquivo especificado
--statsExibe 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-flagPreserva
-rRecursão
-lSymlinks como symlinks
-pPermissões (bits chmod)
-tTimestamps de modificação
-gProprietário do grupo
-oProprietário do usuário (requer root)
-DArquivos de dispositivo e especiais

Para ACLs e atributos estendidos:

rsync -aAX /origem/ /destino/
Flag extraPreserva
-AACLs POSIX
-XAtributos estendidos (xattrs)

--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

RecursorsyncscpsftpBorgBackuprclone
Transferência deltaSimNãoNãoSim (dedup)Parcial
Retomar parciaisSim (-P)NãoSimSimSim
CriptografiaVia SSHSSHSSHAES-256 nativoVia SSH/API
DeduplicaçãoNãoNãoNãoSimNão
Snapshots incrementaisSim (--link-dest)NãoNãoSimNão
Backends cloudNãoNãoNãoApenas SSHS3, GCS, muitos
Melhor paraEspelhamento, backupsCópia pontualArquivos interativosBackup eficienteSync cloud

Resumo

  • O rsync usa transferência delta — apenas blocos de arquivos modificados são enviados, tornando os backups repetidos muito rápidos.
  • Use -aAXz para preservar todos os metadados incluindo ACLs e xattrs; adicione -P para transferências retomáveis.
  • Sempre faça um dry-run com -n antes de usar --delete em um novo destino.
  • --link-dest cria snapshots com hard links eficientes em espaço — a base dos esquemas de rotação profissionais.
  • Restrinja as chaves SSH de backup em authorized_keys com 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.

Artigos Relacionados