packaged by Chainguard
Contact our team to test out this image for free. Please also indicate any other images you would like to evaluate.
Chainguard Server Hypervisor bootc OS image for GCE (amd64 + arm64): a minimal, immutable host for Chainguard MicroVMs, including GCE bare metal.
Chainguard Containers are regularly-updated, secure-by-default container images.
For those with access, this container image is available on cgr.dev:
Be sure to replace the ORGANIZATION placeholder with the name used for your organization's private repository within the Chainguard Registry.
The chainguard-server-hypervisor-gcp container image is a Chainguard-native
bootc OS image, not a repackaged application. It is a minimal, immutable,
bootc-managed host OS whose only job is to run Chainguard MicroVMs
(mono/microvm) — conceptually VMware ESXi, not a general-purpose server. It
ships as the root filesystem behind a GCE image and is delivered to running
instances via atomic bootc upgrade on top of composefs. It is the GCP sibling
of chainguard-server-hypervisor-aws, and sits beside the
chainguard-desktop-workstation-{rpi,qemu} and chainguard-server-workstation-gcp
family: same Vendor/Class axes, Hypervisor form factor, GCE hardware target.
The build is split into three stages, each with a single job:
enterprise-packages/chainguard-server-hypervisor.yaml):
the only stage that ships file content — the host contract (udev rule for
/dev/kvm, tun modules-load, microvm sysusers, state/scratch tmpfiles,
the microvm-manager@ privilege template) plus the -gcp subpackage's
Firecracker dependency and GCE Local SSD scratch provisioning. The package
itself is generic, with one subpackage per hardware platform.containers/images/chainguard-server-hypervisor-gcp/):
composition only — package list, kernel selection, composefs paths and
annotations. Note that unlike the -aws sibling it does not enable the
scratch unit with a paths: symlink; the -gcp subpackage's systemd preset
does that, because preset creates both enablement links where a paths:
entry creates only the one it names.wolfi-vm/configs/gcp-server-hypervisor):
partitioning, filesystems, bootloader, and GCE image registration. It
installs from this published image via the wolfi-vm container-installer
(bootc install --target-imgref), so install and upgrade share one source
of truth.Scope of this image is the container: the composefs root a GCE instance runs from once bootstrapped. Key properties:
amd64 and arm64. Both are real targets. GCE has one
arm64 bare-metal shape, c4a-highmem-96-metal (Axion), and it is the
strategically important one — see the Secure Boot note below./sbin/init (systemd).systemd-boot → Linux (via
linux-gcp-6.18-bootc-boot-installed). GCE has no legacy-BIOS path at
all, on any shape including bare metal, so this image needs none of the
GRUB/blscfg machinery the AWS x86 sibling carries — that exists solely
because every x86 EC2 .metal type reports SupportedBootModes: [legacy-bios].builder-bootc installs with --filesystem=ext4 and then verifies the
built disk's composefs= karg carries no ? prefix.containers.bootc="1" (required by the bootc
container linter), dev.chainguard.vm.bootable="1" (the wolfi-vm
container-installer gates on this before installing a pulled image), and
dev.chainguard.vm.secureboot="1" (makes it enroll Secure Boot certs on the
ESP).Two platform facts shape this image, and neither has an AWS analogue:
BARE_METAL_LINUX_COMPATIBLE and IDPF. GCE bare-metal instances use the
Intel IDPF network driver and do not offer gVNIC, so only OS images that
support IDPF can boot there. The linux-gcp-6.18 kernel enables
CONFIG_IDPF=m (config-gcp-generic), which is what makes this image
bootable on metal at all. The corresponding BARE_METAL_LINUX_COMPATIBLE
guest OS feature is set at GCE image registration time, in the wolfi-vm
publish stage — not here.c4a-highmem-96-metal can enforce the Secure Boot certs this image
asks the installer to enroll, which makes it the only bare-metal target in
the Chainguard-on-Chainguard fleet with a verified boot chain below
composefs. On the x86 metal shapes (C3/C4/C4D/X4/Z3) the enrolled certs are
simply not enforced by firmware — harmless, and one image still serves every
shape.chainguard-hypervisor-scratch-gcp.service provisions
/var/lib/microvm-scratch from one of two backends, tried in the order given
by SCRATCH_ORDER:
| Backend | Device | Persists across stop/start | Availability |
|---|---|---|---|
|
| yes | any shape, opt-in |
| NVMe controller with model exactly | no |
|
Hyperdisk is tried first by default, for three reasons: it is the only
scratch that exists on most GCE metal shapes (c3-*-metal, c4d-*-metal,
x4-*-metal and c4a-highmem-96-metal have no Local SSD at all); it survives
instance stop/start, so the scratch filesystem is reclaimed by label rather
than rebuilt; and it only exists because an operator deliberately attached it,
which is a stronger signal of intent than a device that came with the shape.
Flip to local-ssd hyperdisk on a shape where you have both and want the
directly-attached NVMe.
Attach a scratch Hyperdisk like this — the device name is what matters, not the disk resource name:
That name is the entire safety contract for this backend. The boot volume is
also a Hyperdisk and is indistinguishable from a data Hyperdisk by device
model, so "some blank nvme_card-pd" is not a safe selector and the
provisioner never uses one; only a disk named for the purpose is eligible.
Naming persistent-disk-0 — the boot disk's default device name — is refused
outright.
Configure it in /etc/chainguard-server-hypervisor/scratch-gcp.conf; shipped
defaults are documented in
/usr/lib/chainguard-server-hypervisor/scratch-gcp.conf. Setting
SCRATCH_ORDER="" disables provisioning entirely.
If neither backend yields a device the service is a clean no-op and
/var/lib/microvm-scratch stays on the boot volume. That is a supported
configuration, not a degraded one — and with no scratch disk attached to a
c3-*-metal or c4a-highmem-96-metal host, it is the default one.
Hypervisor-appliance profile — the shared bootc server base without the ~105-package developer toolset the workstation siblings carry:
linux-gcp-6.18-bootc-boot-installed (GCE host
kernel with the composefs-aware initramfs and CONFIG_IDPF for bare metal),
systemd-boot + systemd-boot-installed, and systemd-repart-rootfs-ext4
(grows the root ext4 to fill the GCE boot disk on first boot).bootc-system — pulls bootc-binary,
bootc-systemd-units, podman, and the systemd/boot deps that make the
installed image an actual bootc-managed system.chainguard-server-hypervisor +
chainguard-server-hypervisor-gcp (host contract + GCE Local SSD scratch
provisioning), firecracker (primary VMM), qemu (mature fallback VMM —
the bare metapackage, so each arch gets its native emulator), and the baked
guest kernels linux-firecracker-6.18 and linux-qemu-melange (guest
kernels move atomically with bootc upgrade; no runtime credential or egress
needed).google-guest-agent, google-guest-config,
google-compute-engine-oslogin, chrony-gcp, OpenSSH client and server.
Shorter than the AWS sibling's: there is no cloud-init here, because
google-guest-agent owns SSH-key metadata and account creation on GCE.libselinux, libsemanage, libsepol,
policycoreutils, selinux-policy) but disabled at cmdline/config for now.There is deliberately no developer toolset (no docker, no go, no editors
beyond vim, no cloud SDKs) and no apk-tools — this is an appliance managed
through bootc upgrade and the GCE API.
This image is not run directly with docker run — it is the root filesystem
for a bootc-managed GCE instance. Its declared entrypoint is /sbin/init
(systemd PID 1), which requires cgroup delegation, a writable
/sys/fs/cgroup, and a fully owned PID namespace: none of which a plain
unprivileged container provides, so there is no meaningful boot test under
docker. A real boot happens on a GCE instance whose boot disk was staged from
this image — so the way to get started with it is to launch one.
A GCE image is built from this container and published into a Chainguard project. It is not a public image: access is granted per-customer. Contact Chainguard to request access.
The published GCE images are referenced as image families, so you always get the newest build:
| Architecture | Image family |
|---|---|
x86_64 |
|
arm64 (Axion) |
|
Substitute the Chainguard project you have been given access to for
--image-project below.
Dev loop — a virtualized instance. Cheap, and exercises everything except
the metal-specific hardware paths. --enable-nested-virtualization is what
gives the hypervisor a /dev/kvm to work with on a virtualized shape:
Bare metal — the production posture. Metal instances cannot live migrate,
so --maintenance-policy=TERMINATE is mandatory rather than advisory, and
C3/C4/C4A metal boot disks must be Hyperdisk:
For arm64 metal use --machine-type=c4a-highmem-96-metal with the
-arm64 image family. No nested-virtualization flag on metal — the hardware
is the hypervisor.
The published image declares BARE_METAL_LINUX_COMPATIBLE, which GCE
requires before it will boot an image on a *-metal shape, and the metal
kernel arguments ship inside the image at
/usr/lib/bootc/kargs.d/20-gce-metal.toml so they survive an upgrade rather
than being frozen into a bootloader config.
Access the instance with OS Login or SSH as usual.
verity=require is the one worth checking: the root is an fs-verity-backed
composefs, and that flag is the difference between verification being
enforced and merely attempted.
The chainguard-server-hypervisor host contract provides /dev/kvm group
access, tun, the unprivileged microvm user, and the microvm-manager@
privilege template. chainguard-hypervisor-scratch-gcp.service (enabled by
the package's preset) provisions /var/lib/microvm-scratch on an attached
Hyperdisk, or on Local SSD where the shape has it.
Firecracker is the primary VMM and qemu the fallback; guest kernels ship in the image, so starting a guest needs no registry credential and no egress.
New digests of this container become new deployments on the running host:
No re-imaging, and bootc rollback returns to the previous deployment if an
upgrade misbehaves. This is the steady state — step 1 happens once per host.
Chainguard's free tier of Starter container images are built with Wolfi, our minimal Linux undistro.
All other Chainguard Containers are built with Chainguard OS, Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.
The main features of Chainguard Containers include:
For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with a development, or -dev, variant.
In all other cases, including Chainguard Containers tagged as :latest or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.
Although the -dev container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the -dev variant into a more minimal production image.
To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use Custom Assembly to add packages, either through the Console, chainctl, or API.
To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in your Organization's list of images, and click on the Customize image button at the top of the page.
Refer to our Chainguard Containers documentation on Chainguard Academy. Chainguard also offers VMs and Libraries — contact us for access.
This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies.
Chainguard's container images contain software packages that are direct or transitive dependencies. The following licenses were found in the "latest" tag of this image:
( GPL-2.0-or-later
AFL-2.1
Apache-2.0
BSD-1-Clause
BSD-2-Clause
BSD-3-Clause
BSD-4-Clause-UC
For a complete list of licenses, please refer to this Image's SBOM.
Software license agreementChainguard Containers are SLSA Level 3 compliant with detailed metadata and documentation about how it was built. We generate build provenance and a Software Bill of Materials (SBOM) for each release, with complete visibility into the software supply chain.
SLSA compliance at ChainguardThis image helps reduce time and effort in establishing PCI DSS 4.0 compliance with low-to-no CVEs.
PCI DSS at Chainguard