Backup image-level via VADP + CBT, replicação push CBT-based com 10 modos DR, restore cross-hypervisor (vSphere ↔ Hyper-V ↔ Proxmox), e o pacote VDDK runtime RPM com RPATH=$ORIGIN que evita poluir o ld.so do host.
Documento técnico complementar à página do plugin PodHeitor vSphere.
1. Problema: Bacula stock não fala VADP
Bacula Community por design não tem cliente VADP nem CBT. Backup de VMs ESXi via FD stock se reduz a:
- Backup do datastore montado no host FD — captura VMDKs em estado inconsistente, sem snapshot, sem CBT.
- Bacula Enterprise vSphere plugin — existe, mas a preço enterprise e sem replicação DR cross-site nem 10 modos de failover.
- Veeam standalone — paralelo ao Bacula, com ferramentas, RPO, scripting e licenças separadas. Duplica TCO.
O PodHeitor vSphere BRC consolida backup, replicação e conversão cross-hypervisor em um único plugin Bacula, com integração VADP + VDDK 9.0 nativa.
2. Modelo arquitetural
Bacula FD → Rust cdylib plugin (.so) → Rust backend binary (PTCOMM pipe)
↕
vSphere SOAP API (via reqwest)
↕
VDDK 9.0 (FFI — read/write VMDK blocks)
O .so é uma cdylib Rust pura construída a partir do workspace PodHeitor Rust cdylib (crate plugin-vsphere). Implementa o ABI C do plugin Bacula FD via crate bacula-fd-abi reimplementado independentemente — nenhum source tree do Bacula é necessário para build, e nenhum objeto AGPLv3 do Bacula é vinculado ao binário. O .so spawna o backend Rust como subprocesso e usa PTCOMM (status_char + 6-digit length + newline + payload) sobre stdin/stdout.
3. Modos de transporte VADP
A leitura de VMDKs via VADP suporta quatro modos; o plugin os expõe via parâmetro transport:
| Mode | Quando usar | Tradeoff |
|---|---|---|
nbd |
Lab, sem TLS exigido | Texto-claro; fácil debug |
nbdssl (default) |
Produção, sem SAN compartilhada | TLS sobre NBD; CPU overhead aceitável |
hotadd |
FD rodando como VM no mesmo cluster ESXi | Discos da VM-target hot-add no FD-VM; LAN-free |
san |
FD com acesso direto ao SAN/iSCSI da VM | LAN-free puro; máximo throughput |
4. CBT — Changed Block Tracking
VADP CBT é a feature da VMware que permite a um cliente perguntar “que blocos mudaram desde o ChangeId X?”. O plugin a usa em todos os Incrementals/Diferenciais:
- Snapshot consistente da VM (com
quiesce=truedefault — VMware Tools quiesce filesystem). - Query CBT contra o snapshot anterior — retorna lista de extents
{offset, length}. - Lê via VDDK apenas esses extents.
- Stream-a para a PTCOMM com offsets preservados.
- Remove snapshot (com
snapshot_delete_delayopcional para grandes commits).
Parâmetro keep_cbt=true evita reset do estado CBT após backup — útil quando múltiplos jobs Bacula consomem o mesmo CBT em paralelo.
5. Replicação CBT-Push e os 10 modos DR
O plugin implementa replicação push baseada em CBT com daemon receiver persistente do lado DR. O parâmetro mode= seleciona uma de dez operações:
| Mode | Função |
|---|---|
replication-status |
Mostra status e last sync time |
seed |
Replicação full inicial (seed da réplica) |
cbt-push |
Push CBT deltas para a réplica remota |
failover-test |
Boot da réplica em rede isolada (não-destrutivo) |
failover-undo |
Desfaz test failover, power off da réplica |
failover-planned |
Failover graceful: sync → shutdown source → boot replica |
failover-unplanned |
Failover de emergência: boot da réplica imediatamente |
failover-permanent |
Failover permanente: réplica vira produção |
failback |
Replicação reversa do replica de volta ao source |
reprotect |
Re-estabelece replicação após failback |
Todo o workflow Veeam SRM-style (test → planned → reprotect) está disponível como modos do plugin, dirigíveis pelo Bacula Director sem produto extra.
5.1 Network mapping e Re-IP
| Parâmetro | Formato | Função |
|---|---|---|
net_map |
"source_net=target_net" |
Reconfigura NICs da réplica no failover |
reip |
"nic:ip/prefix:gw:dns1,dns2" |
Reconfigura IP guest da réplica no failover |
storage_map |
"source_ds=target_ds" |
Mapeamento de datastore |
test_failover_network |
nome de rede | Rede isolada para test failover (não polui produção) |
5.2 TLS para canal DR
Suporta dr_tls_cert + dr_tls_key (PEM) com rustls; dr_tls_insecure=true aceita self-signed (apenas para lab). PSK token via dr_auth_token obrigatório em todos os modos.
6. VDDK runtime RPM — por que é importante
VDDK é distribuído pela VMware como tarball com libcrypto.so.3/libssl.so.3/libcurl.so.4 bundled. Instalações antigas escreviam /etc/ld.so.conf.d/vmware-vddk.conf apontando para esses libs — fazendo todo processo no host (incluindo rpm, dnf, flatpak) carregar o libcrypto da VMware em vez do system OpenSSL. Sintoma típico:
flatpak: /usr/lib/vmware-vix-disklib/lib64/libcrypto.so.3:
version `OPENSSL_3.4.0' not found (required by /lib64/librpmio.so.9)
O podheitor-vixdisklib-runtime-9.0.1-1.el9.x86_64.rpm resolve isso em build time: cada .so em /usr/lib/vmware-vix-disklib/lib64 é patcheado com RPATH=$ORIGIN, então VDDK resolve seus siblings do próprio diretório sem poluir o ld.so do host. O scriptlet %post remove qualquer /etc/ld.so.conf.d/vmware-vddk*.conf, vixlib*.conf ou flatpack*.conf stale e re-executa ldconfig.
Recovery sem internet (host já quebrado por instalação legacy):
sudo rm -f /etc/ld.so.conf.d/vmware-vddk.conf
/etc/ld.so.conf.d/vmware-vix-disklib.conf
/etc/ld.so.conf.d/*vixlib*.conf
/etc/ld.so.conf.d/*flatpack*.conf
sudo ldconfig
sudo rpm -Uvh releases/podheitor-vixdisklib-runtime-9.0.1-1.el9.x86_64.rpm
7. Cross-restore (vSphere ↔ Hyper-V ↔ Proxmox)
O plugin participa de duas pernas do triângulo cross-hypervisor:
- Como source: backups VMware podem ser restaurados em Hyper-V ou Proxmox via os plugins-irmãos PodHeitor Hyper-V / PodHeitor Proxmox.
- Como target: backups Hyper-V/Proxmox podem ser restaurados em vSphere via este plugin (com conversão VHDX → VMDK e qcow2 → VMDK).
8. Compatibilidade
| Componente | Versões suportadas |
|---|---|
| VMware ESXi | 7.0, 8.0, 8.0U3 |
| VMware vCenter | 7.0, 8.0 |
| VDDK | 8.0.x, 9.0.x |
| Bacula Community | 15.0.x |
| OS (FD server) | Oracle Linux 9, RHEL 9, Rocky 9, AlmaLinux 9 |
| Arquitetura | x86_64 |
9. Validação em laboratório
- ESXi 8.0U3e standalone host, VDDK 9.0.1 em Oracle Linux 9.5, Bacula Community 15.0.3.
- 4 VMs com CBT habilitado (Alpine, TinyCore, CirrOS, multi-disk).
- 12/12 testes de replicação PASSED (abril 2026).
- v1.4.1: lab job 6442 restaurou 2,147 GB / 4 arquivos em 6s, 0 erros FD; VM Alpine 3.21 restaurada bootou clean.
10. Anti-patterns documentados
- Não deixe
dr_tls_insecure=trueem produção. Aceita self-signed certs do canal DR — útil em lab; risco de MITM em prod. - Não use
force_san=truesem zoneamento SAN correto. O FD precisa enxergar os LUNs da VM target diretamente; misconfiguration causa I/O errors confusos. - Não rode
quiesce=falseem VMs com DBs. Snapshot crash-consistent → DBs precisam recovery no boot da réplica/restore.
11. License posture
Plugin sob LicenseRef-PodHeitor-Proprietary. Desde v1.4.0, o .so é cdylib Rust pura — nenhum source AGPLv3 do Bacula é vinculado estaticamente. Releases anteriores linkavam objetos pluginlib/metaplugin C++ do Bacula tree — não mais o caso. Bindings via crate clean-room bacula-fd-abi.
Pronto para avaliar?
Trial gratuito de 30 dias para frotas vSphere em produção. Garantimos no mínimo 50% de desconto vs Bacula Enterprise, Veeam ou Commvault, com 10 modos DR e restore cross-hypervisor inclusos.
Heitor Faria — Fundador, PodHeitor International
✉ [email protected]
☎ +1 (789) 726-1749 · +55 (61) 98268-4220 (WhatsApp)
🔗 Página do plugin PodHeitor vSphere
Disponível em:
Português
English (Inglês)
Español (Espanhol)