NVMe Storage

NVMe Storage

Partition, format, mount, and optionally boot from the M.2 NVMe SSD slot on the Sixfab Edge AI Expansion Board. The slot is routed through an on-board USB 3.2 Gen 1 hub and a Realtek RTL9210B-CG USB-to-NVMe bridge, so the operating system sees a standard USB Mass Storage device, with no extra drivers required.

M.2 M-Key NVMe only 2230 · 2242 · 2260 · 2280 USB 3.2 Gen 1 · 5 Gbps /dev/sda
Edge AI Expansion Board · Connectivity & Storage · NVMe Storage · Hardware · Tutorial · Updated 2026-05-14
How does the NVMe slot on the Edge AI Expansion Board work?

The NVMe slot is USB-attached, not native PCIe. The M.2 M-Key socket sits behind an on-board USB 3.2 Gen 1 (5 Gbps) hub and a Realtek RTL9210B-CG USB-to-NVMe bridge, so Raspberry Pi 5 enumerates the SSD as a USB Mass Storage device at /dev/sda, not as a native NVMe block device. No additional drivers are needed beyond Raspberry Pi OS. Sequential read sits in the 380–440 MB/s range and write in the 350–410 MB/s range, capped by the 5 Gbps USB bus rather than the SSD itself. Setup is the standard fdiskmkfs.ext4fstab-with-UUID flow used for any USB drive on Raspberry Pi OS.

How the slot is wired

The M.2 slot labelled M.2-SSD on the Edge AI Expansion Board accepts a standard NVMe (PCIe) SSD, but the path from the SSD to the Raspberry Pi 5 is not the Pi 5's PCIe link. That link is reserved end-to-end for the DEEPX DX-M1 AI accelerator. The NVMe slot is instead routed through an on-board Realtek RTL9210B-CG USB-to-NVMe bridge chip, then into the board's internal USB 3.2 Gen 1 (5 Gbps) hub, then upstream to the Raspberry Pi 5 over the USB Bridge PCBA, a small connector board that occupies one of the Pi 5's two blue USB 3.0 ports.

The practical consequence: from Raspberry Pi OS' point of view, the SSD looks like any other external USB Mass Storage device. lsblk shows it as /dev/sda, lsusb lists the bridge as 0bda:9210 Realtek Semiconductor Corp. RTL9210 NVMe Bridge, and tools like nvme list will not see it. Use the USB-storage tooling (lsblk, fdisk, mount, fstab), not the native-NVMe tooling. UASP is supported by the bridge, so the throughput is the full USB 3.2 Gen 1 ceiling, not a slower USB Mass Storage profile.

M.2 slot NVMe SSD M-Key · 2230–2280
Bridge IC RTL9210B-CG USB ↔ NVMe · UASP
On-board USB 3.2 Gen 1 hub 5 Gbps · shared with cellular
Carrier USB Bridge PCBA Pi 5 USB 3.0 port
Host Raspberry Pi 5 /dev/sda
Why a USB-attached NVMe slot at all?

Raspberry Pi 5 exposes a single PCIe Gen 2/Gen 3 x1 lane through its dedicated PCIe FFC connector. The Edge AI Expansion Board commits that entire lane to the DX-M1 AI accelerator over a 40 mm PCIe FFC cable, so AI inference traffic never competes with storage traffic. Putting the NVMe slot on the internal USB 3.2 Gen 1 hub keeps the SSD fast (≈ 400 MB/s in practice) while leaving the PCIe link exclusively for the NPU.

Throughput envelope

Maximum throughput is set by the 5 Gbps USB 3.2 Gen 1 bus and the 8b/10b encoding overhead that goes with it, not by the SSD's underlying PCIe capability. A high-end PCIe Gen 4 SSD will not run any faster in this slot than a mid-range PCIe Gen 3 model. The figures below are the measured envelope as documented by Sixfab; treat them as the ceiling for any SSD installed in this slot.

