A perda de dados nao e uma questao de se vai acontecer, mas de quando. Hardware falha, ransomware criptografa e erro humano apaga. A unica protecao confiavel e uma estrategia de backup automatizada e testada. rsync e uma das ferramentas mais poderosas e flexiveis disponiveis no Linux para esse proposito — transfere apenas as diferencas entre origem e destino, funciona perfeitamente sobre SSH e suporta backups estilo snapshot que parecem copias completas enquanto consomem uma fracao do espaco em disco.
Este guia cobre tudo o que voce precisa para projetar, implementar e automatizar uma estrategia de backup com rsync de nivel producao para seus servidores Linux.
O Que E Rsync?
Rsync (Remote Sync) e um utilitario de copia de arquivos rapido e versatil para sistemas Linux e Unix. Originalmente escrito por Andrew Tridgell e Paul Mackerras, utiliza um algoritmo de transferencia delta que envia apenas as diferencas entre os arquivos de origem e os arquivos existentes no destino. Isso o torna significativamente mais eficiente que ferramentas como cp ou scp para backups recorrentes.
Caracteristicas principais:
- Transferencias delta — apenas bytes modificados sao enviados, nao arquivos inteiros
- Preservacao de metadados — permissoes, propriedade, timestamps, links simbolicos
- Integracao SSH — transferencias criptografadas para servidores remotos nativamente
- Suporte a hard links — permite backups estilo snapshot eficientes em disco
- Filtragem flexivel — padroes de inclusao/exclusao para controle granular
# Verificar se rsync esta instalado e sua versao
rsync --version
Se rsync nao esta instalado:
# Debian/Ubuntu
sudo apt update && sudo apt install -y rsync
# RHEL/CentOS/Fedora
sudo dnf install -y rsync
Por Que Rsync para Backups?
Existem muitas ferramentas de backup disponiveis — tar, cp, scp, Duplicity, Borg, Restic — entao, por que escolher rsync?
- Velocidade: Apos a copia completa inicial, execucoes subsequentes transferem apenas dados modificados. Um backup de 500 GB onde 2 GB mudaram leva segundos, nao horas.
- Simplicidade: rsync e um unico comando com opcoes bem documentadas. Sem formato proprietario, sem banco de dados de deduplicacao para corromper.
- Transparencia: Backups sao arquivos e diretorios simples. Voce pode navegar, buscar com grep e restaurar com ferramentas Unix padrao — nenhum utilitario especial de restauracao necessario.
- Universalidade: rsync esta disponivel em toda distribuicao Linux, macOS e ate Windows (via WSL ou Cygwin). Ja vem instalado na maioria dos servidores.
- Composibilidade: rsync se integra perfeitamente com cron, timers systemd, SSH e scripts shell.
A desvantagem e que rsync nao fornece criptografia em repouso, deduplicacao entre backups nem banco de dados de catalogo nativamente. Para essas funcionalidades, considere Borg ou Restic. Mas para backups diretos, confiaveis e transparentes, rsync e dificil de superar.
Pre-requisitos
Antes de implementar as estrategias neste guia, certifique-se de ter:
- Dois sistemas Linux — um servidor de origem (producao) e um destino de backup (disco local, NAS ou servidor remoto)
- rsync instalado em origem e destino (versao 3.1+ recomendada)
- Autenticacao SSH baseada em chaves configurada entre origem e destino para transferencias automatizadas sem senha (consulte nosso Guia de Hardening SSH)
- Espaco em disco suficiente no destino — minimo 1.5 vezes o tamanho dos dados que voce vai fazer backup
- Acesso root ou sudo em ambas as maquinas se precisar preservar propriedade e atributos especiais de arquivos
# Verificar versao do rsync em ambas as maquinas
rsync --version | head -1
# Verificar que autenticacao SSH com chave funciona sem solicitar senha
ssh -o BatchMode=yes user@backup-server echo "SSH key auth works"
Sintaxe Basica e Opcoes do Rsync
A sintaxe geral do rsync e:
rsync [OPCOES] ORIGEM DESTINO
Entender as flags mais importantes e essencial antes de construir uma estrategia de backup:
# Modo arquivo: preserva permissoes, propriedade, timestamps, symlinks, dispositivos
rsync -a /origem/ /destino/
# Arquivo + detalhado + tamanhos legiveis + progresso
rsync -avhP /origem/ /destino/
# Execucao seca -- mostra o que seria transferido sem fazer mudancas
rsync -avhn /origem/ /destino/
Detalhe critico: barras finais importam.
/origem/(com barra final) copia o conteudo do diretorio./origem(sem barra final) copia o diretorio em si. Este e um dos erros mais comuns com rsync.
# Copia conteudo de /var/www/ para dentro de /backup/www/
rsync -avh /var/www/ /backup/www/
# Copia o diretorio /var/www (como subdiretorio) para dentro de /backup/
# Resultado: /backup/www/
rsync -avh /var/www /backup/
Backups Locais
A estrategia rsync mais simples e um backup local para um disco ou particao separada. Isso protege contra exclusao acidental e corrupcao do sistema de arquivos (mas nao contra falha de hardware de toda a maquina).
# Espelhar /home para um disco externo montado em /mnt/backup
rsync -avh --delete /home/ /mnt/backup/home/
A flag --delete e importante: remove arquivos do destino que nao existem mais na origem, mantendo o backup como um espelho exato. Sem ela, arquivos excluidos se acumulam no backup indefinidamente.
# Fazer backup de multiplos diretorios em um unico comando
rsync -avh --delete \
/etc/ \
/var/www/ \
/home/ \
/mnt/backup/
# Backup com arquivo de log para auditoria
rsync -avh --delete --log-file=/var/log/rsync-backup.log \
/home/ /mnt/backup/home/
Para backups em nivel de sistema que incluem arquivos de dispositivo e atributos especiais:
# Backup completo do sistema (requer root)
sudo rsync -aAXvh --delete \
--exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} \
/ /mnt/backup/system/
As flags -aAX preservam modo arquivo (-a), ACLs (-A) e atributos estendidos (-X), que sao necessarios para um backup completo do sistema.
Backups Remotos por SSH
Backups remotos protegem contra falhas de hardware local, incendios, roubos e outros desastres fisicos. rsync usa SSH como transporte padrao para transferencias remotas, fornecendo criptografia sem configuracao adicional.
# Backup tipo push: enviar dados locais para um servidor remoto
rsync -avhz -e ssh /var/www/ backupuser@192.168.1.100:/backup/www/
# Backup tipo pull: trazer dados de um servidor remoto para o local
rsync -avhz -e ssh backupuser@192.168.1.100:/var/www/ /backup/www/
A flag -z habilita compressao durante a transferencia, o que e benefico em links de rede mais lentos. Em uma rede gigabit local, a compressao pode realmente desacelerar devido a sobrecarga de CPU.
Para usar uma porta SSH nao padrao ou uma chave especifica:
# Usar uma porta SSH personalizada e arquivo de identidade
rsync -avhz -e "ssh -p 2222 -i /home/backupuser/.ssh/backup_key" \
/var/www/ backupuser@remote:/backup/www/
Para backups automatizados, a chave SSH nao deve ter frase secreta (ou usar ssh-agent). Restrinja a chave de backup no servidor remoto para limitar suas capacidades:
# No servidor remoto, em ~backupuser/.ssh/authorized_keys:
# Restringir a chave apenas ao rsync
command="rsync --server --sender -vlogDtprze.iLsfxCIvu . /backup/",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-ed25519 AAAAC3Nz... backup@source
Backups Incrementais com —link-dest (Estilo Snapshot)
Esta e a estrategia de backup rsync mais poderosa. Usando --link-dest, voce pode criar o que parece um backup completo todo dia, mas apenas arquivos modificados consomem espaco adicional em disco. Arquivos inalterados sao hard-linked ao backup anterior.
Como funciona:
- rsync compara cada arquivo de origem com o arquivo correspondente no diretorio
--link-dest - Se um arquivo nao mudou, rsync cria um hard link (zero espaco adicional)
- Se um arquivo mudou ou e novo, rsync o copia normalmente
- O resultado e um diretorio que parece e se comporta como um backup completo
# Criar um backup estilo snapshot
DATE=$(date +%Y-%m-%d_%H-%M-%S)
DEST="/backup/snapshots/$DATE"
LATEST="/backup/snapshots/latest"
rsync -avh --delete \
--link-dest="$LATEST" \
/home/ "$DEST/"
# Atualizar o symlink "latest"
rm -f "$LATEST"
ln -s "$DEST" "$LATEST"
O uso de disco e notavel. Considere um conjunto de dados de 100 GB onde 1% muda diariamente:
| Dia | Tamanho Aparente | Uso Real de Disco |
|---|---|---|
| Dia 1 (completo) | 100 GB | 100 GB |
| Dia 2 | 100 GB | ~1 GB (apenas dados novos) |
| Dia 3 | 100 GB | ~1 GB |
| 30 dias total | 3.000 GB aparentes | ~129 GB reais |
Cada diretorio de snapshot e completamente navegavel com ferramentas padrao. Voce pode fazer cd no backup de qualquer dia e ver o estado completo dos seus arquivos naquele momento.
# Navegar o backup de 5 dias atras
ls /backup/snapshots/2026-01-17_02-00-00/home/jc/documents/
# Restaurar um arquivo especifico de 3 dias atras
cp /backup/snapshots/2026-01-19_02-00-00/home/jc/report.pdf /home/jc/report.pdf
# Verificar uso real de disco por snapshot (mostra apenas dados unicos)
du -sh /backup/snapshots/*/
Padroes de Exclusao e Filtros
Nem tudo precisa ser feito backup. Excluir arquivos temporarios, caches e artefatos de build economiza tempo e espaco em disco.
# Padroes de exclusao inline
rsync -avh --delete \
--exclude='*.tmp' \
--exclude='*.log' \
--exclude='.cache/' \
--exclude='node_modules/' \
--exclude='__pycache__/' \
/home/ /backup/home/
Para regras de exclusao complexas, use um arquivo de exclusao:
# Criar /etc/rsync-excludes.txt
cat > /etc/rsync-excludes.txt << 'EOF'
# Arquivos temporarios e de cache
*.tmp
*.swp
*.swo
*~
.cache/
.thumbnails/
# Artefatos de build
node_modules/
vendor/
__pycache__/
*.pyc
target/
build/
dist/
# Arquivos do sistema que nao devem ser feitos backup
/proc/
/sys/
/dev/
/run/
/tmp/
/mnt/
/media/
/lost+found/
# Arquivos de midia grandes (opcional)
# *.iso
# *.mp4
EOF
# Usar o arquivo de exclusao
rsync -avh --delete --exclude-from=/etc/rsync-excludes.txt \
/home/ /backup/home/
rsync tambem suporta combinacoes de inclusao/exclusao para controle mais granular:
# Apenas fazer backup de arquivos .conf e .sh de /etc
rsync -avh \
--include='*/' \
--include='*.conf' \
--include='*.sh' \
--exclude='*' \
/etc/ /backup/etc-configs/
Limitacao de Largura de Banda e Compressao
Ao fazer backup por WAN ou link de rede compartilhado, voce precisa controlar quanta largura de banda o rsync consome para evitar impactar o trafego de producao.
# Limitar largura de banda a 5 MB/s (valor em KB/s)
rsync -avhz --bwlimit=5000 -e ssh \
/var/www/ backupuser@remote:/backup/www/
# Limitar a 10 Mbps (~1250 KB/s)
rsync -avhz --bwlimit=1250 -e ssh \
/var/www/ backupuser@remote:/backup/www/
Opcoes de compressao:
# Habilitar compressao de transferencia (util em links lentos)
rsync -avhz -e ssh /source/ user@remote:/backup/
# Pular compressao para arquivos ja comprimidos
rsync -avh --compress --skip-compress=gz/bz2/zip/7z/jpg/png/mp4/mkv \
-e ssh /source/ user@remote:/backup/
Para compressao em nivel SSH (alternativa ao -z do rsync):
# Usar compressao SSH em vez de compressao rsync
rsync -avh -e "ssh -C" /source/ user@remote:/backup/
Dica: Nao habilite a compressao do rsync (
-z) e a compressao SSH (-C) simultaneamente. Compressao dupla desperdia ciclos de CPU e pode realmente aumentar o tamanho da transferencia. Use uma ou outra — o-zdo rsync e geralmente mais eficiente porque comprime por arquivo.
Script de Backup Automatizado com Cron
Um script de backup completo deve lidar com logging, relatorio de erros, rotacao de snapshots e notificacoes por email. Aqui esta um exemplo pronto para producao:
#!/usr/bin/env bash
# /usr/local/bin/rsync-backup.sh
# Backup rsync estilo snapshot com rotacao e logging
set -euo pipefail
# --- Configuracao ---------------------------------------------------------
SOURCE="/home/"
BACKUP_ROOT="/backup/snapshots"
REMOTE_USER="backupuser"
REMOTE_HOST="192.168.1.100"
REMOTE_DEST="${REMOTE_USER}@${REMOTE_HOST}:${BACKUP_ROOT}"
SSH_KEY="/root/.ssh/backup_ed25519"
EXCLUDE_FILE="/etc/rsync-excludes.txt"
LOG_DIR="/var/log/rsync-backup"
RETENTION_DAYS=30
BWLIMIT=0 # 0 = ilimitado, ou definir KB/s
# --- Variaveis derivadas --------------------------------------------------
DATE=$(date +%Y-%m-%d_%H-%M-%S)
DEST="${BACKUP_ROOT}/${DATE}"
LATEST="${BACKUP_ROOT}/latest"
LOG_FILE="${LOG_DIR}/backup-${DATE}.log"
LOCK_FILE="/tmp/rsync-backup.lock"
# --- Funcoes --------------------------------------------------------------
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
cleanup() {
rm -f "$LOCK_FILE"
log "Lock file removed."
}
# --- Verificacoes pre-voo ------------------------------------------------
mkdir -p "$LOG_DIR" "$BACKUP_ROOT"
# Prevenir execucoes concorrentes
if [ -f "$LOCK_FILE" ]; then
echo "Backup already running (lock file exists). Exiting."
exit 1
fi
trap cleanup EXIT
touch "$LOCK_FILE"
log "=== Backup started ==="
log "Source: $SOURCE"
log "Destination: $DEST"
# --- Executar rsync -------------------------------------------------------
RSYNC_OPTS=(
-avh
--delete
--numeric-ids
--log-file="$LOG_FILE"
)
[ -f "$EXCLUDE_FILE" ] && RSYNC_OPTS+=(--exclude-from="$EXCLUDE_FILE")
[ "$BWLIMIT" -gt 0 ] 2>/dev/null && RSYNC_OPTS+=(--bwlimit="$BWLIMIT")
[ -L "$LATEST" ] && RSYNC_OPTS+=(--link-dest="$LATEST")
if rsync "${RSYNC_OPTS[@]}" "$SOURCE" "$DEST/"; then
log "rsync completed successfully."
else
RSYNC_EXIT=$?
log "ERROR: rsync exited with code $RSYNC_EXIT"
exit $RSYNC_EXIT
fi
# --- Atualizar symlink latest ---------------------------------------------
rm -f "$LATEST"
ln -s "$DEST" "$LATEST"
log "Updated 'latest' symlink to $DEST"
# --- Rotacionar backups antigos -------------------------------------------
log "Removing backups older than $RETENTION_DAYS days..."
find "$BACKUP_ROOT" -maxdepth 1 -type d -name "20*" -mtime +$RETENTION_DAYS -exec rm -rf {} \;
log "Rotation complete."
# --- Relatorio de uso de disco --------------------------------------------
USAGE=$(du -sh "$BACKUP_ROOT" | cut -f1)
log "Total backup storage used: $USAGE"
log "=== Backup finished ==="
Torne o script executavel e agende com cron:
# Tornar executavel
sudo chmod +x /usr/local/bin/rsync-backup.sh
# Editar o crontab do root
sudo crontab -e
Adicione a seguinte entrada cron:
# Executar backup todo dia as 2:00 AM
0 2 * * * /usr/local/bin/rsync-backup.sh >> /var/log/rsync-backup/cron.log 2>&1
# Executar backup a cada 6 horas
0 */6 * * * /usr/local/bin/rsync-backup.sh >> /var/log/rsync-backup/cron.log 2>&1
Alternativamente, voce pode usar um timer systemd para agendamento mais robusto:
# /etc/systemd/system/rsync-backup.service
[Unit]
Description=Rsync Backup Service
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/rsync-backup.sh
Nice=10
IOSchedulingClass=idle
# /etc/systemd/system/rsync-backup.timer
[Unit]
Description=Run Rsync Backup Daily
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300
[Install]
WantedBy=timers.target
# Habilitar e iniciar o timer
sudo systemctl daemon-reload
sudo systemctl enable --now rsync-backup.timer
# Verificar status do timer
systemctl list-timers rsync-backup.timer
Restauracao a Partir de Backups
Um backup so e util se voce pode restaurar a partir dele. Como backups rsync sao arquivos e diretorios simples, a restauracao e direta.
Restaurar um unico arquivo
# Encontrar o arquivo em um snapshot especifico
ls -la /backup/snapshots/2026-01-20_02-00-00/home/jc/documents/report.pdf
# Restaura-lo
cp /backup/snapshots/2026-01-20_02-00-00/home/jc/documents/report.pdf \
/home/jc/documents/report.pdf
Restaurar um diretorio inteiro
# Restaurar um diretorio completo do ultimo backup
rsync -avh /backup/snapshots/latest/var/www/ /var/www/
Restauracao completa do sistema
# Restaurar o sistema inteiro (de um USB live ou ambiente de resgate)
sudo rsync -aAXvh --delete \
--exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} \
/mnt/backup/system/ /mnt/target/
Restaurar de um backup remoto
# Puxar arquivos do servidor de backup remoto
rsync -avhz -e "ssh -i /root/.ssh/backup_ed25519" \
backupuser@192.168.1.100:/backup/snapshots/latest/var/www/ \
/var/www/
Importante: Sempre faca uma execucao seca com
--dry-run(ou-n) antes de restaurar, especialmente para restauracoes completas do sistema. Isso mostra exatamente o que sera alterado sem modificar nada.
# Execucao seca -- visualizar o que a restauracao faria
rsync -avhn /backup/snapshots/latest/home/ /home/
Verificacao de Integridade do Backup
Backups que voce nao verifica sao backups nos quais nao pode confiar. Agende verificacoes de integridade regulares.
# Comparar origem e backup usando checksums (nao transfere dados)
rsync -avnc /home/ /backup/snapshots/latest/home/
# A flag -c forca comparacao por checksum em vez de tamanho+timestamp
# -n garante que nada seja transferido (execucao seca)
Se a saida nao mostra diferencas, o backup e uma copia exata. Quaisquer discrepancias sao listadas com seus caminhos.
Para verificacao automatizada, adicione uma verificacao ao seu script de backup:
# Verificacao pos-backup
log "Running integrity verification..."
DIFF_COUNT=$(rsync -anc --delete "$SOURCE" "$DEST/" 2>/dev/null | wc -l)
if [ "$DIFF_COUNT" -le 1 ]; then
log "Verification PASSED: backup matches source."
else
log "WARNING: $DIFF_COUNT differences found between source and backup."
fi
Tabela de Referencia de Opcoes do Rsync
| Opcao | Descricao |
|---|---|
-a | Modo arquivo: equivalente a -rlptgoD (recursivo, links, permissoes, tempos, grupo, proprietario, dispositivos) |
-v | Saida detalhada |
-h | Tamanhos de arquivo legiveis por humanos |
-z | Comprimir dados durante a transferencia |
-P | Equivalente a --partial --progress (retomar parciais + mostrar progresso) |
-n | Execucao seca — mostra o que seria transferido sem fazer mudancas |
-c | Usar checksums em vez de tempo de modificacao + tamanho para determinar mudancas |
--delete | Excluir arquivos no destino que nao existem mais na origem |
--delete-after | Excluir apos completar a transferencia (mais seguro que --delete-during) |
--link-dest=DIR | Hard-link arquivos inalterados de DIR (para backups snapshot) |
--exclude=PADRAO | Excluir arquivos correspondentes a PADRAO |
--exclude-from=ARQUIVO | Ler padroes de exclusao de ARQUIVO |
--include=PADRAO | Incluir arquivos correspondentes a PADRAO (sobrepoe exclusao) |
--bwlimit=KBPS | Limitar largura de banda em kilobytes por segundo |
-e "ssh ..." | Especificar shell remoto e suas opcoes |
--numeric-ids | Preservar UID/GID numericos (importante para backups entre maquinas) |
--log-file=ARQUIVO | Escrever log detalhado de transferencia para ARQUIVO |
--partial | Manter arquivos parcialmente transferidos para retomada |
--stats | Imprimir estatisticas de transferencia no final |
--progress | Mostrar progresso de transferencia por arquivo |
--backup | Fazer backups de arquivos sobrescritos/excluidos (com --backup-dir) |
--timeout=SEGUNDOS | Definir timeout de E/S em segundos |
Solucao de Problemas
rsync: connection unexpectedly closed
Isso geralmente indica um problema SSH. Depure com:
# Primeiro testar conectividade SSH
ssh -v backupuser@remote echo "Connection works"
# Executar rsync com saida de depuracao SSH
rsync -avhz -e "ssh -vvv" /source/ user@remote:/backup/
Causas comuns: firewall bloqueando a porta SSH, caminho incorreto da chave SSH, chave SSH com frase secreta mas sem ssh-agent em execucao.
Erros de permissao negada
# Executar rsync como root para backups completos do sistema
sudo rsync -aAXvh /source/ /backup/
# Ou usar --no-owner --no-group se nao precisa preservar propriedade
rsync -avh --no-owner --no-group /source/ /backup/
rsync: —link-dest arg does not exist
Certifique-se de que o caminho --link-dest e absoluto e acessivel:
# Errado: caminho relativo
rsync --link-dest=../latest ...
# Correto: caminho absoluto
rsync --link-dest=/backup/snapshots/latest ...
Backup esta demorando demais
# Identificar o que esta sendo transferido
rsync -avh --progress --stats /source/ /backup/ 2>&1 | tail -20
# Excluir arquivos grandes desnecessarios
rsync -avh --exclude='*.iso' --exclude='*.vmdk' /source/ /backup/
Espaco em disco enchendo no destino
# Verificar uso de espaco por snapshot
du -sh /backup/snapshots/*/
# Remover manualmente snapshots antigos
rm -rf /backup/snapshots/2026-01-01_02-00-00
# Verificar contagem de hard links (contagem alta significa boa deduplicacao)
stat /backup/snapshots/latest/some-file
rsync trava ou para em arquivos grandes
# Definir um timeout para prevenir travamentos indefinidos
rsync -avh --timeout=300 --partial /source/ /backup/
Resumo
Uma estrategia de backup rsync bem projetada fornece protecao de dados confiavel, eficiente em espaco e transparente para seus servidores Linux. Os componentes-chave sao:
- Backups locais para recuperacao rapida de exclusao acidental
- Backups remotos por SSH para recuperacao de desastres
- Backups incrementais estilo snapshot com
--link-destpara versionamento eficiente em espaco - Arquivos de exclusao para pular caches, arquivos temporarios e artefatos de build
- Agendamento automatizado com cron ou timers systemd
- Verificacao regular para garantir integridade do backup
- Procedimentos de restauracao testados — um backup que voce nao testou nao e um backup
Combine esta estrategia de backup rsync com hardening SSH para proteger a camada de transporte, e siga a Lista de Verificacao de Seguranca para Servidores Linux para proteger os servidores em si. Juntas, essas praticas formam uma base solida para administracao de servidores e recuperacao de desastres.