pvm

Host kernel

host/build.sh produces Ubuntu-installable debs (linux-image, linux-headers) whose release string ends in -pvm. The PVM switcher is core-kernel code — it cannot ship as a DKMS module, so PVM hosts run this kernel wholesale.

Config composition

  1. Base: the newest linux-modules-*-gcp package in the running Ubuntu release donates its /boot/config-* — GCP driver coverage (virtio, gVNIC) stays distro-equivalent, so the debs work on any GCP instance type.
  2. configs/host-pvm.config: CONFIG_KVM=m, CONFIG_KVM_PVM=m. That is the entire PVM delta; upstream’s host reference config shows no other requirement (KASLR, PTI and 5-level paging all stay at distro defaults).
  3. Build hygiene: Canonical’s signing-key and debug-info options are stripped (SYSTEM_TRUSTED_KEYS, DEBUG_INFO*) — they cannot build outside Canonical’s packaging and a PVM node does not need them.

Install

host/install.sh is deliberately two-phase:

sudo ./install.sh .          # dpkg -i + one-shot grub-reboot into -pvm
sudo reboot
uname -r && lsmod | grep kvm_pvm && ls /dev/kvm
sudo ./install.sh --commit . # make it the default only after validation

A broken kernel therefore costs one reboot, never a dead node. Secure Boot must be off (the kernel is unsigned); the script refuses to install otherwise.

scripts/gcp-host-e2e.sh runs the whole loop against a fresh GCP e2 instance: install → reboot → kvm_pvm loaded → guest smoke boot → teardown.