NVIDIA Variant Architecture#
The dakota-nvidia variant is built by composing a hardware-specific NVIDIA OCI layer on top of the same base oci/bluefin.bst used for the default variant — the two variants share identical GNOME/system sources. NVIDIA-specific packages are never mixed into the base; they live in an isolated parallel element tree that merges cleanly at a single stack element.
The top-level assembly element is elements/oci/bluefin-nvidia.bst, which produces ghcr.io/projectbluefin/dakota-nvidia:latest. Both dakota and dakota-nvidia are released together under :testing → :stable tags via the same promotion pipeline .
Layer Dependency Tree#
The NVIDIA variant's BuildStream element graph mirrors the base layer hierarchy, merging at bluefin-nvidia-stack.bst:
Base branch:
bluefin-stack.bst
└── bluefin-runtime.bst
└── layers/bluefin.bst
└── oci/bluefin.bst ← default variant image + parent for NVIDIA
NVIDIA branch:
bluefin-stack.bst ←── shared
bluefin-nvidia/deps.bst ←── NVIDIA packages
│
└── bluefin-nvidia-stack.bst ← MERGE POINT (also runs depmod)
└── bluefin-nvidia-runtime.bst
└── layers/bluefin-nvidia.bst
└── oci/bluefin-nvidia.bst ← NVIDIA variant image
bluefin-nvidia-stack.bst is the sole merge point: it depends on bluefin-stack.bst (the shared base) and adds bluefin-nvidia/deps.bst. It also runs depmod at integration time so the NVIDIA kernel modules are registered alongside the base system's modules .
NVIDIA Component Elements#
All NVIDIA-specific packages are aggregated in elements/bluefin-nvidia/deps.bst :
| Element | Purpose |
|---|---|
nvidia-drivers.bst | Proprietary driver userspace + kernel modules (Turing+ GPUs) |
egl-external-platform.bst | EGL platform plugin headers |
nvidia-egl-wayland.bst | Direct EGL/GBM Wayland support for GNOME Shell |
nvidia-kargs.bst | Kernel arguments: blacklist nouveau, enable KMS/framebuffer device |
nvidia-modprobe-config.bst | modprobe.d / modules-load.d config for correct driver load order |
nvidia-container-toolkit.bst | nvidia-ctk + nvidia-cdi-hook for GPU passthrough in containers |
nvidia-container-toolkit-preset.bst | Systemd preset enabling the CDI device refresh service |
OCI Image Assembly#
oci/bluefin-nvidia.bst calls build-oci with two inputs:
parent: /parent— the full baseoci/bluefin.bstimagelayer: /layer— the NVIDIA-only compose layeroci/layers/bluefin-nvidia.bst
This produces a derived OCI image where the NVIDIA layer is appended to the base — not a fork. The element also assigns a distinct sysroot-seed UUID (7f9c5d11-...) so deployed NVIDIA and default systems never share machine IDs or partition UUIDs.
Pre-assembly steps run against /layer to prepare the NVIDIA rootfs: prepare-image.sh, systemd-sysusers, glib-compile-schemas, dconf update, and a usr/etc → etc migration required by bootc .
CI Build Matrix#
build.yml defines a two-entry matrix for default and nvidia variants :
| Variant | Element | Image suffix | continue-on-error |
|---|---|---|---|
default | oci/bluefin.bst | (none) | false |
nvidia | oci/bluefin-nvidia.bst | -nvidia | true |
Builds run serially (max-parallel: 1) due to the shared remote CAS at cache.projectbluefin.io being rate-limited to a single concurrent build . The nvidia variant has continue: true so a driver build failure doesn't block the base image release. After each build, artifacts are pushed to the remote CAS explicitly with bst artifact push --deps run .
ISO Packaging Note#
The dakota-iso build uses dakota-nvidia:stable as its payload — the live ISO boots the NVIDIA variant and auto-rebases to the non-NVIDIA image on first upgrade if NVIDIA hardware is not detected . This means dakota-nvidia is the universal install medium.