Whitepaper técnico — PodHeitor Granular Restore para Bacula

Suite SD-side en Rust que entrega tres capacidades sobre un único core: restore granular file-level, Instant Recovery block-level (NBD/iSCSI/NFS-Datastore/SMB-VHDX), y cross-hypervisor V2V (Hyper-V↔Proxmox↔ESXi↔CloudStack↔Nutanix). Reemplaza el Single Item Restore (SIR) de Bacula Enterprise 18.2 con paridad técnica + diferenciales cross-hypervisor que SIR no cubre.

Documento técnico complementario a la página del plugin PodHeitor Granular Restore.

1. El problema: SIR de Bacula Enterprise es vSphere-céntrico

Ingeniería inversa del RPM bacula-enterprise-single-item-restore-18.2.3-26020419.el9.x86_64.rpm mostró:

  • SIR usa parsers C++ propios (vmbackend, bacula-fused) — no libguestfs.
  • Instant Recovery existe solo para vSphere (export NFS Datastore vía vsphere-ctl --ir-mode).
  • IR para Hyper-V no existe. IR para Proxmox/KVM/CloudStack/Nutanix no existe.
  • Cross-hypervisor V2V no existe — backup Hyper-V solo restaura en Hyper-V.
  • Modo JSON de mount-vm serializa formato propietario frágil.
  • Cache local en working/mount-cache — staging no es cero.

Para clientes multi-hypervisor (típico de hosting providers y MSPs), las lagunas son bloqueantes. PHGR cierra las cuatro: IR Hyper-V, IR Proxmox/KVM, IR Nutanix/CloudStack, y V2V cross-hypervisor.

2. Arquitectura — workspace cargo, tres binarios, un core

ADR-001: todo en un único cargo workspace con tres binarios (phgrd, phird, phgr-cli) compartiendo un crate de núcleo (phgr-core). No es «todo en el mismo binario» — es «una codebase, varios deliverables operacionales que pueden instalarse independientemente».

Crate Type Función
phgr-core lib Catálogo, volume reader, delta/CBT, disk adapter, FS, exporters, V2V, sessions, audit
phgrd bin Daemon GR (FUSE/SMB/NFS export)
phird bin Daemon IR (NBD/iSCSI/NFS-Datastore + hypervisor drivers)
phgr-cli bin CLI interactiva + scripted (mount, ir, v2v, diff, verify)
phgr-api bin gRPC + REST gateway con OpenAPI
phgr-tests lib E2E test harness + lab fixtures

3. Granular Restore — file-level sin staging

El daemon phgrd monta volúmenes Bacula como filesystem FUSE, parsea VHDX/VHD/VMDK/qcow2/raw/VDI, monta particiones NTFS/ext2/3/4/xfs/btrfs/ReFS/FAT/exFAT/ZFS, y expone archivos vía:

  • FUSE local — mount en /mnt/phgr/<jobid>/<disk-N>/
  • SMB — share dinámico vía Samba bacula.d/ include
  • NFS — export dinámico vía /etc/exports.d/

El reader de volumen Bacula es Rust puro (ADR-005) — no linka libbacsd. En v1.0, fallback a bextract orquestado cuando el reader Rust no cubre algún encoding. Footprint en /opt/bacula/working: ≤ 2 GB para un VHDX de 200 GB (lazy reads + small LRU cache, vs SIR que cachea completo).

4. Instant Recovery — boot de VM en ≤ 60s

El daemon phird expone la imagen reconstruida como block target para que un hipervisor inicie la VM inmediatamente. Cuatro caminos:

Hypervisor Block Camino
Proxmox / KVM NBD directo qm importdisk vía nbd:// URL
VMware ESXi NFS Datastore Mount NFS export como datastore + register VM
Hyper-V iSCSI bridge iSCSI Target Linux → Hyper-V iSCSI initiator → New-VM con VHDX iSCSI
Nutanix / CloudStack iSCSI VG attach VG temporario → attach VM → boot

Las escrituras durante IR caen en un overlay COW separado (qcow2 backing file). La migración viva al storage definitivo corre en background (Storage vMotion / qm move-disk / equivalente) — el usuario no percibe transición. RTO observado: ≤ 60s p95 wall-clock entre operador clickeando «Recover» y boot de VM.

5. Cross-hypervisor V2V

