Suíte SD-side em Rust que entrega três capacidades sobre um único core: restore granular file-level, Instant Recovery block-level (NBD/iSCSI/NFS-Datastore/SMB-VHDX), e cross-hypervisor V2V (Hyper-V↔Proxmox↔ESXi↔CloudStack↔Nutanix). Substitui o Single Item Restore (SIR) do Bacula Enterprise 18.2 com paridade técnica + diferenciais cross-hypervisor que o SIR não cobre.
Documento técnico complementar à página do plugin PodHeitor Granular Restore.
1. O problema: SIR do Bacula Enterprise é vSphere-centric
Engenharia reversa do RPM bacula-enterprise-single-item-restore-18.2.3-26020419.el9.x86_64.rpm mostrou:
- SIR usa parsers C++ próprios (
vmbackend,bacula-fused) — não libguestfs. - Instant Recovery existe apenas para vSphere (export NFS Datastore via
vsphere-ctl --ir-mode). - IR para Hyper-V não existe. IR para Proxmox/KVM/CloudStack/Nutanix não existe.
- Cross-hypervisor V2V não existe — backup Hyper-V só restaura em Hyper-V.
- Mode JSON do
mount-vmserializa em formato proprietário frágil. - Cache local em
working/mount-cache— staging não é zero.
Para clientes multi-hypervisor (ambiente típico de hosting providers e MSPs no Brasil/LatAm), as lacunas são bloqueantes. PHGR fecha as quatro: IR Hyper-V, IR Proxmox/KVM, IR Nutanix/CloudStack, e V2V cross-hypervisor.
2. Arquitetura — workspace cargo, três binários, um core
ADR-001: tudo em um único cargo workspace com três binários (phgrd, phird, phgr-cli) compartilhando um crate de núcleo (phgr-core). Não é “tudo no mesmo binário” — é “uma codebase, vários deliverables operacionais que podem ser instalados independentemente”.
| Crate | Type | Função |
|---|---|---|
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 interativa + scripted (mount, ir, v2v, diff, verify) |
phgr-api |
bin | gRPC + REST gateway com OpenAPI |
phgr-tests |
lib | E2E test harness + lab fixtures |
3. Granular Restore — file-level sem staging
O phgrd monta volumes Bacula como filesystem FUSE, parseia VHDX/VHD/VMDK/qcow2/raw/VDI, monta partições NTFS/ext2/3/4/xfs/btrfs/ReFS/FAT/exFAT/ZFS, e expõe arquivos via:
- FUSE local — mount em
/mnt/phgr/<jobid>/<disk-N>/ - SMB — share dinâmica via Samba
bacula.d/include - NFS — export dinâmica via
/etc/exports.d/
O ler de volume Bacula é em Rust puro (ADR-005) — não linka libbacsd. Em v1.0, fallback para bextract orquestrado quando o reader Rust não cobre algum encoding. Footprint em /opt/bacula/working: ≤ 2 GB para um VHDX de 200 GB (lazy reads + small LRU cache, vs SIR que faz cache completo).
4. Instant Recovery — boot da VM em ≤ 60s
O phird expõe a imagem reconstruída como bloco para que um hipervisor inicie a VM imediatamente. Quatro caminhos:
| Hypervisor | Bloco | Caminho |
|---|---|---|
| Proxmox / KVM | NBD direto | qm importdisk via 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 com VHDX iSCSI |
| Nutanix / CloudStack | iSCSI VG attach | VG temporária → attach VM → boot |
Escritas durante IR ficam em overlay COW separado (qcow2 backing file). Migração viva para storage definitivo em background (Storage vMotion / qm move-disk / equivalente) — usuário não percebe transição. RTO observado: ≤ 60s p95 wall-clock entre operador clicar “Recover” e VM boot.
5. Cross-hypervisor V2V
O phgr-cli v2v converte formato de disco e gera config nativa do hipervisor destino:
| Source → Target | Conversão 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 |
Conversão usa qemu-img convert em streaming. Driver virtio é injetado via virt-customize quando target requer (Linux guest indo para KVM da Hyper-V).
6. Diffs do SIR do Bacula Enterprise
| Capacidade | Enterprise SIR 18.2 | PHGR v1.x |
|---|---|---|
| GR Hyper-V/VMware/Xen/KVM | Sim | Sim — paridade |
| GR Proxmox / CloudStack / Nutanix | Namespace existe, suporte real escasso | Sim — diferencial |
| IR vSphere | Sim | Sim — paridade |
| IR Hyper-V | Não | Sim — iSCSI bridge |
| IR Proxmox / KVM | Não | Sim — NBD direto |
| IR Nutanix / CloudStack | Não | Sim — iSCSI VG |
| Cross-hypervisor V2V | Não | Sim |
| Zero-staging | Cache local ≥ 2 GB | FUSE direto, ≤ 2 GB / 200 GB VHDX |
| Paralelismo | C++ sync | Rust async + tokio + io_uring quando disponível |
| API | Formato proprietário | gRPC + REST com OpenAPI |
| Diff entre dois jobs | Não | Sim — auditoria, DR remoto economia |
| Auto-malware scan opcional | Não | clamav/yara opt-in |
7. Audit log assinado (compliance)
Toda sessão de restore gera trail HMAC-encadeado: cada entrada inclui hash da entrada anterior, garantindo que tampering é detectável. Cobre LGPD / GDPR / PCI requirements de evidência forense de quem acessou quais dados.
8. Throughput targets
| Métrica | Target |
|---|---|
| Restore granular em volume rápido (NVMe) | ≥ 250 MB/s |
| Sessões simultâneas sem degradação > 30% | ≥ 4 |
| Início de IR (p95 wall-clock) | ≤ 60s |
Footprint em /opt/bacula/working |
≤ 2 GB para VHDX 200 GB |
| Famílias de FS suportadas | 8 (NTFS, ext2/3/4, xfs, btrfs, ReFS, FAT, exFAT, ZFS) |
9. Anti-patterns documentados
- Não rode
phirdem IR sem overlay COW configurado. Escritas durante IR vão para o image base e corrompem o backup ponto-no-tempo. - Não exponha share SMB do
phgrdpublicamente. O Sambabacula.d/include é para LAN — sem TLS, sem Kerberos hardened. Use SMB sobre VPN. - Não confie no namespace de Enterprise SIR para identificar source. Backups com nomes
@HYPERV-WINAPI,@vsphereetc são pistas, mas o parser PHGR validates pelo magic number do disk format, não pelo path. - Não esqueça de ZFS dataset cleanup quando working dir é ZFS. Sessions usam clones; cleanup automático via Drop do
SessionGuard, mas force-kill do daemon deixa clones órfãos.
10. License posture
PHGR é AGPLv3 com dual-licensing comercial disponível. Diferentemente dos plugins de FD (que precisam evitar AGPL transitive porque rodam dentro do bacula-fd), o PHGR é uma suíte SD-side independente — não vincula contra o source do Bacula em nenhum ponto. A leitura de volumes é via formato documentado em Rust puro, sem libbacsd.
Pronto para avaliar?
Trial gratuito de 30 dias para clientes multi-hypervisor que precisam de Instant Recovery em Hyper-V/Proxmox/KVM/Nutanix/CloudStack ou cross-hypervisor V2V. Garantimos no mínimo 50% de desconto vs Bacula Enterprise SIR ou Veeam Instant VM Recovery, com cross-hypervisor IR e V2V que nenhum dos dois oferece.
Heitor Faria — Fundador, PodHeitor International
✉ [email protected]
☎ +1 (789) 726-1749 · +55 (61) 98268-4220 (WhatsApp)
🔗 Página do plugin PodHeitor Granular Restore
Disponível em:
Português
English (Inglês)
Español (Espanhol)