ESTRATEGIA DE BACKUP COM RSYNC Servidor Origem /var/www /etc /home Dados de Producao rsync Criptografado SSH Snapshot N Visao completa --link-dest Snapshot N-1 Hard links inodes compartilhados Servidor Backup /backup/daily.0 /backup/daily.1 /backup/daily.2 Retencao: 30 dias Automatizacao cron @ 02:00 Rotacao de logs Alertas por email Monitoramento Backups incrementais estilo snapshot com agendamento automatizado

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?

  1. 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.
  2. Simplicidade: rsync e um unico comando com opcoes bem documentadas. Sem formato proprietario, sem banco de dados de deduplicacao para corromper.
  3. 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.
  4. Universalidade: rsync esta disponivel em toda distribuicao Linux, macOS e ate Windows (via WSL ou Cygwin). Ja vem instalado na maioria dos servidores.
  5. 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

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:

  1. rsync compara cada arquivo de origem com o arquivo correspondente no diretorio --link-dest
  2. Se um arquivo nao mudou, rsync cria um hard link (zero espaco adicional)
  3. Se um arquivo mudou ou e novo, rsync o copia normalmente
  4. 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:

DiaTamanho AparenteUso Real de Disco
Dia 1 (completo)100 GB100 GB
Dia 2100 GB~1 GB (apenas dados novos)
Dia 3100 GB~1 GB
30 dias total3.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 -z do 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

OpcaoDescricao
-aModo arquivo: equivalente a -rlptgoD (recursivo, links, permissoes, tempos, grupo, proprietario, dispositivos)
-vSaida detalhada
-hTamanhos de arquivo legiveis por humanos
-zComprimir dados durante a transferencia
-PEquivalente a --partial --progress (retomar parciais + mostrar progresso)
-nExecucao seca — mostra o que seria transferido sem fazer mudancas
-cUsar checksums em vez de tempo de modificacao + tamanho para determinar mudancas
--deleteExcluir arquivos no destino que nao existem mais na origem
--delete-afterExcluir apos completar a transferencia (mais seguro que --delete-during)
--link-dest=DIRHard-link arquivos inalterados de DIR (para backups snapshot)
--exclude=PADRAOExcluir arquivos correspondentes a PADRAO
--exclude-from=ARQUIVOLer padroes de exclusao de ARQUIVO
--include=PADRAOIncluir arquivos correspondentes a PADRAO (sobrepoe exclusao)
--bwlimit=KBPSLimitar largura de banda em kilobytes por segundo
-e "ssh ..."Especificar shell remoto e suas opcoes
--numeric-idsPreservar UID/GID numericos (importante para backups entre maquinas)
--log-file=ARQUIVOEscrever log detalhado de transferencia para ARQUIVO
--partialManter arquivos parcialmente transferidos para retomada
--statsImprimir estatisticas de transferencia no final
--progressMostrar progresso de transferencia por arquivo
--backupFazer backups de arquivos sobrescritos/excluidos (com --backup-dir)
--timeout=SEGUNDOSDefinir 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/

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-dest para 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.