Software
25 minute read
Operating System
The Cruiser is designed to work with Raspberry Pi OS (recommended) or other Debian-based Linux distributions for CM5. No custom OS image is required.
Raspberry Pi OS, Debian Trixie, Ubuntu 25.10, and Ubuntu 26.04 LTS are all supported for full Cruiser functionality, including PoE management and ESP32-C6 wireless. The ESP32-C6 runs either a WiFi + Bluetooth firmware (factory default) or a Zigbee coordinator firmware (beta) - not both at once. See the ESP32 Wireless Module page.
Ubuntu 24.04 LTS and earlier are not supported: those kernels lack the RP1 SDIO driver (CONFIG_MMC_SDHCI_OF_DWCMSHC) that the ESP32-C6 wireless features depend on.
Firmware
Board firmware is pre-flashed at the factory. The ESP32-C6 module ships with the WiFi + Bluetooth firmware, which also handles board control functions (PoE management, etc.). A separate Zigbee coordinator firmware (beta) is available on request - the module has one 2.4 GHz radio and a Zigbee coordinator cannot reliably share it with WiFi, so you choose one image. See the ESP32 Wireless Module page.
Firmware Updates
You can update the ESP32 PoE firmware on your Cruiser with exaviz-flash:
sudo apt update
sudo apt install exaviz-tools
sudo exaviz-flash update
It takes about a minute, backs up your current firmware first, and your PoE devices lose power while it runs. See Firmware Updates for what to expect, how to recover from a failed update, and troubleshooting.
Released firmware versions are listed on the Product Changelogs page.
Drivers and Software
Hardware support is provided through:
- Mainlined drivers — Most functionality works with standard Linux kernels
- Exaviz packages — Additional drivers and tools for full functionality
Available Packages
| Package | Description |
|---|---|
| exaviz-dkms | Kernel modules for Cruiser hardware (required) |
| exaviz-pse-dkms | IP808AR PoE driver — required if using the Interceptor PoE Add-on Board |
| exaviz-netplan | Network configuration for WAN port and PoE switch |
| exaviz-poe-tool | PoE port monitoring and control: a GTK3 desktop app and exaviz-poe-tui, a terminal UI and scriptable command line that needs no desktop |
Adding the Exaviz Repository
# Download and install the Exaviz signing key
curl -fsSL https://apt.exaviz.com/exaviz-repo-key.asc | sudo gpg --dearmor -o /usr/share/keyrings/exaviz-archive-keyring.gpg
# Detect distribution and add the repository
DISTRO=$(lsb_release -cs 2>/dev/null || (grep VERSION_CODENAME /etc/os-release 2>/dev/null | cut -d= -f2) || echo "trixie")
echo "deb [arch=arm64 signed-by=/usr/share/keyrings/exaviz-archive-keyring.gpg] https://apt.exaviz.com ${DISTRO} main" | sudo tee /etc/apt/sources.list.d/exaviz.list
# Update package lists
sudo apt update
The script automatically detects your distribution:
- Raspberry Pi OS Trixie → uses
trixie - Debian 13 (Trixie) → uses
trixie - Debian 12 (Bookworm) → uses
bookworm(still supported through our apt packages; only the Exaviz Bookworm OS image is deprecated) - Ubuntu 25.10 (Questing) → uses
questing - Ubuntu 26.04 LTS (Resolute) → uses
resolute
Exaviz packages are available for Ubuntu 25.10 (Questing Quokka) and Ubuntu 26.04 LTS (Resolute Raccoon). Ubuntu 24.04 LTS and earlier are not supported. See the operating system note above for details.
A fresh Ubuntu 26.04 installs linux-image-raspi but not the matching linux-headers-raspi. Without the raspi headers, DKMS builds against the generic kernel headers instead of the running Raspberry Pi kernel, and the modules will not load. Install the raspi headers, then rebuild:
sudo apt install linux-headers-raspi linux-headers-$(uname -r)
sudo dkms autoinstall -k $(uname -r)
sudo reboot
Installing Packages
Minimum installation (drivers only):
sudo apt install exaviz-dkms
The exaviz-dkms package provides:
- PoE switch drivers (RTL8365MB)
- DSA framework support for switch management
- Device tree overlays for CM5
Recommended installation (drivers + network configuration):
sudo apt install exaviz-dkms exaviz-netplan
The exaviz-netplan package:
- Configures switch and PoE port interfaces
- Sets up PoE switch port interfaces
- Optionally runs a DHCP server for connected PoE devices
Full installation (all packages):
sudo apt install exaviz-dkms exaviz-netplan exaviz-poe-tool
The exaviz-poe-tool package provides a graphical interface for:
- Real-time PoE port status monitoring, with ports listed in order
- Viewing power consumption per port
- Seeing which af or at mode each port is currently on
- Resetting individual ports
- Temperature and voltage monitoring
- An Updated column showing how long ago each row last received real data, so a reading that has stopped refreshing cannot be mistaken for a live one
After installation, reboot to load the modules:
sudo reboot
Verify modules are loaded:
lsmod | grep -E "rtl8365mb|realtek"
You should see rtl8365mb and either realtek_smi (kernel 6.8+) or realtek_dsa (older kernels).
Recommended Setup
- Flash Raspberry Pi OS (64-bit) or Debian Trixie to your CM5
- Boot and complete initial setup
- Add the Exaviz repository and install packages:
sudo apt install exaviz-dkms exaviz-netplan exaviz-poe-tool - Reboot
Raspberry Pi OS, Debian Trixie, Ubuntu 25.10, and Ubuntu 26.04 LTS are all supported for full Cruiser functionality. Ubuntu 24.04 LTS and earlier are not supported.
Network Configuration
Network Interfaces
| Interface | Description | Default |
|---|---|---|
eth0 | CM5 built-in 1GbE → RTL8367RB switch (internal) | Auto-configured |
eth1 | 2.5GbE WAN port (J15) | Requires manual configuration |
poe0-poe7 | Switch ports (J16)* | Configured by exaviz-netplan |
eth0 is the CM5’s built-in 1GbE interface that connects internally to the RTL8367RB switch chips. This is the upstream connection for the switch ports (poe0-poe7). You typically don’t need to configure eth0 directly—it’s automatically set up by the system. The switch ports are managed through the DSA (Distributed Switch Architecture) interface.
*Port count depends on model: 8 ports on Cruiser, 4 ports on Cruiser Lite and Keel. PoE power delivery is available only on Cruiser and Cruiser Lite models.
Configuring the Upstream / WAN Port (eth1)
The eth1 interface (2.5GbE WAN port, RTL8156BG) is not configured by exaviz-netplan and requires manual setup. To bring it up with DHCP:
sudo ip link set eth1 up
sudo dhclient eth1
For a persistent configuration, add a Netplan file:
# /etc/netplan/10-wan.yaml
network:
version: 2
ethernets:
eth1:
dhcp4: true
sudo netplan apply
Configuring the Switch Network (IP Cameras)
The switch ports (poe0-poe7*) are connected to the CM5 through an internal Ethernet switch using Linux DSA (Distributed Switch Architecture). By default, devices connected to the switch ports are on a separate network segment from your main network.
*Port count depends on model: 8 ports on Cruiser, 4 ports (poe0-poe3) on Cruiser Lite and Keel.
Automatic Setup (Recommended)
The exaviz-netplan package configures a DHCP server for connected PoE devices. During installation, you select which ports should provide DHCP addresses. Connected devices (cameras, etc.) will automatically receive IP addresses.
sudo apt install exaviz-netplan
To reconfigure later:
sudo dpkg-reconfigure exaviz-netplan
Manual Setup
If you prefer manual control or need a non-standard configuration:
Quick test with static IP:
Find the address on the PoE port your camera is plugged into (here,
poe0):ip addr show poe0If the port has no address (manual setup, with no DHCP server configured), assign one:
sudo ip addr add 10.100.0.1/24 dev poe0 sudo ip link set poe0 upConfigure your camera with a static IP in that same subnet (e.g., if
poe0is10.100.0.1/24, set the camera to10.100.0.100).Test:
ping 10.100.0.100
Bridge to main network (flat “switch mode”):
By default exaviz-netplan puts each PoE port on its own /24 subnet with a small local DHCP server: dnsmasq, configured per port in /etc/dnsmasq.d/00-exaviz-dhcp-server-interfaces.conf from the ports you selected at install time (rerun sudo dpkg-reconfigure exaviz-netplan to change the selection). A camera on poe1 gets 10.100.1.x, poe2 gets 10.100.2.x, and so on. That isolates each camera, but it also means the cameras are not on your main LAN, do not get addresses from your router, and (because the board does not route or NAT between those per-port subnets and the WAN) cannot reach the internet for NTP or updates.
There is no “switch mode” toggle; you build a flat layout yourself by bridging all the PoE ports together with the WAN uplink, so the Cruiser and every camera sit on one network served by your upstream router’s DHCP, like an ordinary unmanaged switch.
A quick map of the interfaces (they form a small internal switch tree, so the names look unusual):
| Interface | What it is |
|---|---|
eth1 | 2.5 GbE WAN port, your uplink to the router (RTL8156BG, USB) |
poe0-poe7 | The front-panel PoE / switch ports (cameras plug in here) |
eth0 | The CM5’s internal link to the switch (the DSA conduit / CPU port, not a front port) |
ext0_1, ext0_2 | Internal links between the switch chips (not front ports) |
Only eth1 and poe0-poe7 go in the bridge. Leave eth0, ext0_1, and ext0_2 alone; they are the internal plumbing that has to stay up for the switch to work.
On these images the Netplan back end is NetworkManager, which rewrites the files in /etc/netplan/ into its own 90-NM-*.yaml on every boot. A bridges: stanza you add by hand is silently regenerated and its interface bindings dropped. The reliable way is to configure NetworkManager directly with nmcli (below); those connections persist across reboots.
The commands below put the WAN port into the bridge, so if you are connected over SSH on that port your session will drop and the board will come back on a new address from your router. Run them from the local console (HDMI + keyboard), or make sure you have a second way in first (the board’s WiFi, or the console) and are ready to reconnect on the new address.
Run these commands (Raspberry Pi OS / Debian):
# 1. Turn off the per-port DHCP servers (dnsmasq)
sudo systemctl disable --now dnsmasq
# 2. Remove the per-port connections and the standalone WAN connection so they
# do not fight the bridge. List them first to confirm the names on your box:
nmcli -t -f NAME,DEVICE con show | grep -E '(poe[0-7]|eth[01]):'
for i in $(seq 0 7); do sudo nmcli con delete "netplan-poe$i" 2>/dev/null; done
sudo nmcli con delete netplan-wan-cruiser 2>/dev/null # the eth1 / WAN connection
# 3. Create the bridge and add the WAN uplink + all PoE ports.
# autoconnect-priority keeps the bridge ports from being grabbed by the
# generic conduit connection at boot. (On a 4-port Lite/Keel, use poe0..poe3.)
sudo nmcli con add type bridge con-name br0 ifname br0 \
bridge.stp no ipv4.method auto ipv6.method ignore
for i in eth1 poe0 poe1 poe2 poe3 poe4 poe5 poe6 poe7; do
sudo nmcli con add type ethernet con-name "br0-$i" ifname "$i" master br0 \
connection.autoconnect-priority 100
done
sudo nmcli con up br0
bridge.stp no disables spanning-tree, which is fine for cameras and end devices; leave it off unless you are chaining switches in a way that could form a loop.
br0 now requests an address from your router, and every camera on a PoE port does too. Verify:
ip -br addr show br0 # br0 should hold an address on your router's subnet
nmcli device status # eth1 + poe0..7 show "connected" with master br0
A camera that already holds a per-port lease (e.g. 10.100.1.50) keeps using it until that lease expires; it does not immediately jump to the new network. Power-cycle or reboot the camera (or wait out its DHCP lease) and it will pick up an address from your router. Newly connected cameras get a router address right away.
To return to the default per-port layout, delete the br0* connections (nmcli con delete), re-enable dnsmasq, and run sudo dpkg-reconfigure exaviz-netplan.
Ubuntu (systemd-networkd)
On Ubuntu images the Netplan back end is systemd-networkd, not NetworkManager, so a hand-written bridges: stanza in /etc/netplan/ does persist across reboots (the Debian rewrite problem above does not apply). The result is the same flat layout, verified on Ubuntu 26.04.
A few Ubuntu-specific details, all confirmed in the field:
- The WAN port is named
wan(noteth1) onceexaviz-netplanis installed. Confirm your names withip -br linkbefore you start. 00-exaviz-wan.yamlruns DHCP onwan, which conflicts withwanbecoming a bridge member. Retire that file (or disable itsdhcp4) as part of the switch.- Your Wi-Fi password lives in
50-cloud-init.yaml, which this procedure removes. If Wi-Fi is your way back in during the change, migrate it first (below) or you will cut off your own lifeline.
Putting the WAN port into the bridge will drop your SSH session, and the board comes back on a new address from your router. If you rely on Wi-Fi as a second way in, do step 1 first and confirm Wi-Fi is still up before touching anything else. Better still, run the whole thing from the local console (HDMI + keyboard).
# 1. FIRST: move Wi-Fi into its own file so removing 50-cloud-init.yaml later
# does not take your Wi-Fi (and your lifeline) with it. Put your SSID + PSK here.
# (wlan0 is the CM5's built-in Wi-Fi; confirm your interface name with `ip -br link`.)
sudo tee /etc/netplan/90-wifi.yaml >/dev/null <<'EOF'
network:
version: 2
renderer: networkd
wifis:
wlan0:
access-points:
"YOUR_SSID": {password: "YOUR_PASSPHRASE"}
dhcp4: yes
optional: true
EOF
sudo chmod 600 /etc/netplan/90-wifi.yaml
sudo netplan apply # confirm Wi-Fi is still connected before continuing
# 2. Back up your current network config (so you can revert):
sudo cp -a /etc/netplan /root/netplan.bak
# 3. Stop the per-port DHCP and retire the files that fight the bridge:
sudo systemctl disable --now dnsmasq
sudo rm -f /etc/netplan/01-exaviz-dhcp-server-interfaces.yaml
sudo rm -f /etc/netplan/00-exaviz-wan.yaml # its DHCP-on-wan conflicts with bridging
# take networking over from cloud-init, then remove its file (Wi-Fi is safe in 90-wifi.yaml now):
echo 'network: {config: disabled}' | sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
sudo rm -f /etc/netplan/50-cloud-init.yaml
# 4. Create the bridge (WAN + all PoE ports; leave eth0/ext0_1/ext0_2 out).
# On a 4-port Lite/Keel, delete the poe4-poe7 lines in BOTH the ethernets:
# block AND the bridge interfaces: list below (a stale member leaves br0 degraded).
sudo tee /etc/netplan/01-exaviz-switch-mode.yaml >/dev/null <<'EOF'
network:
version: 2
renderer: networkd
ethernets:
eth0: {dhcp4: no, dhcp6: no, optional: true}
ext0_1: {dhcp4: no, dhcp6: no, optional: true}
ext0_2: {dhcp4: no, dhcp6: no, optional: true}
wan: {dhcp4: no, dhcp6: no, optional: true}
poe0: {dhcp4: no, optional: true}
poe1: {dhcp4: no, optional: true}
poe2: {dhcp4: no, optional: true}
poe3: {dhcp4: no, optional: true}
poe4: {dhcp4: no, optional: true}
poe5: {dhcp4: no, optional: true}
poe6: {dhcp4: no, optional: true}
poe7: {dhcp4: no, optional: true}
bridges:
br0:
interfaces: [poe0,poe1,poe2,poe3,poe4,poe5,poe6,poe7,wan]
dhcp4: yes
dhcp6: no
optional: true
mtu: 1500
parameters: {stp: false, forward-delay: 0}
EOF
sudo chmod 600 /etc/netplan/01-exaviz-switch-mode.yaml
# 5. Validate (no live change), then apply:
sudo netplan generate
sudo netplan apply
br0 now takes one address from your router, and every camera on a PoE port does too. Verify with ip -br addr show br0.
If you run a KVM guest (for example Home Assistant OS) that needs to be on the flat network, attach it to the bridge, not libvirt’s default NAT, or it will keep working but stay stuck behind NAT. A wan port cannot be enslaved into the bridge while a macvtap interface hangs off it (Device or resource busy), so use this order: define a bridged network, shut the guest, retarget its NIC to the bridge by MAC, start the guest, then bring the bridge up. (If a guest is running, expect step 5’s netplan apply to report wan busy and leave the bridge without its uplink; that is normal, and the block below completes the enslave.)
echo '<network><name>br0net</name><forward mode="bridge"/><bridge name="br0"/></network>' | sudo virsh net-define /dev/stdin
sudo virsh net-autostart br0net && sudo virsh net-start br0net
sudo virsh shutdown <your-vm>
sudo virt-xml <your-vm> --edit --network network=br0net # assumes a single NIC
sudo virsh start <your-vm>
sudo networkctl reconfigure wan
Same caveats as the Debian recipe: keep device MTU at or below 1500 (the internal switch tagging caps the path), existing cameras keep their old per-port lease until they power-cycle, and if any integration reaches the board by IP (for example an MQTT PoE bridge), re-point it at the bridge’s new address. In switch mode the Home Assistant PoE plugin needs the switch-mode-aware release to identify devices on a port (neighbours attach to br0, not to poeN).
To revert to the default per-port layout, run this from the console (restoring the backup alone is not enough: the switch-mode file was created after the backup, and dnsmasq was disabled):
sudo rm -f /etc/netplan/01-exaviz-switch-mode.yaml /etc/netplan/90-wifi.yaml \
/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
sudo cp -a /root/netplan.bak/. /etc/netplan/ # brings back 50-cloud-init.yaml, 00-exaviz-wan.yaml, per-port files
sudo systemctl enable --now dnsmasq # re-enable per-port DHCP
sudo netplan apply
WiFi Setup
If you used Raspberry Pi Imager to flash your OS image, you may have already configured WiFi during the initial setup. Check if WiFi is working before following the steps below.
The Cruiser can use WiFi from two sources:
- CM5 built-in WiFi (if your CM5 module includes WiFi)
- ESP32-C6 module WiFi - shipping as the factory default firmware (see note below)
Using CM5 Built-in WiFi
For compute modules with built-in WiFi (CM5 with wireless), configure WiFi using wpa_supplicant:
# Create WiFi configuration
wpa_passphrase "YourNetworkName" "YourPassword" | \
sudo tee /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
# Enable WiFi at boot
sudo systemctl enable wpa_supplicant@wlan0
sudo systemctl start wpa_supplicant@wlan0
Restart networking:
sudo systemctl restart wpa_supplicant@wlan0
ESP32-C6 WiFi
The factory WiFi + Bluetooth firmware provides WiFi 6 and Bluetooth LE on the ESP32-C6. Zigbee is a separate beta firmware - all three share one 2.4 GHz radio, and a Zigbee coordinator needs it continuously, so it cannot reliably run alongside WiFi. The module runs one image at a time.
Recommended smart-home setup: flash the Zigbee coordinator firmware on the ESP32-C6 and use the CM5’s built-in WiFi for network connectivity (separate radios, no coexistence issues).
For full ESP32 configuration details and how to request the Zigbee firmware, see the ESP32 Wireless Module page.
PoE Port Management
Cruiser uses /dev/pse instead of /proc/pse. This is a purposeful design choice based on Linux filesystem conventions:
/devcontains device files that serve as interfaces to hardware devices. Since PSE (Power Sourcing Equipment) is a hardware device interface,/dev/pseis the appropriate location./procis a virtual filesystem that exposes dynamic kernel and process information, not device interfaces.
The /dev/pse interface provides the same functionality as /proc/pse on other Exaviz products. Future Exaviz OS images will also use /dev/pse.
Checking PoE Status
head -20 /dev/pse
The /dev/pse interface is a streaming interface. Reading it with cat will continuously output status updates. Use Ctrl+C to stop, or capture a single snapshot with head:
head -20 /dev/pse
Example output (streams continuous data):
0-0: power-on 0 15.50 47.8750 0.05250/0.80000 34.0625/150.0000
0-1: detecting ? 0.00 47.8750 0.00000/0.80000 35.5625/150.0000
0-2: detecting ? 0.00 47.8750 0.00000/0.80000 36.4375/150.0000
...
Using PoE Tool (GUI)
Install the exaviz-poe-tool package for a graphical PoE management interface:
sudo apt install exaviz-poe-tool
Using PoE Tool from a terminal
The same package also installs exaviz-poe-tui, which does everything the desktop
app does without needing a desktop. It is a single static binary, so on a Lite
image you can skip the GTK libraries entirely:
sudo apt install --no-install-recommends exaviz-poe-tool
Run it with no arguments for an interactive terminal UI:
sudo exaviz-poe-tui
Inside the UI, press h or ? for help. Arrow keys or j/k select a row,
e enables the selected port, x disables it (asking first), r power cycles
it, a and t force af or at mode, and q quits.
One-off commands
Every action is also available as a subcommand, so you do not need the UI:
exaviz-poe-tui status # one line per port
exaviz-poe-tui status --json # machine-readable, for scripts
sudo exaviz-poe-tui up poe3 # enable a port
sudo exaviz-poe-tui down poe3 # disable a port
sudo exaviz-poe-tui reset poe3 # power cycle a port
sudo exaviz-poe-tui mode poe3 af # force the class budget to af, or at
Add --dry-run to any action to print what it would send without sending it.
That is worth using whenever a script picks the port, so you can see which port
the name resolved to before anything is switched.
Enabling or disabling a port, and setting af or at mode, are runtime
settings. They take effect immediately and they are lost when the board reboots,
because the PoE controller holds them in memory rather than in flash. PoE power
delivery itself does come back after a reboot.
If you need a setting to persist, run the command from a startup script. The tool prints a reminder whenever you set one of these.
Port names
Two forms are accepted. 0-3 means controller 0, port 3, and is always
unambiguous. poe3 is the OS interface name, and is accepted only when telemetry
is readable, because ports-per-controller differs between products: poe7 is
1-3 on a Cruiser and 0-7 on an Interceptor. It is resolved from what the
board actually reports rather than assumed.
Writing scripts against it
Parse the --json output rather than the columns. The plain text is written for
people to read and may be reformatted; the JSON is the stable contract.
The exit codes are meant to be checked:
| Code | Meaning |
|---|---|
0 | Success |
1 | Operational failure: no device, write refused, permission denied |
2 | Usage error: unknown command, bad port, missing argument |
3 | Device busy, another process is reading it. Retryable |
4 | Timed out waiting for telemetry |
Code 3 is deliberate. The telemetry device takes a single reader, and two
readers garble each other, so status refuses rather than print values it cannot
trust. If the desktop app or the management service is already reading the
device, the terminal tool tells you so instead of showing you nonsense.
Writing to a port needs access to the telemetry device, so run under sudo or add
your user to the dialout group. Disabling a port is recorded to syslog, so a
cron job that cuts power leaves a trace even if its output is discarded.
PoE Port Status Values
| Status | Meaning |
|---|---|
power-on | Device detected and receiving power |
detecting | Port enabled, looking for device |
disabled | Port administratively disabled |
fault | Error condition |
backoff | Temporary backoff after detection failure |
Customizing Port Names
By default, the /dev/pse output shows ports using their physical controller-port identifiers (e.g., 0-0, 0-1, 1-0). The exaviz-dkms package configures friendly names like poe0, poe1, etc. during installation based on your board model.
You can customize these names to match physical labels on your enclosure or identify connected devices (e.g., camera1, doorbell).
Method 1: Using debconf (Recommended)
Run the package reconfiguration with low priority to access the port naming option:
sudo dpkg-reconfigure -plow exaviz-dkms
The -plow flag shows the low-priority port naming question, which is not displayed during normal installation. You’ll be prompted to enter a comma-separated list of port names.
After changing port names, you must reboot for the changes to take effect.
Method 2: Manual config.txt Editing
For automation or scripting, you can directly edit /boot/firmware/config.txt and add port name parameters to the dtoverlay line:
dtoverlay=cruiser-raspberrypi-cm5,p1_0_name=poe0,p1_1_name=poe1,p1_2_name=poe2,p1_3_name=poe3,p0_0_name=poe4,p0_1_name=poe5,p0_2_name=poe6,p0_3_name=poe7
Port Parameter Reference
The Cruiser has up to three network switches. Port parameters follow the format pX_Y_name where X is the switch number and Y is the port on that switch.
| Parameter | Physical Location | Default Name (Cruiser) |
|---|---|---|
p1_0_name - p1_3_name | Switch 1 (leftmost, 4 ports) | poe0 - poe3 |
p0_0_name - p0_3_name | Switch 0 (middle, 4 ports) | poe4 - poe7 |
p2_0_name - p2_7_name | Switch 2 (expansion, 8 ports) | poe8 - poe15 |
Model-Specific Defaults
Each Cruiser model has different default port configurations:
| Model | Default Port Names |
|---|---|
| Cruiser (8 built-in + 8 expansion) | poe0 - poe15 |
| Cruiser Lite (4 built-in + 8 expansion) | poe0 - poe11 |
| Cruiser Keel (4 switch + 8 expansion) | swp0 - swp3, poe0 - poe7 |
The Cruiser Keel is a non-PoE model. Its first 4 ports (swp0-swp3) are standard switch ports. The poe0-poe7 names are for optional PoE expansion boards.
Storage Setup
NVMe Configuration
NVMe drives are automatically detected as /dev/nvme0n1.
Check NVMe status:
# List NVMe devices
nvme list
# View detailed info
nvme smart-log /dev/nvme0n1
SATA Configuration
SATA drives appear as /dev/sda and /dev/sdb.
# List block devices
lsblk
# View SATA controller
lsusb | grep JMS
Hardware RAID (DIP Switch)
The JMS561 controller supports hardware RAID via DIP switch S3 and the RAID Initialize button (S2).
See Hardware Interface - RAID DIP Switch for switch positions and the step-by-step procedure.
Changing RAID mode will destroy all data on the SATA drives. Back up your data first!
JMicron RAID Manager (raidmgr_static)
The JMicron raidmgr_static tool is essential for RAID management:
- Only way to delete a RAID array — DIP switches can only create arrays, not delete them
- Only way to view array status — check current RAID mode, drive health, and capacity
- Configure RAID without power cycling — create RAID 0, RAID 1, or JBOD via software
SPAN mode requires hardware DIP switches and cannot be created via this tool.
Download: raidmgr_static_cloudshell2.zip (from ODROID wiki)
After downloading, extract and install on the Cruiser:
unzip raidmgr_static_cloudshell2.zip
sudo install -m 755 raidmgr_static /usr/sbin/
sudo raidmgr_static
Common commands:
| Command | Description |
|---|---|
GC | Get available controllers |
DC C0 | Display controller 0 info |
SS C0 | Show SATA drive info |
SR C0 | Show RAID status |
SF C0 | Show firmware version |
CR C0 D0,1 R0 | Create RAID 0 with disks 0 and 1 |
CR C0 D0,1 R1 | Create RAID 1 with disks 0 and 1 |
CR C0 D0,1 JBOD | Create JBOD (combined volume) |
DR C0 R0 | Delete RAID array 0 |
EX | Exit |
Example: Detect controller and show info
JMS56X> GC
--> Total available JMS56X controllers = 1 <--
JMS56X> DC C0
Controller[0]
-- ChipID = 10
-- SerialNumber = 427491329
-- Sata[0]
------ ModelName = WDC WD22PURZ-74B4ZY0
------ SerialNumber = WD-WX12D14845V6
------ FirmwareVer = 80.00A80
------ Capacity = 1863 GB
------ PortType = Hard Disk
------ PortSpeed = Gen 3
-- Sata[1]
------ ModelName = WDC WD22PURZ-74B4ZY0
------ SerialNumber = WD-WX12D1484DLY
------ FirmwareVer = 80.00A80
------ Capacity = 1863 GB
------ PortType = Hard Disk
------ PortSpeed = Gen 3
JMS56X> SF C0
Firmware Version = V9E.01.00.04
Example: Create RAID 0 and verify
JMS56X> CR C0 D0,1 R0
JMS56X> SR C0
-- Raid[0]
------ ModelName = S/W RAID0
------ Capacity = 3725 GB
------ RaidStatus = Normal
------ RaidLevel = RAID 0
------ RaidMbrCount = 2
Creating or deleting RAID arrays will destroy all data on the affected drives. The controller may briefly disconnect from USB during RAID changes.
The JMS561 hardware RAID performs optimally with default Linux settings. I/O schedulers and queue depth have minimal impact. Do not disable drive write cache (hdparm -W0) — this degrades random write performance by over 70%.
Linux Software RAID (mdadm)
As an alternative to hardware RAID, you can use Linux software RAID (mdadm). This bypasses the JMS561 controller’s RAID features entirely.
Hardware vs Software RAID (2-Drive Comparison)
| Feature | Hardware (JMS561) | Software (mdadm) |
|---|---|---|
| RAID Levels | 0, 1, JBOD, SPAN | 0, 1 |
| Survives OS reinstall | Yes | No (must reassemble) |
| Monitoring | raidmgr_static only | mdmonitor, email alerts |
| CPU usage | ~0% | 3-5% during I/O |
| Random write IOPS | Baseline | 5.5x better (RAID 0) |
| Sequential throughput | ~315 MiB/s | ~310 MiB/s (same) |
| Maturity | Proprietary firmware | Decades of production use |
| Portability | Needs same controller | Works on any Linux |
| Setup complexity | DIP switches | More Linux knowledge |
Choose hardware RAID if:
- You want zero CPU overhead
- Simple setup that survives OS reinstalls
- You need SPAN mode (hardware only)
- You’re not comfortable with Linux administration
Choose software RAID (mdadm) if:
- You need good random I/O performance (databases, VMs)
- You want failure alerts via email
- You may need to recover data on a different system
- You plan to expand storage later
If you add more drives via USB 3.0 enclosures or an M.2 SATA adapter (JMB585), mdadm unlocks additional RAID levels like RAID 5, 6, and 10. See Storage Questions for expansion options.
mdadm Example
# Install mdadm
sudo apt install mdadm
# Create partitions on each drive (use full disk)
sudo parted /dev/sda mklabel gpt
sudo parted /dev/sda mkpart primary 0% 100%
sudo parted /dev/sdb mklabel gpt
sudo parted /dev/sdb mkpart primary 0% 100%
# Create RAID 1 array using partitions (not raw devices)
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
# Save configuration (important for boot)
sudo mdadm --detail --scan >> /etc/mdadm/mdadm.conf
sudo update-initramfs -u
# Format and mount
sudo mkfs.ext4 /dev/md0
sudo mount /dev/md0 /mnt/storage
Always create RAID arrays with partitions (e.g., /dev/sda1) rather than raw devices (/dev/sda). Raw device arrays can fail to reassemble after reboot due to device enumeration changes, requiring manual intervention to recover.
To use software RAID, the JMS561 must present two independent drives for mdadm to manage:
- Delete any existing hardware array using
raidmgr_static(see commands above) - Set DIP switches to JBOD — both switches OFF
If lsblk shows a single large drive instead of two separate drives, a hardware array still exists and must be deleted first.
PCIe Gen 3 (Unofficial)
CM5 unofficially supports PCIe Gen 3 for faster NVMe performance.
Edit /boot/firmware/config.txt:
dtparam=pciex1_gen=3
Reboot and verify:
# Check link speed
sudo lspci -vv | grep -i lnksta
PCIe Gen 3 is not officially supported by Raspberry Pi, but multiple users report reliable operation. See Jeff Geerling’s PCIe testing for benchmarks.
Smart Home Integration
The Cruiser’s built-in ESP32-C6 module can act as a Zigbee coordinator without external USB dongles.
Zigbee coordination requires the Zigbee coordinator firmware (currently beta), which replaces the factory WiFi + Bluetooth image - the ESP32-C6 has one 2.4 GHz radio and a coordinator cannot reliably share it with WiFi, so it runs one or the other, not both. The coordinator uses the ZNSP protocol on /dev/ttyAMA4 and is driven by Home Assistant ZHA (via zigpy-espzb); zigbee2mqtt is not supported. To request a per-board image, contact support@exaviz.com. See the ESP32 Wireless Module page.
Note: Thread and Matter are not supported by Exaviz firmware. See the ESP32 documentation for custom firmware options.
Fan Control
PWM Fan (J19)
The 4-pin CPU fan supports PWM control:
# Check fan speed
cat /sys/class/hwmon/hwmon*/fan1_input
# Set PWM (0-255)
echo 128 | sudo tee /sys/class/hwmon/hwmon*/pwm1
3-Pin Fans (J20, J21)
3-pin fans run at full speed (12V). No software control available.
Troubleshooting
Board Won’t Power On
- Verify power supply meets minimum voltage for your model:
- Cruiser/Cruiser Lite: 48V minimum
- Cruiser Keel: 13V minimum (see Power Calculator for details)
- Check D2 (blue standby LED) — should be lit
- Press S0 (power button) or external power button
- Check for shorts on the CM5 module
No PoE Power
- Verify input voltage is 48V (required for PoE+)
- Check
/dev/psefor port status - Verify PoE device is 802.3af/at compliant
- Check total power budget isn’t exceeded
NVMe Not Detected
- Verify NVMe is properly seated in M.2 slot
- Check
dmesg | grep nvmefor errors - Try a different NVMe drive
- Ensure M.2 screw is securing the drive
WiFi Issues
See ESP32 Troubleshooting for WiFi, Bluetooth, and Zigbee issues.
WAN Port Green LED Not Working
The green WAN LED (1 GbE / 2.5 GbE indication) requires the exaviz-netplan package. Install or update it and the green LED enables automatically:
sudo apt update && sudo apt install --only-upgrade exaviz-netplan
The amber LED (10/100 Mbps and 1 GbE) works without any Exaviz software. On a stock operating system the green LED stays off by design.
Last modified October 11, 2026