A configuração de **dedup paralela bacula** (Deduplicação Global) permite otimizar drasticamente o armazenamento e a velocidade dos seus backups corporativos.
Este guia técnico detalha o procedimento para construção de um ambiente de deduplicação paralelo e isolado (Side-by-Side) no Bacula Enterprise. O objetivo é permitir a migração segura dos dados sem impactar o ambiente legado.Para mais informações, consulte a documentação oficial Bacula.
🎯 O que Você Vai Conseguir
- ✅ Migração sem downtime: Ambiente antigo e novo rodando lado a lado
- ✅ Rollback seguro: Se algo der errado, volta para o legado em segundos
- ✅ Testes em produção: Valide o novo storage com Jobs reais antes de migrar tudo
⚠️ Riscos e Cuidados
- 🚨 Media Type duplicado: Se usar o mesmo Media Type do legado, o Bacula vai tentar montar Volumes errados (pode corromper dados)
- ⚠️ Espaço em disco: Você precisará de espaço para ambos os ambientes durante a migração
📋 Checklist Pré-Migração
Antes de começar, confirme:
- ✅ Backup do catálogo atual (
make_catalog_backup.pl) - ✅ Espaço em disco suficiente em
/backupe/index - ✅ Janela de manutenção agendada (para restart do Storage Daemon)
- ✅ Documentação da estrutura atual (pools, jobs, schedules)
🏗️ 1. Definição de Nomenclatura
Esta tabela define o padrão “De/Para” utilizado em todo o projeto. O isolamento é garantido pelo uso de diretórios e Media Types exclusivos.| Componente | Configuração ANTIGA (Legado) | Configuração NOVA (Produção) |
|---|---|---|
| Diretórios (Linux) | /backup | /index | /backup/dedup_novo | /index/dedup_novo |
| Dedup Engine | Dedup2 | DedupEngine_NOVO |
| Devices (Storage Daemon) | Dedup01-01, -02… | Device_Dedup_NOVO_01 Device_Dedup_NOVO_02 Device_Dedup_NOVO_03 |
| Media Type | dedup1 | DedupType_NOVO ⚠️ CRÍTICO: Deve ser único |
| Autochanger | Dedup01 | Dedup_Autochanger_NOVO |
| Storage (Director) | Dedup01 | Storage_Dedup_NOVO |
| Pools | DiskBackup365d, etc. | DiskBackup365d_NOVO (Sufixo _NOVO) |
📦 Passo 1: Preparação Física (Linux)
⚠️ ATENÇÃO: A parada do serviço Storage Daemon é obrigatória. Criar pastas com o serviço rodando pode causar problemas de permissão ou travamento de processos filhos.
Acesse o servidor via SSH como root e execute:# 1. Parar o serviço para segurança
systemctl stop bacula-sd
# 2. Criar a estrutura de diretórios isolada
mkdir -p /backup/dedup_novo
mkdir -p /index/dedup_novo
# 3. Aplicar permissões (Usuário do Bacula deve ser dono)
chown -R bacula:tape /backup/dedup_novo /index/dedup_novo
chmod 775 /backup/dedup_novo /index/dedup_novo
# 4. Verificar se foi criado corretamente
ls -ld /backup/dedup_novo /index/dedup_novo🔧 Passo 2: Configuração no BWeb (Storage Daemon)
Nesta etapa, criamos os “Hardwares Virtuais” no arquivobacula-sd.conf.Caminho: Configuration » Storage Daemon (bacula01-sd)A) Criar o Dedup Engine (Motor)
- Vá na aba Dedupengines.
- Selecione o motor existente (ex:
Dedup2) e clique em Copy. - Edite os campos fundamentais:
- Name:
DedupEngine_NOVO - Dedup Directory:
/backup/dedup_novo - Dedup Index Directory:
/index/dedup_novo
- Name:
- Clique em Save.
B) Criar os Devices (Múltiplos Dispositivos)
Criamos múltiplos devices para permitir concorrência (vários jobs rodando ao mesmo tempo).- Vá na aba Devices.
- Selecione um device existente (ex:
Dedup01-01) e clique em Copy. - Edite o Primeiro Device:
- Name:
Device_Dedup_NOVO_01 - Media Type:
DedupType_NOVO⚠️ OBRIGATÓRIO MUDAR - Archive Device:
/backup/dedup_novo - Dedup Engine: Selecione
DedupEngine_NOVO
- Name:
- Clique em Save.
- Repita o processo (Copy/Paste) para criar:
Device_Dedup_NOVO_02Device_Dedup_NOVO_03
C) Criar o Autochanger (Robô)
- Vá na aba Autochangers.
- Selecione o autochanger existente e clique em Copy.
- Edite:
- Name:
Dedup_Autochanger_NOVO - Devices:
- Na lista da direita (“Selected”), remova os devices antigos.
- Adicione TODOS os novos devices (_01, _02, _03).
- Name:
- Clique em Save.
⚙️ Passo 3: Configuração no BWeb (Director)
Nesta etapa, criamos a lógica de controle no arquivobacula-dir.conf.Caminho: Configuration » Director » StorageA) Criar o Storage (O Ponteiro)
- Vá na aba Storage.
- Use a função Copy no Storage antigo.
- Edite os campos com atenção especial (pois os nomes novos ainda não aparecem nas listas):
- Storage Name:
Storage_Dedup_NOVO - Device:
Dedup_Autochanger_NOVO(Digite manualmente, idêntico ao Passo 2C). - Media Type:
DedupType_NOVO(Digite manualmente). - Autochanger: Marque a opção Yes.
- Storage Name:
- Clique em Save.
B) Criar as Pools (Espelhamento de Produção)
Devemos criar uma versão “NOVA” para cada Pool que existe hoje e usa deduplicação.- Vá na aba Pools.
- Para cada Pool (ex:
DiskBackup365d,Poll_DB_30_dias):- Selecione e clique em Copy.
- Name: Adicione o sufixo
_NOVO(ex:DiskBackup365d_NOVO). - Storage: Selecione
Storage_Dedup_NOVO. - Label Format: Altere para
VolNovo-(Facilita auditoria visual). - Salve.
✅ Passo 4: Finalização e Validação
1. Aplicar Configurações
- No BWeb: Commit / Write Configuration.
- No BWeb: Reload Director.
- No Terminal:
systemctl restart bacula-sd
2. Comandos de Validação (Terminal)
# Verifica se o Director aponta para o Autochanger correto
grep -r "Device" /opt/bacula/etc/ | grep "Storage_Dedup_NOVO"
# Saída Esperada: Device = "Dedup_Autochanger_NOVO"
# Verifica se o Motor de Dedup subiu e está "ouvindo"
echo "dedup usage storage=Storage_Dedup_NOVO" | bconsole
# Saída Esperada: Status do DedupEngine_NOVO com data/hora atual.🚀 Passo 5: Automação da Migração (Script Definitivo)
Este script realiza a migração em massa, alterando Jobs, JobDefs e Schedules. Ele suporta mapeamento de múltiplas pools e regras de agendamento (FullPool/IncPool).Script: migrar_producao.sh
Copie o código abaixo, salve no servidor, dê permissão de execução (chmod +x) e execute.#!/usr/bin/env bash
set -euo pipefail
# ==============================================================================
# 1. CONFIGURAÇÃO
# ==============================================================================
DIR_BASE="/opt/bacula/etc/conf.d/Director/bacula01-dir"
STORAGE_ANTIGO="Dedup01"
STORAGE_NOVO="Storage_Dedup_NOVO"
POOL_MAP=(
"CatalogBackup14d:CatalogBackup14d_NOVO"
"Poll_DB_30_dias:Poll_DB_30_dias_NOVO"
"Poll_VM-PROX_30_dias:Poll_VM-PROX_30_dias_NOVO"
"Poll_VM-ESXI_90_dias:Poll_VM-ESXI_90_dias_NOVO"
"Poll_VM-PROX_90_dias:Poll_VM-PROX_90_dias_NOVO"
"DiskBackup365d:DiskBackup365d_NOVO"
"DiskBackup5anos:DiskBackup5anos_NOVO"
)
# 1 = SIMULAÇÃO | 0 = APLICAR
DRY_RUN=1
# ==============================================================================
# 2. MOTOR DE MIGRAÇÃO (REGEX CORRIGIDO PARA ASPAS)
# ==============================================================================
TARGET_DIRS=("$DIR_BASE/Job" "$DIR_BASE/JobDefs" "$DIR_BASE/Schedule")
backup_file() {
local f="$1"
local bkp="${f}.bkp_migracao"
if [[ -e "$bkp" ]]; then
local n=1
while [[ -e "${bkp}.${n}" ]]; do n=$((n+1)); done
bkp="${bkp}.${n}"
fi
cp -a -- "$f" "$bkp"
}
apply_perl() {
local f="$1"
shift
if [[ "$DRY_RUN" -eq 1 ]]; then
echo " [SIMULACAO] Alteraria: $(basename "$f")"
else
backup_file "$f"
perl -0777 -i -pe "$@" -- "$f"
echo " [APLICADO] Atualizado: $(basename "$f")"
fi
}
echo "=== MIGRAÇÃO FINAL (IDEMPOTENTE + FIX ASPAS) ==="
echo "Proteção ativa: Ignora pools já migradas."
PERL_RULES=()
# 1. Storage (Corrigido escape para o bash)
PERL_RULES+=("s/(bStorages*=s*)"?Q$STORAGE_ANTIGOEb"?/${1}"$STORAGE_NOVO"/mg;")
# 2. Pools
for map in "${POOL_MAP[@]}"; do
OLD="${map%%:*}"
NEW="${map##*:}"
# AQUI ESTÁ A CORREÇÃO: b antes de "?
# Isso garante que ele consome a aspa original, evitando duplicidade
# Regras Genéricas
PERL_RULES+=("s/(bPools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;")
PERL_RULES+=("s/(bFullPools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;")
PERL_RULES+=("s/(bIncrementalPools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;")
PERL_RULES+=("s/(bDifferentialPools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;")
PERL_RULES+=("s/(bNexts*Pools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;")
# Regras Verbose
PERL_RULES+=("s/(^s*Fulls+Backups+Pools*=s*)"?Q$OLDEb"?/${1}"$NEW"/mg;")
PERL_RULES+=("s/(^s*Differentials+Backups+Pools*=s*)"?Q$OLDEb"?/${1}"$NEW"/mg;")
PERL_RULES+=("s/(^s*Incrementals+Backups+Pools*=s*)"?Q$OLDEb"?/${1}"$NEW"/mg;")
done
FILES=()
for d in "${TARGET_DIRS[@]}"; do
if [[ -d "$d" ]]; then
while IFS= read -r -d '' f; do FILES+=("$f"); done < <(find "$d" -maxdepth 1 -type f -name "*.cfg" -print0)
fi
done
CHANGED=0
for f in "${FILES[@]}"; do
if [ -f "$f" ]; then
before="$(cat -- "$f")"
after="$(perl -0777 -pe "$(printf '%s' "${PERL_RULES[@]}")" -- "$f")"
if [[ "$before" != "$after" ]]; then
CHANGED=$((CHANGED+1))
if [[ "$DRY_RUN" -eq 1 ]]; then
echo " >>> MUDANÇA NECESSÁRIA EM: $(basename "$f") <<<"
# Deve mostrar apenas uma aspa no final agora
diff <(echo "$before") <(echo "$after") | grep ">" || true
echo " -----------------------------------------"
fi
apply_perl "$f" "$(printf '%s' "${PERL_RULES[@]}")"
fi
fi
done
echo "--------------------------------------------------------"
if [[ "$DRY_RUN" -eq 1 ]]; then
echo "FIM DA SIMULAÇÃO."
if [[ "$CHANGED" -gt 0 ]]; then
echo "✅ Verifique se as aspas estão corretas (apenas uma)."
echo " Se sim, mude DRY_RUN=0 e execute."
else
echo "✅ Tudo pronto! Nenhuma alteração pendente."
fi
else
echo "SUCESSO: $CHANGED arquivos atualizados."
echo "Execute 'reload' no bconsole."
fi📊 Como Executar o Script
# 1. Salvar o script
nano migrar_producao.sh
# Cole o conteúdo acima
# 2. Dar permissão de execução
chmod +x migrar_producao.sh
# 3. Executar em modo SIMULAÇÃO (DRY_RUN=1)
./migrar_producao.sh
# 4. Se tudo estiver correto, editar e mudar DRY_RUN=0
nano migrar_producao.sh # Alterar linha: DRY_RUN=0
# 5. Aplicar as mudanças
./migrar_producao.sh
# 6. Recarregar o Director
echo "reload" | bconsole⚠️ Pontos Críticos de Atenção
- Media Type deve ser único: Nunca use o mesmo Media Type do ambiente antigo.
- Sempre faça backup antes: O script cria backups automáticos, mas valide manualmente.
- Execute em modo simulação primeiro:
DRY_RUN=1evita mudanças acidentais. - Valide as aspas: O script corrige aspas duplicadas, mas sempre confira a saída.
❓ FAQ
Posso rodar o ambiente antigo e novo simultaneamente?
Sim! Esse é o objetivo do setup Side-by-Side. Você migra Jobs gradualmente enquanto o legado continua funcionando.O que acontece se eu usar o mesmo Media Type?
O Bacula vai tentar usar Volumes do ambiente antigo, causando erros de montagem e possivelmente corrupção de dados.Preciso parar todos os Jobs para aplicar?
Não. Após criar a estrutura nova, você migra Jobs individualmente. O ambiente antigo continua operacional.📚 Veja Também (Tutoriais Bacula Enterprise)
- Como Restaurar Backup de Job Prunado (bscan e bextract)
- Erro “Unsupported Proxmox version” – Solução Completa
- Configurar Deduplicação Paralela (Side-by-Side)
- Migração Completa para Oracle Cloud (OCI)
- 10 Devices Paralelos para 50 Jobs Simultâneos
🔗 Recursos Relacionados
Última atualização: Janeiro de 2026 | Testado no Bacula Enterprise 18.2.1
🎓 Continue Aprendendo com Nossos Simulados
Simulados gratuitos para AWS, Linux, CompTIA e Microsoft Azure





Deixe uma resposta
Ver comentários