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-vmserializa 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í | Sí — paridad |
| GR Proxmox / CloudStack / Nutanix | Namespace existe, soporte real escaso | Sí — diferencial |
| IR vSphere | Sí | 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 | Sí |
| 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
phirden 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
phgrdpúblicamente. El Sambabacula.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,@vsphereetc 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:
Português (Portugués, Brasil)
English (Inglés)
Español