The Raspberry Pi Compute Module 5 is a serious upgrade for anyone building custom homelab hardware. Carrier board designs, industrial controllers, embedded cluster nodes: the CM5 fits them all. But unlike a standard Pi, you do not just drop in an SD card and boot. You need to flash eMMC storage directly, and that is where USB boot mode and rpiboot come in.
This post walks you through the full workflow: setting up the IO Board, flashing the CM5, and getting past the common snags that trip people up the first time.
💡 Why This Matters
The CM5 ships without storage in some configurations, and even the eMMC variants need to be flashed before they are useful in a carrier board. The Compute Module 5 IO Board lets you do that over USB from a host machine before the module goes into its final carrier board. Getting comfortable with this process means faster iteration when you are prototyping or setting up multiple nodes.
Jeff Geerling has been digging into the CM5 ecosystem extensively, and in his hands-on with the official CM5 Programming Jig he concludes it is aimed at small businesses and systems integrators provisioning CM5s in volume, not individual tinkerers running a few small clusters. The official Compute Module 5 Programming Jig, launched on 19 August 2026 for $600, works differently from a desktop flashing setup. It clamps one CM5 at a time onto spring-loaded pogo pins, runs its own Jig OS with Raspberry Pi's rpi-sb-provisioner, and writes an OS image you have already loaded onto the jig, with no IO board and no rpiboot session per module. For one or a handful of modules, the Compute Module 5 IO Board and rpiboot do the same job, and that is the workflow below.
🧰 Prerequisites
- A Raspberry Pi Compute Module 5 with eMMC (Lite variants have no eMMC, so you flash their boot storage the normal way instead)
- A Compute Module 5 IO Board, or a carrier board that exposes the nRPIBOOT (EMMC-DISABLE) signal and a USB device port
- A host machine running Linux, macOS, or Windows
-
rpibootinstalled on the host - Raspberry Pi Imager (or
ddif you prefer the command line) - A USB-C data cable from the host to the IO Board's USB-C slave port (J11). The older CM4 IO Board uses micro USB
Check the official Raspberry Pi documentation for the exact jumper positions and cable type required for your specific IO board or carrier board, as these details can vary between hardware revisions.
Step 1: Install rpiboot on Your Host Machine
The rpiboot utility is what tells the CM5 to expose its eMMC as a USB mass storage device. On a Debian or Ubuntu host, install the dependencies and build from source:
sudo apt update sudo apt install git libusb-1.0-0-dev pkg-config build-essential git clone --recurse-submodules --shallow-submodules --depth=1 https://github.com/raspberrypi/usbboot cd usbboot make On Raspberry Pi OS you can skip the build with sudo apt install rpiboot and then run plain sudo rpiboot. On macOS, the usbboot README has you install libusb and pkg-config with Homebrew and build from source. On Windows, Raspberry Pi provides a prebuilt installer on the usbboot releases page. Check the usbboot GitHub repo for the latest instructions for your platform.
Step 2: Prepare the IO Board
Seat the CM5 on the IO Board so it lies flat and both connectors are fully engaged. Fit the nRPI_BOOT jumper on J2 (labelled "disable eMMC Boot") before you apply power or connect the USB cable. Without this step, the module will try to boot normally instead of exposing its storage over USB.
Connect the IO Board's USB-C slave port (J11) to your host machine with a USB-C data cable. Then connect the IO Board to its own USB-C power supply, as the official flashing guide does, rather than relying on the host's USB port for power.
Step 3: Mount the eMMC as Mass Storage
With the IO Board connected and powered, run rpiboot on the host:
cd usbboot sudo ./rpiboot -d mass-storage-gadget64 You should see the tool enumerate the device and load the bootloader. After a few seconds, the eMMC will appear as a block device on your host. On Linux it will typically show up as something like /dev/sdX. Use lsblk to confirm:
lsblk Look for a new device that was not there before. Do not assume it is a specific device letter. Confirm the size matches your CM5 eMMC capacity before proceeding.
Step 4: Flash Your OS Image
Open Raspberry Pi Imager, select your image (Raspberry Pi OS Lite is a solid choice for headless homelab nodes), and select the eMMC device as the target. Apply any custom settings like hostname, SSH keys, and WiFi credentials before writing.
If you prefer the command line, use dd with the correct device path:
sudo dd if=your-image.img of=/dev/sdX bs=4M status=progress conv=fsync Replace /dev/sdX with your actual device. Double-check this. Writing to the wrong device will overwrite data on your host machine.
Step 5: Eject, Remove the Jumper, and Boot
Once the flash completes, safely eject the device from your host:
sudo eject /dev/sdX Remove the nRPI_BOOT jumper from J2 so the CM5 boots from eMMC on next power-up. Disconnect the USB cable, then move the CM5 to its carrier board or simply power-cycle it on the IO Board. The module should come up and be reachable over SSH if you set that up in Imager.
🛡️ Security
Before the CM5 goes into production, lock it down properly. Default credentials are a risk even on a private network.
- Disable password authentication for SSH and use key-based auth only
- Change the default hostname from
raspberrypito something meaningful and non-guessable - Enable and configure
ufworiptablesto restrict inbound ports - Keep the system updated:
sudo apt update && sudo apt full-upgrade - If the CM5 is accessible from outside your LAN, put it behind a VPN or reverse proxy
🔧 Troubleshooting
rpiboot does not detect the CM5. Confirm the USB boot jumper is set correctly. Try a different USB cable, as some cables are charge-only and do not carry data. Also try a different USB port on your host, preferring USB-A ports directly on the motherboard over hubs.
The eMMC does not appear after rpiboot completes. Check that you are running rpiboot with sudo. On Linux, the device can sometimes take 10 to 15 seconds to appear after the tool finishes. Run lsblk again after waiting.
Flash completes but the CM5 does not boot. Verify the boot jumper was actually removed or reset before powering the carrier board. If it is still in USB boot mode, the module will try to enumerate over USB instead of booting from eMMC. Also confirm your image is compatible with CM5 specifically. Some older images may not include the correct firmware for CM5 hardware.
Power issues during flashing. Power the IO Board from a proper USB-C supply. Raspberry Pi specifies the same standard as the Raspberry Pi 5: 5 V at 5 A (25 W), or 5 V at 3 A (15 W) with a 600 mA peripheral limit. Underpowered setups cause incomplete flashes that can corrupt the eMMC.
✅ Wrap Up
The CM5 IO Board and rpiboot workflow is not complicated once you have done it once. Install rpiboot, set the boot jumper, mount the eMMC over USB, flash your image, remove the jumper, and boot. The steps are repeatable and fast enough to be practical for multi-node homelab setups.
If you are building carrier boards or integrating the CM5 into custom hardware, getting this process dialed in early saves a lot of headache later. Check Jeff Geerling's coverage of the CM5 ecosystem for deeper dives into carrier board compatibility and CM5-specific quirks, and bookmark the official Compute Module documentation for the authoritative reference on IO Board jumpers and boot modes. If you ever need to provision CM5s in volume, the Compute Module 5 Programming Jig documentation covers the official jig.
Related from the lab
- Pironman 5 Max Case Setup
- Proxmox VE Now Officially Supports ARM64: What It Means for Homelabs
- Why You Shouldn't Power a Raspberry Pi Through Its GPIO Pins
Originally published at codewithromi.com.

