Native XBSA cdylib replacing TSM/ISP, ontape STDIO fallback, continuous log shipping, PITR by LSN/timestamp, instant recovery via loop-device + FUSE, and cross-version conversion IDS 12.10 → 14.10 → 15.0 on Bacula Community 15.0.3+.
Companion document to the PodHeitor Informix plugin page.
1. The problem: stock Bacula forces TSM/ISP for HCL Informix
Informix’s native backup model is ON-Bar, which by default talks to IBM Spectrum Protect (TSM/ISP) via XBSA. To integrate that with Bacula, market alternatives are:
- Bacula Enterprise Informix plugin — available, but capped at ON-Bar full + simple log archiving; no LSN-based PITR, no instant recovery, no cross-version conversion.
- Shell wrapper scripts around
ontape— common in the field but fragile: no log-archiving gap detection, no signal handling, no timeouts, no proper manifest cataloging. - Licensed TSM/ISP — expensive, outside the Bacula world, and every renewal hurts the budget.
PodHeitor Informix delivers a native XBSA cdylib (libpodheitor_xbsa.so) that ON-Bar loads in place of TSM/ISP, routing data streams directly to Bacula via Unix socket — fully replacing TSM.
2. Architectural model
bacula-fd
└── podheitor-informix-fd.so (pure Rust cdylib — plugin-informix crate;
│ metaplugin-rs / bacula-fd-abi; no C shim)
└── podheitor-informix-backend (Rust rlib + CLI binary, engine dispatcher)
├── XBSA engine: ON-Bar → libpodheitor_xbsa.so → Unix socket → Bacula
├── ontape engine: ontape -s -t STDIO → zstd → PTCOMM D-packets
├── log_shipper: onstat -l poll → ontape -a -l <uniq_id> → virtual file
├── PITR: manifest chain replay → onmode -m
├── instant: .raw image → losetup → oninit -PHY (RTO < 60s)
├── table_level: Podman/Docker sandbox → dbexport → docker cp
├── snapshot: LVM lvcreate --snapshot / ZFS snapshot
├── replicate: HDR/RSS/SDS/ER bootstrap via Bacula transport
└── logical_dbexport: streaming dbexport for cross-version migration
The cdylib runs inside bacula-fd; the backend is a separate per-job process, talking PTCOMM. Reasoning is unchanged: crash isolation, parallelism freedom (parallel XBSA stripes cross-dbspace), and license firewall — no Bacula AGPLv3 source statically linked.
3. Supported operating modes
| Capability | Detail |
|---|---|
| Native XBSA cdylib | libpodheitor_xbsa.so replaces TSM/ISP — ON-Bar routes data straight to Bacula |
| ontape STDIO fallback | Backs up IDS instances without ON-Bar/XBSA configured |
| Parallel dbspace backup | XBSA stripes + onbar_psm mode — N-way per dbspace, M parallel dbspaces |
| Continuous log shipping | Per-log SHA-256, onstat -l polling, gap detection — sub-minute RPO |
| PITR | Recovery to any LSN, timestamp, or transaction ID |
| HDR / RSS / SDS / ER bootstrap | One-command replication seeding through Bacula storage |
| Snapshot backup | LVM, ZFS, IDS native checkpoint — quiesce window < 1s |
| Instant recovery | Loop-device + FUSE mount → IDS queryable in < 60s |
| Single-table extraction | Docker/Podman sandbox + dbexport — no production impact |
| Cross-version conversion | mode=logical_dbexport + mode=logical_import — migrate IDS 12.10 → 14.10 → 15.0 |
| DBCRYPT sidecar | Keystore metadata (no key material) persisted in catalog — transparent restore |
| Pre-backup ARD ransomware check | onstat -g ARD hook (IDS 14.10+) — aborts on anomaly |
| zstd / lz4 compression | Per-stripe SHA-256 + LOB content-defined chunking |
| Bare-metal DR | onconfig + sqlhosts + ixbar bundled as Bacula RestoreObject |
| Virtual Full | Server-side chain merge — eliminates long restore chains |
| Observability | Prometheus /metrics + OpenTelemetry OTLP traces |
4. Native XBSA cdylib — replacing TSM/ISP
XBSA (X/Open Backup Services API) is the standardised ABI ON-Bar uses to talk to media servers. IBM/HCL ships ON-Bar configured for TSM/ISP. libpodheitor_xbsa.so implements the entire XBSA ABI in Rust and translates each XBSA call into PTCOMM frames that travel via Unix socket to the backend, which then talks to the Bacula cdylib.
Minimal config in $INFORMIXDIR/etc/bar_act.cfg:
BAR_BSALIB_PATH=/opt/bacula/lib/libpodheitor_xbsa.so
ON-Bar doesn’t even need to know it’s talking to Bacula — it still thinks it’s TSM/ISP. Result: zero changes to legacy ON-Bar scripts, zero DBA retraining.
5. Continuous log shipping and PITR
The log_shipper polls onstat -l to discover rotated logical logs. Each new log is ontape -a -l <uniq_id>-archived, SHA-256 hashed, and shipped as a separate virtual file inside the same Bacula incremental job. Gap detection is mandatory: if a log was consumed by another process (or polling missed a cycle), the plugin detects this via sequential unique-id comparison and aborts with a clear message.
Sub-minute RPO is achievable with 30s polling. PITR on restore accepts the target in three forms:
restore_to_lsn=...— exact LSNrestore_to_time=2026-04-15T14:30:00Z— ISO 8601 timestamprestore_to_txid=...— Informix transaction ID
The backend computes the chain (Full + N logs) and triggers onmode -m to reopen the instance at the target LSN.
6. Instant recovery in < 60s
For workloads that can’t tolerate hours-long traditional restore, instant mode exports the dbspace image as .raw, runs losetup against a loop device, and calls oninit -PHY pointing IDS at the loop. The instance comes up queryable in < 60s. Migration back to local storage runs in the background, no extra downtime window.
7. Cross-version conversion (logical_dbexport)
Migrating IDS 12.10 → 14.10 → 15.0 with minimal downtime is a recurring case. logical_dbexport mode streams dbexport via PTCOMM — no intermediate disk — and the destination side runs dbimport directly off the stream. Backup, migration and restore in a single Bacula job.
8. Supported versions
- HCL Informix Dynamic Server: 12.10.FC12+, 14.10, 15.0
- Bacula Community: 15.0.3+
- Linux: EL8/EL9 (RPM), Ubuntu 22.04 / Debian 12 (DEB), x86_64
9. Validation
E2E suite (T01–T18, lab 2026-04-29): PASS=22 / FAIL=0 / SKIP=0 / TOTAL=22 — all 22 scenarios active. Lab: 4 VMs (primary, HDR, RSS, snapshot), IDS 15.0.1.0.3 Developer Edition, Bacula Community 15.0.3. OL9 unit tests: 80/80 PASS.
10. License posture
Proprietary — single license. It does not statically link any Bacula AGPLv3 source. The cdylib uses independent extern "C" via the in-house bacula-fd-abi crate; libpodheitor_xbsa.so implements the standard X/Open XBSA ABI without dependence on IBM/HCL code.
Ready to evaluate?
30-day free trial for qualified Informix instances (12.10+, 14.10, 15.0). We guarantee at least 50% off vs Bacula Enterprise, Veeam, Commvault, or TSM/ISP, with more features — including native XBSA, cross-version conversion, and instant recovery that no competitor delivers.
Heitor Faria — Founder, PodHeitor International
✉ [email protected]
☎ +1 (789) 726-1749 · +55 (61) 98268-4220 (WhatsApp)
🔗 PodHeitor Informix plugin page
Disponível em:
Português (Portuguese (Brazil))
English
Español (Spanish)