phgr-cli v2v convierte formato de disco y emite config nativa del hipervisor destino:

Source → Target Conversión de disco Config emitido
Hyper-V → Proxmox vhdx → qcow2 qm create + qm set
VMware → Proxmox vmdk → qcow2 qm create
Proxmox → Hyper-V qcow2 → vhdx VMCX XML
VMware → Hyper-V vmdk → vhdx VMCX XML
Hyper-V → VMware vhdx → vmdk VMX
Proxmox → VMware qcow2 → vmdk VMX

Conversión usa qemu-img convert en streaming. Drivers virtio se inyectan vía virt-customize cuando el target lo requiere (Linux guest yendo de Hyper-V a KVM).

6. Diferenciales vs SIR de Bacula Enterprise

Capacidad Enterprise SIR 18.2 PHGR v1.x
GR Hyper-V/VMware/Xen/KVM Sí — paridad
GR Proxmox / CloudStack / Nutanix Namespace existe, soporte real escaso Sí — diferencial
IR vSphere Sí — paridad
IR Hyper-V No Sí — iSCSI bridge
IR Proxmox / KVM No Sí — NBD directo
IR Nutanix / CloudStack No Sí — iSCSI VG
Cross-hypervisor V2V No
Zero-staging Cache local ≥ 2 GB FUSE directo, ≤ 2 GB / 200 GB VHDX
Paralelismo C++ sync Rust async + tokio + io_uring cuando disponible
API Formato propietario gRPC + REST con OpenAPI
Diff entre dos jobs No Sí — auditoría, DR remoto economía
Auto-malware scan opcional No clamav/yara opt-in

7. Audit log firmado (compliance)

Toda sesión de restore genera un trail HMAC-encadenado: cada entrada incluye hash de la entrada anterior, asegurando que el tampering es detectable. Cubre requirements LGPD / GDPR / PCI de evidencia forense de quién accedió a qué datos.

8. Targets de throughput

Métrica Target
Restore granular en volumen rápido (NVMe) ≥ 250 MB/s
Sesiones simultáneas sin degradación > 30% ≥ 4
Inicio de IR (p95 wall-clock) ≤ 60s
Footprint en /opt/bacula/working ≤ 2 GB para VHDX 200 GB
Familias de FS soportadas 8 (NTFS, ext2/3/4, xfs, btrfs, ReFS, FAT, exFAT, ZFS)

9. Anti-patterns documentados

  • No corra phird en IR sin overlay COW configurado. Las escrituras durante IR van al image base y corrompen el backup punto-en-tiempo.
  • No exponga shares SMB de phgrd públicamente. El Samba bacula.d/ include es para LAN — sin TLS, sin Kerberos hardened. Use SMB sobre VPN.
  • No confíe en el namespace de Enterprise SIR para identificar source. Backups con nombres @HYPERV-WINAPI, @vsphere etc son pistas, pero el parser PHGR valida por magic number del disk format, no por path.
  • No olvide cleanup de ZFS dataset cuando el working dir es ZFS. Las sesiones usan clones; cleanup automático vía Drop del SessionGuard, pero force-kill del daemon deja clones huérfanos.

10. License posture

PHGR es AGPLv3 con dual-licensing comercial disponible. A diferencia de los plugins de FD (que deben evitar AGPL transitive porque corren dentro de bacula-fd), PHGR es una suite SD-side independiente — no vincula contra el source de Bacula en ningún punto. La lectura de volúmenes es vía formato documentado en Rust puro, sin libbacsd.

¿Listo para evaluar?

Trial gratuito de 30 días para clientes multi-hypervisor que necesitan Instant Recovery en Hyper-V/Proxmox/KVM/Nutanix/CloudStack o cross-hypervisor V2V. Garantizamos al menos 50% de descuento vs Bacula Enterprise SIR o Veeam Instant VM Recovery, con cross-hypervisor IR y V2V que ninguno de los dos ofrece.

Heitor Faria — Fundador, PodHeitor International
[email protected]
☎ +1 (789) 726-1749 · +55 (61) 98268-4220 (WhatsApp)
🔗 Página del plugin PodHeitor Granular Restore

Disponível em: pt-brPortuguês (Portugués, Brasil)enEnglish (Inglés)esEspañol

Deja una respuesta