Sequential read 380–440 MB/s Set by the 5 Gbps USB bus and 8b/10b overhead, not the SSD.
Sequential write 350–410 MB/s Sustained; bursts may run higher into the SSD's cache.
Bridge mode UASP USB Attached SCSI on the RTL9210B-CG, full-speed not BOT.
Validated capacity Up to 2 TB No hard software limit; tested headroom is 2 TB.
Concurrent operation hits the same ceiling

For an end-to-end concurrency observation (AI + NVMe + cellular running together with no measurable AI throughput hit), see Concurrent operation.

Compatible SSDs

The slot accepts standard M.2 M-Key NVMe (PCIe) SSDs in 2230, 2242, 2260, and 2280 lengths. M.2 SATA drives are not supported and will not enumerate even though they share the M.2 form factor. B+M-keyed NVMe drives are fine; pure B-keyed drives are not NVMe and will not work.

SSD class Compatibility Notes
M.2 M-Key NVMe (PCIe) Supported Standard configuration. 2230, 2242, 2260, and 2280 lengths all fit; up to 2 TB validated.
M.2 B+M-Key NVMe Supported Mechanically and electrically equivalent to M-Key NVMe in this slot.
M.2 SATA SSD Not supported SATA-only M.2 drives will not enumerate. The slot is NVMe-only via the USB-to-NVMe bridge.
Older / high-end power-hungry SSDs Use with care Some firmware or power profiles can trigger instability under burst loads. Pair with a USB-C PD supply that meets the 27 W minimum (45 W recommended).

Validated SSDs

Sixfab's documented validation set is the Raspberry Pi 256 GB and 512 GB NVMe SSDs. These are the recommended drives for the simplest path to a working setup. Any well-known modern NVMe SSD in the M.2 form factor should also work; the validation list is what has been tested by Sixfab, not the exclusion list.

Under-voltage warnings often mean the SSD, not the Pi

Certain high-end or older NVMe SSDs draw heavy current bursts that a marginal USB-C PD supply can struggle to deliver, causing under-voltage warnings or intermittent disconnects that look like SSD failures. Always use a high-quality USB-C PD supply rated at 27 W minimum; 45 W is recommended once the AI accelerator and cellular modem are also populated. If you see under-voltage warnings, the power supply is the first thing to replace, not the SSD.

Partition, format, and mount

This is the standard procedure for preparing a brand-new NVMe SSD on the Edge AI Expansion Board as a secondary (non-boot) data drive. The flow is: lsblk to confirm the device → fdisk to write a GPT partition table → mkfs.ext4 to format → mount to a directory under /mnt/etc/fstab with the partition UUID for automatic mounting at boot.

This procedure erases everything on the SSD

Partitioning and formatting destroys any existing data on the SSD. Before running fdisk or mkfs, confirm that /dev/sda is the Edge AI Expansion Board's NVMe SSD and not a different USB drive you have plugged into the Raspberry Pi 5. lsblk and lsusb together confirm which device is which: the NVMe bridge always shows up as 0bda:9210 Realtek Semiconductor Corp. RTL9210 NVMe Bridge in lsusb.

1

Identify the device

Confirm that the SSD is enumerated as /dev/sda and check that the RTL9210 bridge is visible in lsusb. If the SSD does not appear, stop here: re-seat the M.2 module (30° insertion, M2 6 mm flat-head screw, finger-tight) and the USB Bridge PCBA before running anything else.

bash · pi@raspberrypi: ~
On Raspberry Pi 5
# 1. Block-device tree: the SSD should show as /dev/sda
lsblk

# 2. USB-side view: the RTL9210 NVMe Bridge should be listed
lsusb
Expected output NVMe detected
# lsblk (example with a 256 GB SSD, no partitions yet)
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0 238.5G  0 disk
mmcblk0     179:0    0  29.7G  0 disk
├─mmcblk0p1 179:1    0   512M  0 part /boot/firmware
└─mmcblk0p2 179:2    0  29.2G  0 part /

