Go to file
Mathias Beaulieu-Duncan 37f9292ef1 Update arm64 modules patch for Talos v1.12.4 (add ip6_gre)
Talos v1.12.4 added kernel/net/ipv6/ip6_gre.ko to modules-arm64.txt.
Update our patch to match. Also silence gmake checkouts-clean stdout
in auto-update.sh to prevent it leaking into GITHUB_OUTPUT.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 10:50:45 -05:00
.gitea/workflows Fix GNU sed PATH in CI workflows for macOS runner 2026-02-14 10:45:46 -05:00
config Initial commit: Talos CM5 builder with Gitea CI/CD 2026-02-09 17:58:17 -05:00
patches Update arm64 modules patch for Talos v1.12.4 (add ip6_gre) 2026-02-14 10:50:45 -05:00
scripts Update arm64 modules patch for Talos v1.12.4 (add ip6_gre) 2026-02-14 10:50:45 -05:00
.gitignore Initial commit: Talos CM5 builder with Gitea CI/CD 2026-02-09 17:58:17 -05:00
cosign.pub Add SBOM attestations to installer/release images, remove Scout 2026-02-13 16:48:56 -05:00
LICENSE Add LICENSE, update README, upgrade provenance to max-mode 2026-02-13 15:57:11 -05:00
Makefile Add supply chain attestation to installer image via crane + buildx 2026-02-13 21:57:54 -05:00
README.md Use rpiboot for EEPROM config in NVMe guide 2026-02-13 20:05:13 -05:00
TECHNICAL.md Add GRUB bootloader patches for talosctl upgrade on RPi5/CM5 2026-02-13 19:20:18 -05:00

Talos CM5 Builder

Custom Talos Linux images for Raspberry Pi 5 / CM5 on Compute Blade hardware.

Docker Hub Docker Pulls Docker Image Size

The official Talos Image Factory does not support CM5 — the mainline kernel lacks CM5 device trees and RP1 driver support. This builder uses the RPi downstream kernel (via talos-rpi5/talos-builder patches) to produce working CM5 images with our extensions and overclock config.

Current versions

Component Version
Talos Linux Talos version
RPi Kernel Kernel version
iscsi-tools iscsi-tools version
util-linux-tools util-linux-tools version

Image tags

Release images are published to docker.io/svrnty/talos-rpi5 with the format:

v<talos>-k<kernel>-<revision>

For example: v1.12.3-k6.12.47-2

Segment Meaning
v1.12.3 Upstream Talos Linux version
k6.12.47 RPi downstream kernel version
2 Build revision (bumped for config/patch changes on the same upstream versions)

Usage

Install from raw disk image

Download metal-arm64.raw.zst from the latest release and flash to eMMC:

zstd -d metal-arm64.raw.zst -o metal-arm64.raw
# Flash to eMMC/SD via your preferred tool (dd, balenaEtcher, etc.)

Upgrade an existing node

talosctl upgrade --image docker.io/svrnty/talos-rpi5:v1.12.3-k6.12.47-2

Note: In-place upgrades use GRUB with --no-nvram to work around the RPi5/CM5 SetVariableRT firmware limitation. This patch is included but not yet tested in production — re-flashing the disk image is the proven fallback.

# Fallback: re-flash method
zstd -d metal-arm64.raw.zst -o metal-arm64.raw
# Flash to eMMC/SD via your preferred tool

What's included

  • RPi downstream kernel with CM5/RP1 support (4K page size, aligned with upstream Talos)
  • GRUB bootloader with --no-nvram for reliable talosctl upgrade on RPi5/CM5
  • Overclock: 2.6GHz (arm_freq=2600, over_voltage_delta=50000, arm_boost=1)
  • Extensions: iscsi-tools, util-linux-tools

Known issues

No serial console output after boot (Fixed)

The overlay was using console=ttyAMA0 (GPIO 14/15 UART) but the RPi5/CM5 debug UART is ttyAMA10. Fixed by switching to console=ttyAMA10,115200 and adding earlycon=pl011,0x107d001000,115200n8 for early boot output. Also added [pi5] enable_uart=0 to config.txt to match upstream and avoid U-Boot compatibility issues.

Upstream: talos-builder#4

Install disk config ignored on SBCs

Talos ignores the machine.install.disk config field on SBC platforms. You must flash the disk image directly to your target disk (eMMC, SD, NVMe). For NVMe boot, dd the metal image to the NVMe drive and configure the EEPROM boot order (BOOT_ORDER=0xf416, PCIE_PROBE=1).

Upstream: talos-builder#22

Roadmap

This project targets production-ready Talos clusters on RPi5/CM5 hardware.

Status Milestone Description
Untested 4K page size Aligned with upstream Talos kernel config. Reduces memory overhead and improves workload compatibility (Longhorn, jemalloc, F2FS, etc.).
Untested Reliable in-place upgrades Force GRUB bootloader with --no-nvram on arm64 to work around the SetVariableRT firmware limitation (talos-builder#21).
Untested Serial console fix Use correct debug UART (ttyAMA10) with earlycon for early boot output.
Untested NVMe boot support dd image to NVMe + set EEPROM BOOT_ORDER=0xf416 and PCIE_PROBE=1. Kernel has CONFIG_BLK_DEV_NVME=y built-in.

NVMe boot (untested)

The kernel has NVMe built-in (CONFIG_BLK_DEV_NVME=y), so booting from NVMe should work by flashing the disk image directly and configuring the RPi5/CM5 EEPROM.

1. Flash the image to NVMe

Connect the NVMe drive via a USB adapter and flash:

zstd -d metal-arm64.raw.zst | sudo dd of=/dev/<nvme-device> bs=4M status=progress
sync

2. Configure EEPROM boot order

Use rpiboot to update the CM5 EEPROM. Clone the usbboot repo and edit the boot config:

git clone --depth=1 https://github.com/raspberrypi/usbboot
cd usbboot && make
# Edit the EEPROM config for CM5
cp recovery/boot.conf recovery/boot.conf.bak

Add or update these values in recovery/boot.conf:

BOOT_ORDER=0xf416
PCIE_PROBE=1

Then flash via USB with the CM5 in USB boot mode (hold nRPIBOOT or disable eMMC boot on your carrier board):

sudo ./rpiboot -d recovery

BOOT_ORDER is read right-to-left: try NVMe (6) first, then SD (1), then USB (4), then restart (f). PCIE_PROBE=1 is required for non-HAT+ NVMe adapters (Compute Blade, most M.2 carrier boards).

3. Boot from NVMe

Power on. The RPi firmware should find the boot partition on NVMe, load U-Boot, and boot Talos.

Optional: enable PCIe Gen 3

Add to your configTxtAppend overlay option or directly to config.txt on the boot partition:

dtparam=pciex1_gen=3

This doubles throughput (~400 MB/s Gen 2 to ~800 MB/s Gen 3). Not officially certified by Raspberry Pi but works on most NVMe drives.

Building

For local builds, CI/CD setup, runner configuration, and project structure, see TECHNICAL.md.

License

This project is licensed under the Mozilla Public License 2.0.

It builds upon the following MPL 2.0 licensed upstream projects:

Our patches to these projects are in the patches/ directory and are distributed under the same MPL 2.0 terms.