Deploy Linux images (containerdisk + CDI golden)
Zorvia supports two ways to boot major Linux distros from upstream
quay.io/containerdisks:
| Path | When to use | What happens |
|---|---|---|
| ContainerDisk | Demo / quick create | VM references quay.io/... directly; the node pulls at start. No PVC import. |
CDI golden (zorvia image-bundle) | Shared golden library, rollback, many VMs | Import once into a versioned PVC + stable DataSource; VMs clone from that. |
Create VM (GET /api/images) lists ready containerdisks. Golden CDI YAML is
generated by zorvia image-bundle (http or docker:// registry sources).
The web console's "Download an OS image" flow in Create VM does the same
import without a manual kubectl apply: POST /api/images/cloud/download
resolves a catalog entry to an HTTP or registry source, builds the same
DataVolume/DataSource bundle as image-bundle, and applies both directly to
the cluster. The response's output_path is a datavolume:<name> reference
— pass it straight back as the Create VM disk image once the job reaches
Completed (poll GET /api/images/downloads).
Ready quay.io containerdisks (major Linux)​
| Distro | Image |
|---|---|
| Ubuntu | quay.io/containerdisks/ubuntu:24.04, :22.04, :20.04, :18.04 |
| Fedora | quay.io/containerdisks/fedora:41, :40, :39 |
| CentOS Stream | quay.io/containerdisks/centos-stream:9, :8 |
| Debian | quay.io/containerdisks/debian:12, :11 |
| AlmaLinux | quay.io/containerdisks/almalinux:9, :8 |
| Rocky Linux | quay.io/containerdisks/rockylinux:9, :8 |
| Alpine | quay.io/containerdisks/alpine:3.19 |
| VirtIO (Windows) | quay.io/containerdisks/virtio-win (CD-ROM helper, not a root OS) |
These match the OS templates in src/templates/mod.rs and the SPA image catalog.
Instant VM (containerdisk)​
Pick an image in Create VM, or pass the quay path with format: containerdisk.
No CDI import is required; KubeVirt pulls the OCI disk at VM start.
CDI golden image bundles​
zorvia image-bundle generates a versioned CDI DataVolume plus a stable
DataSource alias. VMs can consume the stable name while promotion moves the
alias to a new immutable PVC/DataVolume revision.
HTTP / HTTPS qcow2 source​
zorvia --namespace vm-images image-bundle ubuntu-golden \
--version 24.04-r2 \
--source https://images.example/ubuntu.qcow2 \
--source-type http \
--size 40Gi \
--storage-class fast \
--checksum sha256:abc123 \
--output ubuntu-golden.yaml
Registry sources (same quay containerdisks)​
Requires CDI and a working StorageClass. Namespace once, then generate + apply:
kubectl create ns vm-images
zorvia --namespace vm-images image-bundle ubuntu-golden \
--version 24.04-r1 \
--source docker://quay.io/containerdisks/ubuntu:24.04 \
--source-type registry \
--size 40Gi \
--storage-class fast \
--output ubuntu-golden.yaml
zorvia --namespace vm-images image-bundle fedora-golden \
--version 41-r1 \
--source docker://quay.io/containerdisks/fedora:41 \
--source-type registry \
--size 40Gi \
--storage-class fast \
--output fedora-golden.yaml
zorvia --namespace vm-images image-bundle debian-golden \
--version 12-r1 \
--source docker://quay.io/containerdisks/debian:12 \
--source-type registry \
--size 40Gi \
--storage-class fast \
--output debian-golden.yaml
zorvia --namespace vm-images image-bundle almalinux-golden \
--version 9-r1 \
--source docker://quay.io/containerdisks/almalinux:9 \
--source-type registry \
--size 40Gi \
--storage-class fast \
--output almalinux-golden.yaml
zorvia --namespace vm-images image-bundle rockylinux-golden \
--version 9-r1 \
--source docker://quay.io/containerdisks/rockylinux:9 \
--source-type registry \
--size 40Gi \
--storage-class fast \
--output rockylinux-golden.yaml
zorvia --namespace vm-images image-bundle centos-stream-golden \
--version 9-r1 \
--source docker://quay.io/containerdisks/centos-stream:9 \
--source-type registry \
--size 40Gi \
--storage-class fast \
--output centos-stream-golden.yaml
zorvia --namespace vm-images image-bundle alpine-golden \
--version 3.19-r1 \
--source docker://quay.io/containerdisks/alpine:3.19 \
--source-type registry \
--size 10Gi \
--storage-class fast \
--output alpine-golden.yaml
kubectl apply -f ubuntu-golden.yaml
# wait for DataVolume Succeeded, validate, then rely on the stable DataSource
To generate the full major-Linux library in one pass (set your StorageClass):
STORAGE_CLASS=fast ./fixtures/golden-images/generate-bundles.sh
kubectl apply -f fixtures/golden-images/out/
Promotion flow​
- Apply the versioned
DataVolumeand wait until CDI import reaches Succeeded. - Validate the imported PVC with a disposable VM.
- Apply the stable
DataSourcealias only after validation succeeds. - Keep the previous versioned PVC until rollback retention expires.