Skip to main content
Version: 029-rc4

Build System

meta-pantavisor is the Yocto/OpenEmbedded layer that builds Pantavisor-based BSP images for embedded Linux products. It provides recipes, BitBake classes, and KAS configurations for producing initramfs images and container pvrexport bundles. For the build workflow itself, see Get started.

Key Directories

meta-pantavisor/
├── classes/ # BitBake classes
├── conf/ # Layer and distro configuration
│ └── multiconfig/ # Per-multiconfig TMPDIR settings
├── dynamic-layers/ # Conditional recipes for other layers
├── kas/ # KAS configuration fragments
│ ├── build-configs/ # One-file release build configs
│ ├── machines/ # Per-machine configurations
│ └── platforms/ # Platform-specific layer includes
├── recipes-containers/
│ └── pv-examples/ # Example containers for xconnect testing
├── recipes-pv/ # Core pantavisor recipes
│ ├── images/ # Appengine and BSP image recipes
│ ├── pantavisor/ # Pantavisor runtime
│ └── pvr/ # PVR tool
├── recipes-devtools/ # Development tools (json-sh, fdisk)
└── wic/ # WIC disk image layout files

Key Recipes

RecipeDescription
recipes-pv/pantavisor/pantavisor_git.bbCore Pantavisor runtime (C, cmake-based); SRCREV forwarded from pantavisor.inc
recipes-pv/images/pantavisor-initramfs.bbInitramfs image
recipes-pv/images/pantavisor-bsp.bbBSP image (generates pvrexport bundles)
recipes-pv/images/pantavisor-starter.bbFlashable starter disk image (.wic)
recipes-pv/pvr/pvr_*.bbPVR CLI tool (Go-based)
recipes-pv/lxc-pv/lxc-pv_git.bbPantavisor-specific LXC fork

BitBake Classes

ClassDescription
classes/pvbase.bbclassDefines PANTAVISOR_FEATURES variable and defaults
classes/pvrexport.bbclassPVR export functionality for images
classes/container-pvrexport.bbclassContainer pvrexport packaging
classes/pvr-ca.bbclassCertificate authority handling
classes/pvroot-image.bbclassRoot container image support

KAS Configuration Hierarchy

KAS is the primary build system. Configuration is composed by layering YAML fragments:

