Acceso directo a VHDX sin Export-VM, change tracking vía RCT (Resilient Change Tracking), replicación RCT-Push near-CDP, conversión cross-hypervisor (vSphere/Proxmox → Hyper-V) y arquitectura multi-adapter.
Documento técnico complementario a la página del plugin PodHeitor Hyper-V.
1. Problema: backup de Hyper-V sin plugin es caro o frágil
Las VMs Hyper-V en producción presentan tres problemas fundamentales para Bacula stock:
- VHDX bloqueado mientras la VM corre — la lectura directa del archivo es imposible sin production checkpoint. Bacula stock no lo sabe.
- Export-VM duplica el storage — exigir un
Export-VMantes del backup duplica la flota en disco y no escala. - Sin change tracking nativo en Bacula — todo «incremental» degrada a re-leer el VHDX completo. 2 GB modificados en 100 GB de disco se vuelven 100 GB transferidos.
El PodHeitor Hyper-V Plugin ataca los tres problemas con lectura in-place del VHDX (cero staging adicional), RCT block-level vía WMI, y replicación delta near-CDP a sitios secundarios.
2. Modelo arquitectural
El plugin usa el patrón PodHeitor de cdylib + backend standalone, con PTCOMM en stdin/stdout. En Windows el cdylib es una DLL (podheitor-hyperv-fd.dll) cargada por bacula-fd, y el backend es podheitor-hyperv-backend.exe.
Bacula FD (Windows)
└─ podheitor-hyperv-fd.dll (metaplugin adapter)
│ PTCOMM (stdin/stdout)
▼
podheitor-hyperv-backend.exe (Rust)
├─ Get-VM / Checkpoint-VM (PowerShell + WMI)
├─ Msvm_VirtualSystemReferencePointService (RCT API)
├─ Direct VHDX reader (no Export-VM)
├─ CBT delta encoder (proprietary binary format)
├─ RCT-Push replication driver
└─ Cross-hypervisor convert (qemu-img.exe wrapper)
2.1 Diseño multi-adapter
Un único backend engine atiende múltiples DLLs cdylib, cada una con un namespace Bacula distinto:
| cdylib DLL | Namespace Bacula | Función |
|---|---|---|
podheitor-hyperv-fd.dll |
@hyperv/ |
Backup/restore nativo Hyper-V |
podheitor-vsphere-fd.dll |
@vsphere/ |
Restore de backups VMware → Hyper-V |
podheitor-proxmox-fd.dll |
@proxmox_/ |
Restore de backups Proxmox/KVM → Hyper-V |
Operacionalmente: un único host Bacula FD puede ser destino de migración de cualquier hypervisor — sin reaprovisionamiento, sin instalar tres productos diferentes.
3. Direct VHDX + RCT — por qué importa
| Problema | Enfoque PodHeitor |
|---|---|
| VHDX bloqueado en runtime | Production checkpoint congela el VHDX padre — lecturas consistentes |
| Estado inconsistente de la app | VSS quiesce vía Hyper-V Integration Services — application-consistent |
| Export-VM duplica disco | Plugin lee VHDX in-place, cero espacio extra |
| VHDX completo reenviado | RCT (Resilient Change Tracking) marca regiones dirty; sólo ésas van |
| Incremental lento en disco grande | 100 GB con 2 GB modificados → 2 GB transferidos |
| Snapshot management manual | Plugin crea y elimina checkpoint automáticamente, aún en fallo |
| Sin catálogo de archivos | El catálogo Bacula registra cada archivo — granular restore posible |
4. RCT — Resilient Change Tracking
RCT es la API nativa de Microsoft (Windows Server 2016+) para change tracking de discos virtuales. El plugin la consume vía WMI:
- Los reference points son marcadores persistentes (sobreviven al reboot del host Hyper-V) registrados en
Msvm_VirtualSystemReferencePointService. - En cada incremental/diferencial, el plugin pide a Hyper-V el diff entre dos reference points y recibe la lista de extents
{offset, length}que cambiaron. - El plugin lee sólo esos extents del VHDX y los empaqueta en el formato CBT delta propietario (binary stream con header de offset).
- En restore, el cdylib aplica los deltas en orden cronológico sobre la base full.
Cuando RCT no está disponible (gen 1 legacy, host antiguo), el plugin cae automáticamente a full streaming del VHDX en vez de fallar — comportamiento documentado como Gen1 fallback.
5. Replicación RCT-Push (near-CDP)
Configurado con mode=rct-push, el plugin ejecuta ciclos continuos de replicación directa a un host Hyper-V secundario, sin pasar por Bacula SD en cada ciclo.
| Parámetro | Default | Función |
|---|---|---|
push_interval |
300 | Intervalo entre ciclos (segundos) |
push_cycles |
1 | Número de ciclos (0 = infinito) |
rpo_seconds |
900 | Recovery Point Objective objetivo |
dr_host |
— | Host Hyper-V de destino |
dr_port |
9847 | Puerto TCP del receiver |
dr_psk |
— | Pre-shared key (HMAC) para el canal |
bandwidth |
0 | Throttle en bytes/s (0 = ilimitado) |
max_restore_points |
5 | Restore points retenidos en DR |
push_apply_remote |
no | Aplica deltas directo en DR (bypassa Bacula SD) |
network_map |
— | Mapa de red para failover (src=dst,...) |
reip_rules |
— | Re-IP en failover (vm:ip/mask/gw,...) |
Con push_apply_remote=yes, el canal va directo del FD source al DR, sin paso por el Storage Daemon Bacula — útil cuando el objetivo es puramente DR y no retención centralizada. Con =no, los deltas van por el SD (catalogados) y se reaplican en el DR en el próximo ciclo.
6. Conversión cross-hypervisor (vSphere / Proxmox → Hyper-V)
Restore de VMs hechas por otros plugins PodHeitor directamente en Hyper-V — sin reconversión manual de disco.
| Origen | Adapter DLL | Conversión |
|---|---|---|
| VMware vSphere | podheitor-vsphere-fd.dll |
VMDK / raw → VHDX (vía qemu-img.exe) |
| Proxmox / KVM | podheitor-proxmox-fd.dll |
raw / qcow2 → VHDX (vía qemu-img.exe) |
La traducción de configuración de la VM (adaptadores de red, orden de boot, detección Gen1/Gen2) es automática. Prerrequisito: qemu-img.exe en %BACULA_DIR%tools o en el %PATH%; espacio temporal ~1,5× el tamaño comprimido de la VM.
7. Granular restore (file-level)
Compatible con PodHeitor Granular Restore:
- Browse en el catálogo Bacula (BVFS) para localizar archivos VHDX de la VM.
- Restore sólo del VHDX base + CBT deltas relevantes al Storage Daemon.
- Reconstrucción del estado completo del disco aplicando CBT deltas sobre el VHDX base.
- Mount del filesystem guest (NTFS, ext4, XFS, etc.) vía libguestfs o
qemu-nbd. - Browse y extracción de archivos individuales.
8. Plataformas validadas
| OS | Versión plugin | Escenarios probados |
|---|---|---|
| Windows Server 2016 Datacenter | 1.2.0 | Full, Incremental, Restore, RCT-Push, Cross-Hypervisor |
| Windows Server 2025 Standard | 1.2.0 | Full, Incremental, Restore, RCT-Push |
| Bacula FD 15.0.3 | — | Todos los escenarios anteriores |
9. Anti-patterns documentados
- No deshabilites
quiesceen VMs con app stateful. Sin VSS quiesce el snapshot es crash-consistent — el restore puede bootear, pero las DBs pueden necesitar recovery. - No corras dos plugins concurrentes contra la misma VM. Los reference points RCT son globales por-VM; la concurrencia genera reference-point churn.
- No confíes en RCT en VMs Gen1 u hosts < Windows Server 2016. El plugin hace fallback transparente a full VHDX streaming, pero el operador debe saberlo para dimensionar bandwidth/storage.
10. Postura de licencia
Plugin bajo LicenseRef-PodHeitor-Proprietary. Ningún source AGPLv3 de Bacula se vincula estáticamente a la DLL cdylib. El binding es vía crate bacula-fd-abi (puro PodHeitor) con declaraciones extern "C" independientes.
¿Listo para evaluar?
Trial gratuito de 30 días para flotas Hyper-V en producción. Garantizamos al menos 50% de descuento vs Bacula Enterprise, Veeam o Commvault, con más funcionalidades incluidas.
Heitor Faria — Fundador, PodHeitor International
✉ [email protected]
☎ +1 (789) 726-1749 · +55 (61) 98268-4220 (WhatsApp)
🔗 Página del plugin PodHeitor Hyper-V
Disponível em:
Português (Portugués, Brasil)
English (Inglés)
Español