# lsusb
Bus 002 Device 002: ID 0bda:9210 Realtek Semiconductor Corp. RTL9210 NVMe Bridge
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
If other USB storage is connected, the device name may shift (/dev/sdb, /dev/sdc, …). Match the size and the RTL9210 entry from lsusb to identify the correct disk before partitioning. The UUID-based fstab entry in step 5 immunises the mount against device-name reshuffling.
2

Write a GPT partition table

A new SSD has no usable partition layout. Use fdisk to write a fresh GPT table and create a single primary partition that spans the entire disk. GPT is the recommended layout for any drive larger than 2 TB and is the default Sixfab documents for the Edge AI Expansion Board.

bash · pi@raspberrypi: ~
root required
# Open fdisk on the NVMe SSD
sudo fdisk /dev/sda

# Inside the fdisk prompt, type each letter then press Enter:
#   g   create a new empty GPT partition table
#   n   add a new partition
#       press Enter to accept defaults (partition 1, full disk)
#   w   write the table to disk and exit

After fdisk exits, run lsblk again. The SSD should now have a child partition sda1 taking up the full disk:

Expected output Partition created
# lsblk after fdisk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0 238.5G  0 disk
└─sda1        8:1    0 238.5G  0 part
3

Format the partition as ext4

ext4 is the recommended filesystem for a secondary data drive on Raspberry Pi OS: stable, journaled, well-supported, and matches the rest of the system's tooling. The format runs on the partition (sda1), not the whole disk (sda).

bash · pi@raspberrypi: ~
root required
# Format the new partition with ext4
sudo mkfs.ext4 /dev/sda1
For a brand-new SSD this completes in seconds. For a previously-used SSD mkfs.ext4 may ask to overwrite an existing filesystem; type y to confirm only after you have re-verified that /dev/sda1 is the correct device.
4

Create a mount point and mount

Mount the freshly formatted partition under a stable directory below /mnt. /mnt/nvme is the convention used elsewhere in Sixfab's documentation; the path is not magical, anything you pick can be used consistently afterwards.

bash · pi@raspberrypi: ~
root required
# 1. Make the mount point
sudo mkdir -p /mnt/nvme

# 2. Mount the partition there for the current boot
sudo mount /dev/sda1 /mnt/nvme

# 3. Hand ownership to the pi user so applications can write without sudo
sudo chown -R pi:pi /mnt/nvme

# 4. Confirm it's mounted and writable
df -hT /mnt/nvme
5

Mount automatically at boot via /etc/fstab

The manual mount above survives until the next reboot. To bring the SSD up automatically every boot, add it to /etc/fstab. Reference the partition by its UUID, not by /dev/sda1: the device name can shift if other USB drives are connected and the boot will fail when it does.

bash · pi@raspberrypi: ~
On Raspberry Pi 5
# 1. Read the UUID of the partition
sudo blkid /dev/sda1
Expected output UUID resolved
/dev/sda1: UUID="a1b2c3d4-e5f6-7890-1234-567890abcdef" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="..."

Then edit /etc/fstab with sudo nano /etc/fstab and add a single line, substituting the UUID printed by blkid:

/etc/fstab, append to end of file
# NVMe SSD on Edge AI Expansion Board (USB-attached via RTL9210B-CG)
UUID=<your-uuid-here>  /mnt/nvme  ext4  defaults,nofail,x-systemd.device-timeout=10  0  2

Test the entry without rebooting:

bash · pi@raspberrypi: ~
root required
# 1. Unmount the partition (if currently mounted from step 4)
sudo umount /mnt/nvme

# 2. Mount everything in fstab: should remount /mnt/nvme cleanly
sudo mount -a

# 3. Verify
df -hT /mnt/nvme
The nofail option means Raspberry Pi OS will continue to boot even if the SSD is temporarily missing, which is important in field deployments where you do not want a single hardware issue to leave the unit stuck at the boot prompt. x-systemd.device-timeout=10 caps the wait at 10 seconds on each boot.

