Flash Bookworm Lite, SSH in headless, configure PCIe for the dual M.2 HAT, migrate the OS root to NVMe, and install the Hailo-8 AI drivers with a single command. Every step — nothing skipped.
Download and open Raspberry Pi Imager. Select:
Bookworm Lite only. Do not select Trixie (Hailo support has rough edges) or the Desktop version (wastes resources we need for AI work).
Click Next → Edit Settings. Set hostname (pidev), username, and password. Under the Services tab, tick Enable SSH. Leave WiFi unconfigured — use Ethernet.
Insert the SD card, plug in Ethernet, connect USB-C power. Wait up to two minutes — first boot is slower while it applies your settings. Then from your laptop terminal:
ping pidev.localOnce you see replies, connect:
ssh yourusername@pidev.localReplace yourusername with the username you set in Imager. Type yes at the host key prompt — your laptop is saving the Pi's identity. You'll only see this prompt once. The cursor will not move when you type your password — that is normal.
Always update before configuring hardware. full-upgrade handles kernel and firmware — do not use upgrade.
sudo apt update && sudo apt full-upgrade -yLet it complete fully, then reboot:
sudo rebootSSH session will close. Wait 30 seconds, then reconnect with ssh yourusername@pidev.local.
Do not skip this step. The Seeed dual M.2 HAT uses a PCIe switch chip (ASM2806) that requires specific overlay configuration. Without it, the NVMe or Hailo-8 — or both — will not be recognised.
sudo nano /boot/firmware/config.txtScroll to the very bottom and add these three lines exactly:
dtparam=pciex1
dtparam=pciex1_gen=3
dtoverlay=pciex1-compat-pi5,no-mip,mmio-hiSave: Ctrl+O → Enter → Ctrl+X. Then reboot and verify:
lsblk
lspciYou should see nvme0n1 in lsblk output and multiple PCIe devices in lspci.
If lspci is not found, the package is not installed on a fresh Lite image. Install it first:
sudo apt install pciutilsThe SD card stays in the Pi permanently — it handles the bootloader and hands control to the NVMe. The operating system, all applications, and AI models run entirely from the NVMe. This is boot-root separation — how production systems are built.
Step 1 — Create a partition on the NVMe drive:
sudo parted /dev/nvme0n1 --script mklabel gpt mkpart primary ext4 0% 100%Step 2 — Format the new partition:
sudo mkfs.ext4 /dev/nvme0n1p1Step 3 — Mount it:
sudo mkdir -p /mnt/nvme
sudo mount /dev/nvme0n1p1 /mnt/nvmeStep 4 — Clone the OS to the NVMe:
Copy the rsync command below — do not type it. One wrong character and the transfer fails.
sudo rsync -axHAWXS --numeric-ids --info=progress2 / /mnt/nvme \
--exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"}This takes several minutes. A live progress indicator will run. Do not interrupt it.
Step 5 — Get the PARTUUID of the NVMe partition:
sudo blkid /dev/nvme0n1p1The output will contain a PARTUUID= value — copy it. You will need it in the next step.
Step 6 — Point the bootloader at the NVMe partition:
sudo nano /boot/firmware/cmdline.txtThis file contains a single long line. Find the section that reads root=PARTUUID=. Replace only that PARTUUID value with the one you copied from the blkid output above. Do not change anything else on the line.
Example — before and after
Before (SD card partition):
root=PARTUUID=xxxxxxxx-02After (your NVMe PARTUUID from blkid):
root=PARTUUID=yyyyyyyy-yySave and exit: Ctrl+O → Enter → Ctrl+X. Then reboot.
sudo rebootReconnect after 30 seconds, then verify the root filesystem is now on the NVMe:
findmnt /You should see /dev/nvme0n1p1 listed at the / mount point. The SD card partition will remain visible at /boot/firmware.
Raspberry Pi partnered directly with Hailo to place the complete driver stack in the official Pi software repository. One command installs the kernel driver, runtime libraries, GStreamer pipeline plugins, and Python bindings.
The Hailo-8 is a vision AI specialist — built for understanding what cameras see in real time. Object detection, people tracking, multi-stream analysis. It is not designed for language models. For everything we build on this channel, it is exactly the right tool.
sudo apt install hailo-allExpect a compilation step. The kernel driver builds for your exact kernel version using DKMS. This takes several minutes — up to ten. The screen will look idle. That is normal. Do not close the terminal. The driver will automatically rebuild itself if your kernel is updated in future — you will not need to reinstall manually.
When complete, reboot. The driver needs to load fresh.
sudo rebootRun all verification commands. Pause after each — confirm the output before moving on.
lsblk
sudo hdparm -t /dev/nvme0n1
hailortcli fw-control identify
lspci | grep -i hailo
dmesg | grep -i hailo
vcgencmd measure_templsblknvme0n1p1 mounted at / — SD card boot partition at /boot/firmwarehdparm -tSequential reads well above 400 MB/shailortcli identifyBoard Name: Hailo-8 — Device Architecture: HAILO8 (not HAILO8L)lspci | grep hailoOne line — Hailo-8 on PCIe busdmesg | grep hailoDriver probe and init lines — no errorsvcgencmd measure_temp40–50°C at idle — fan may not spin until 50°Chtop gives real-time CPU, memory, and process visibility — essential when running AI workloads. vim, git, and curl are used constantly.
sudo apt install htop vim git curlRun the key generation command on your laptop, not the Pi. Choose the path for your operating system.
Generate the key pair on your laptop:
ssh-keygen -t ed25519Copy the public key directly to the Pi:
ssh-copy-id yourusername@pidev.localReplace yourusername with the username you set in Imager.
Windows does not include ssh-copy-id. Use this manual flow instead.
1 — Generate the key pair (run on your laptop):
ssh-keygen -t ed25519 -f "$env:USERPROFILE\.ssh\pi_ed25519"2 — Display your public key and copy the output:
type "$env:USERPROFILE\.ssh\pi_ed25519.pub"Copy the entire line starting with ssh-ed25519.
3 — SSH into the Pi with your password, then add the key:
# Run these on the Pi after SSH-ing in with your password
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
# Paste the public key, then: Ctrl+O → Enter → Ctrl+X
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keysCreate an SSH config entry so you can connect with a short alias instead of typing the full hostname and username each time. On Mac/Linux edit ~/.ssh/config; on Windows use notepad $env:USERPROFILE\.ssh\config.
Mac / Linux:
# File: ~/.ssh/config
Host pidev
HostName pidev.local
User yourusername
IdentityFile ~/.ssh/pi_ed25519Windows:
# File: C:\Users\[YourUsername]\.ssh\config
# Open with: notepad $env:USERPROFILE\.ssh\config
Host pidev
HostName pidev.local
User yourusername
IdentityFile ~/.ssh/pi_ed25519Test with the alias:
ssh pidevPassphrases: If you set a passphrase on your key (recommended), you will be prompted for it when connecting — not the Pi's user password. Store it in a password manager. It protects your private key if your laptop is ever compromised.
Prevents the Pi's address from changing between reboots. Replace the placeholder IP with an address valid for your network and not already in use. Replace the connection name with the exact name shown by nmcli connection show.
# Find your connection name first
nmcli connection show
# Apply static IP — replace values for your network
sudo nmcli con mod "Wired connection 1" \
ipv4.addresses 192.168.x.x/24 \
ipv4.gateway 192.168.x.1 \
ipv4.dns "1.1.1.1" \
ipv4.method manual
# Apply the change
sudo nmcli con up "Wired connection 1"ping pidev.local times outSSH connection refusednvme0n1 missing from lsblklspci: command not foundhailortcli command not foundhailortcli fw-control identify shows no deviceStatic IP command failsInstall Frigate with Hailo-8 acceleration, connect a WiFi camera, define room zones, and build a Home Assistant floor plan that shows real-time room occupancy. The Hailo-8 you just installed does all the detection — locally, continuously, at full speed.
View series