FileDescription
kas/bsp-base.yamlBase configuration for BSP builds; defines repos and core settings
kas/bsp-multi.yamlMulticonfig builds (separate configs for initramfs and containers)
kas/scarthgap.yaml / kas/kirkstone.yamlYocto release-specific patches and branches
kas/machines/*.yamlPer-machine configurations
kas/platforms/*.yamlPlatform-specific layer includes (sunxi, raspberrypi, etc.)
kas/with-workspace.yamlOverlay for local pantavisor source development

Multiconfig Architecture

When using bsp-multi.yaml, builds use three separate multiconfigs to avoid TMPDIR conflicts:

MulticonfigPurposeConfig file
defaultMain image build
pv-initramfs-pantaInitramfs with musl libcconf/multiconfig/pv-initramfs-panta.conf
pv-pantaContainer buildsconf/multiconfig/pv-panta.conf

Each multiconfig uses a separate TMPDIR, set in its conf file:

# conf/multiconfig/pv-initramfs-panta.conf
TMPDIR = "${TOPDIR}/tmp-${DISTRO_CODENAME}-pv-initramfs-panta"

# conf/multiconfig/pv-panta.conf
TMPDIR = "${TOPDIR}/tmp-${DISTRO_CODENAME}-pv-panta"

(Only the Raspberry Pi kernel-variant multiconfigs append ${MACHINE} — see below.)

PANTAVISOR_FEATURES

Controls which optional Pantavisor components are compiled in and installed. Defined in classes/pvbase.bbclass. The table below lists the commonly used features, not an exhaustive set:

FeatureDescription
dm-cryptStorage encryption
dm-verityContainer rootfs integrity verification
autogrowAutomatic partition growing
runcOCI runtime support
tailscaleTailscale VPN integration
debugDebug features
pvcontrolpv-ctrl socket and CLI tools (pvcurl, pvcontrol)
xconnectService mesh for container-to-container communication
container-mdevPer-container mdev device-node hook (runs an mdev LXC mount hook on each container start)
rngdaemonRandom number generator daemon
squash-lz4LZ4 squashfs compression
squash-zstdZstd squashfs compression
rpi-trybootRaspberry Pi A/B boot partition support
bootchartdBoot timing analysis (writes to /; use rdinit=/sbin/bootchartd)

Default: dm-crypt dm-verity autogrow runc tailscale debug rngdaemon pvcontrol xconnect container-mdev

Caution: tailscale and rngdaemon appear in the default string, but their gating is inconsistent upstream — for example, pantavisor-initramfs.bb checks for a feature named rngd, not rngdaemon. Verify the recipes if you depend on either.

The += vs :append Pitfall

pvbase.bbclass sets defaults via ??= (weak default operator):

PANTAVISOR_FEATURES ??= " dm-crypt dm-verity autogrow runc tailscale debug rngdaemon pvcontrol xconnect container-mdev "

In distro includes, you must use :append or :remove — never +=:

# WRONG — clobbers ??= defaults, silently drops xconnect, pvcontrol, rngdaemon
PANTAVISOR_FEATURES += "appengine"

# CORRECT — preserves ??= defaults and appends
PANTAVISOR_FEATURES:append = " appengine"

Raspberry Pi Tryboot (rpi-tryboot)

The rpi-tryboot feature enables A/B boot partition support for Raspberry Pi, building a unified boot image supporting all RPi variants from a single build.

Configuration: kas/machines/rpi.yaml

Kernel Variant Multiconfigs

MulticonfigMachineTarget
rpi-kernel.confraspberrypiPi 0/1
rpi-kernel7.confraspberrypi2Pi 2/3 32-bit
rpi-kernel7l.confraspberrypi-armv7Pi 4 32-bit
rpi-kernel8.confraspberrypi-armv8Pi 3/4 64-bit
rpi-kernel_2712.confraspberrypi5Pi 5

Each uses a separate TMPDIR: tmp-${DISTRO_CODENAME}-rpi-kernel-${MACHINE}.

Key Recipes

  • dynamic-layers/meta-raspberrypi/recipes-pv/images/rpi-boot-image.bb — FAT32 boot partition with all kernel variants
  • dynamic-layers/meta-raspberrypi/recipes-pv/images/rpi-bootsel.bb — Boot selector partition with autoboot.txt
  • WKS file: wic/rpi-tryboot-ab.wks

Partition Layout

Partition 1 (bootsel): FAT16 — autoboot.txt, bootcode.bin (A/B selector)
Partition 2 (boot_a): FAT32 — kernels, DTBs, config.txt, initramfs
Partition 3 (boot_b): FAT32 — same as boot_a (for A/B switching)
Partition 4 (root): ext4 — rootfs with /trails/0 pvr state

Output Artifacts

These are packed into the bsp/ directory of the BSP pvrexport state (by pantavisor-bsp.bb), not shipped as standalone deploy files:

  • pantavisor-rpi.img.gz — Gzipped boot partition
  • modules_<version>.squashfs — Per-kernel-version modules (e.g. modules_6.6.63-v8+.squashfs)
  • firmware.squashfs — Shared firmware

Output Artifacts

Build outputs are in build/tmp-{codename}/deploy/images/{machine}/:

ArtifactDescription
*.pvrexport.tgzPantavisor export bundles (main deployment artifact)
*.wic / *.wic.bz2Complete disk images
pantavisor-initramfs-*.cpio.gzInitramfs image
pantavisor-appengine-docker.tarDocker image for manual appengine testing
pantavisor-appengine-distro-docker-x86_64-*.tar.gzSelf-contained test bundle: Docker images + test.docker.sh runner

Supported Yocto Releases

ReleaseStatus
scarthgapPrimary (CI-tested)
kirkstoneSupported (LTS)

Both scarthgap and kirkstone are Yocto LTS releases.

Layer compatibility is declared in conf/layer.conf:

LAYERSERIES_COMPAT_meta-pantavisor = "kirkstone scarthgap"

Key Build Paths

PathDescription
build/workspace/sources/pantavisor/Pantavisor source (workspace builds)
build/tmp-scarthgap/deploy/images/Build outputs
recipes-containers/pv-examples/Example container recipes
kas/build-configs/release/KAS release machine configurations
.github/configs/release/CI release machine configurations