Sincronização Automática de Dados e Limpeza de Armazenamento no Raspberry Pi

Ao utilizar dispositivos de armazenamento limitados, como pendrives ou cartões SD, em um NAS baseado em Raspberry Pi, é comum enfrentar o esgotamento rápido de espaço, especialmente ao lidar com gravações de câmeras de segurança. Para resolver esse problema, é necessário implementar uma rotina que sincronize os arquivos para um armazenamento em nuvem (como o Alibaba Cloud Drive, via montagem de sistema de arquivos) e remova os registros locais mais antigos para liberar espaço.

Desenvolvimento do Script de Automação

Abaixo, apresentamos um script em Shell projetado para automatizar esse ciclo. Ele realiza uma limpeza baseada em limites de uso de disco e utiliza o rsync para garantir que apenas arquivos novos ou alterados sejam enviadso para a nuvem.

Crie o arquivo no caminho /opt/nas_sync_manager.sh:

#!/bin/bash

# =================================================================
# Script de Gestão de Armazenamento e Sincronização Cloud
# Funcionalidade: Limpeza por limite de disco + Sincronização rsync
# =================================================================

# --- Configurações Principais ---
DIRETORIO_LOCAL="/srv/dev-disk-by-uuid-xxxxx/camera_records"
DIRETORIO_REMOTO="/mnt/cloud_drive/backup_cams"
ARQUIVO_LOG="/var/log/nas_sync_manager.log"

# Limites de ocupação do disco (em porcentagem)
GATILHO_LIMPEZA=75     # Inicia exclusão ao atingir 75%
ALVO_ESPACO_LIVRE=45   # Para de excluir ao baixar para 45%

# Configurações de Rede
IP_TESTE="8.8.8.8"
TIMEOUT_REDE=5

# --- Função de Log ---
log_msg() {
    echo "[$(date '+%d/%m/%Y %H:%M:%S')] $1" | tee -a "$ARQUIVO_LOG"
}

# --- Validação de Conectividade ---
verificar_internet() {
    if ping -c 1 -W $TIMEOUT_REDE $IP_TESTE >/dev/null 2>&1; then
        return 0
    fi
    log_msg "ERRO: Sem conexão com a internet."
    return 1
}

# --- Gestão de Espaço em Disco ---
gerenciar_espaco_local() {
    local ponto_montagem
    ponto_montagem=$(df "$DIRETORIO_LOCAL" | tail -1 | awk '{print $6}')
    
    local uso_atual
    uso_atual=$(df "$ponto_montagem" | tail -1 | awk '{print $5}' | tr -d '%')

    log_msg "INFO: Uso de disco atual em $ponto_montagem: ${uso_atual}%"

    if [ "$uso_atual" -gt "$GATILHO_LIMPEZA" ]; then
        log_msg "AVISO: Limite de $GATILHO_LIMPEZA% excedido. Iniciando limpeza de arquivos .mp4 antigos..."

        # Remove arquivos mais antigos um por um até atingir o alvo
        find "$DIRETORIO_LOCAL" -type f -name "*.mp4" -printf '%T+ %p\n' | sort | cut -d' ' -f2- | while read -r arquivo; do
            rm -f "$arquivo"
            log_msg "REMOVIDO: $(basename "$arquivo")"

            uso_atual=$(df "$ponto_montagem" | tail -1 | awk '{print $5}' | tr -d '%')
            if [ "$uso_atual" -le "$ALVO_ESPACO_LIVRE" ]; then
                log_msg "INFO: Espaço liberado para ${uso_atual}%. Limpeza concluída."
                break
            fi
        done
    else
        log_msg "INFO: Espaço em disco dentro dos parâmetros normais."
    fi
}

# --- Execução da Sincronização ---
executar_sync() {
    if [ ! -d "$DIRETORIO_LOCAL" ] || [ ! -d "$DIRETORIO_REMOTO" ]; then
        log_msg "ERRO: Diretórios de origem ou destino não encontrados."
        return 1
    fi

    log_msg "INFO: Iniciando transferência de arquivos para a nuvem..."
    
    # rsync configurado para comparar apenas tamanho, ignorando timestamp 
    # (importante para drives de nuvem que não permitem alterar data de modificação)
    rsync -av --size-only --include='*.mp4' --exclude='*' "$DIRETORIO_LOCAL/" "$DIRETORIO_REMOTO/" >> "$ARQUIVO_LOG" 2>&1
    
    if [ $? -eq 0 ]; then
        log_msg "SUCESSO: Sincronização finalizada com êxito."
    else
        log_msg "ERRO: Falha detectada durante o rsync."
    fi
}

# --- Fluxo Principal ---
main() {
    log_msg "----------------------------------------------------"
    log_msg "Iniciando rotina de manutenção NAS"
    
    gerenciar_espaco_local
    
    if verificar_internet; then
        executar_sync
    fi
    
    log_msg "Rotina finalizada."
}

# Garante que o diretório de log exista
mkdir -p "$(dirname "$ARQUIVO_LOG")"
main "$@"

Agendamento da Tarefa

Para garantir que o Raspberry Pi execute essa rotina automaticamente, utilizamos o cron. No exemplo abaixo, o script será executado a cada hora.

Abra o editor do crontab:

crontab -e

Adicione a seguinte linha ao final do arquivo:

0 * * * * /bin/bash /opt/nas_sync_manager.sh

Monitoramento da Execução

É possível acompanhar o status do processo e verificar se os arquivos estão sendo transferidos corretamente inspecionando o arquivo de log gerado pelo script:

tail -f /var/log/nas_sync_manager.log

O output esperado deve detalhar o uso do disco no momento da execução, as ações de limpeza tomadas (se houver) e as estatísticas do rsync referentes aos arquivos transferidos para o armazenamento remoto.

Tags: Raspberry Pi NAS Shell Script rsync Linux

Publicado em 7-24 21:14