Boot Raspberry Pi OS from NVMe

Booting Raspberry Pi OS directly from the NVMe SSD is supported. Because the SSD sits behind the RTL9210B-CG USB bridge rather than the Pi 5's native PCIe lane, this is technically a USB Boot, not a native PCIe NVMe boot. Raspberry Pi 5 treats the drive as a USB storage device during the boot sequence, which means the EEPROM bootloader's BOOT_ORDER for USB controls it.

  1. Update the Raspberry Pi 5 EEPROM bootloader to a current release with sudo rpi-eeprom-update.
  2. Configure the bootloader's BOOT_ORDER to prefer USB boot using sudo raspi-configAdvanced OptionsBoot Order, or directly through sudo rpi-eeprom-config --edit.
  3. Image Raspberry Pi OS onto the SSD using the Raspberry Pi Imager, exactly as you would for any USB-connected SSD on Raspberry Pi 5.
  4. Power down, install the imaged SSD in the M.2-SSD slot, power back up.
Power-loss during writes can corrupt the filesystem

Pulling the USB-C PD cable while the SSD is writing does not cause physical damage to the SSD, but unsaved data is lost and the ext4 journal may report inconsistencies on the next boot. There is no power button on the Expansion Board: use a clean shutdown (sudo shutdown -h now) before disconnecting power, especially when the SSD is the boot device.

Concurrent operation

The NVMe slot and the LTE/5G cellular slot are both routed through the same internal USB 3.2 Gen 1 hub, but they are independent endpoints on that hub. Both can be used at the same time. The DEEPX DX-M1 AI accelerator is on a separate path entirely (the dedicated PCIe Gen 2/Gen 3 x1 link through the 40 mm FFC cable) and never competes with storage or cellular traffic for bandwidth.

The practical result, documented by Sixfab: an Edge AI Expansion Board running AI inference on the DX-M1 NPU, writing inference logs to the NVMe SSD, and uplinking results over the LTE/5G modem shows virtually no AI throughput degradation compared to inference alone. This is the configuration the product is designed for.

Writing AI logs to NVMe in production

The dxrt-runtime does not write to disk by itself; your inference application owns the storage policy. Point your inference code's log path, captured-frame folder, or detection-output sink at the mount location, for example /mnt/nvme/inference-logs/, and the SSD will absorb the write pressure without slowing down the NPU pipeline. For monitoring tools and the documented healthy dxrt-cli -s output, see System Monitoring.

Extra USB drives share the 5 Gbps ceiling

The USB Bridge PCBA occupies one of Raspberry Pi 5's two blue USB 3.0 ports. Plugging another high-speed USB drive into the remaining USB 3.0 port forces all USB devices to share the Pi 5's 5 Gbps USB bandwidth, and the total current budget across all USB ports is capped at 1.6 A: adding a second power-hungry drive alongside an NVMe SSD and an LTE/5G modem may cause instability. Low-power peripherals (keyboard, mouse, UVC camera) are not a concern.

Host compatibility

The Edge AI Expansion Board's NVMe slot, like every other subsystem on the board, is designed for the Raspberry Pi 5. The board's mechanical footprint, the pogo-pin back-power layout, and the USB Bridge PCBA carrier are all tuned to the Pi 5 board revision; the NVMe slot has the same host constraint.

Supported host platforms
Supported
  • Raspberry Pi 5, the only validated host platform.
  • All Pi 5 RAM tiers (2 GB, 4 GB, 8 GB, 16 GB) and all shipped board revisions.
Not supported
  • Raspberry Pi 4 and Compute Module 4.
  • Compute Module 5 on the official Raspberry Pi CM5 IO Board.
  • Non-Raspberry Pi SBCs (Orange Pi, Rock Pi, Jetson, etc.).