🛠 Démarrer le CM5 sur un SSD NVMe dans le socket M.2 de la CM5IO
Objectifs
Le socket M.2 M-key (2230 à 2280) de la CM5IO est câblé sur l'hôte PCIe Gen 2 x1 (5 Gb/s) du BCM2712, et la documentation officielle fait du NVMe un périphérique de boot de première classe : BOOT_ORDER=0xf6. Ce tuto installe le système sur NVMe et reprogramme l'EEPROM du module (BOOT_ORDER=0xf641 : NVMe, puis SD/eMMC en repli) via le flux usbboot recovery — le seul supporté sur Compute Module, recovery.bin n'étant jamais exécuté depuis le stockage.
Matériel
- 1 × CM5 (eMMC ou Lite) sur CM5IO Board, système Raspberry Pi OS 64 bits fonctionnel
- 1 × SSD NVMe M.2 (2230–2280) — attention, le Gen 3 « est possible dans certains cas mais non supporté et potentiellement non fiable » (datasheet §2.3)
- Jumper J2 (nRPI_BOOT) + câble USB-C du port esclave J11 vers un PC hôte Linux
- usbboot compilé sur l'hôte (
git clone https://github.com/raspberrypi/usbboot)
Code complet
# --- Côté CM5 : vérifier le SSD puis cloner le système dessus ---
sudo apt install -y nvme-cli git
lsblk | grep nvme # nvme0n1 doit apparaître
sudo nvme list
git clone https://github.com/billw2/rpi-clone && cd rpi-clone
sudo ./rpi-clone -f nvme0n1 # copie boot + rootfs vers le NVMe
# --- Côté hôte : reprogrammer l'EEPROM (module en mode recovery, J2 posé) ---
cd usbboot/recovery
cat > boot.conf <<'EOF'
[All]
BOOT_ORDER=0xf641
EOF
./update-pieeprom.sh
sudo ../rpiboot -d . # écrit l'EEPROM (EEPROM_nWP non verrouillé)
# --- Retour sur le CM5 : retirer J2, alimenter, vérifier la racine NVMe ---
lsblk -o NAME,SIZE,MOUNTPOINT | head
df -h /
Vérification attendue
Après retrait du jumper et reboots, df -h / et lsblk montrent la racine sur /dev/nvme0n1p2 ; cat /proc/cmdline contient root=/dev/nvme0n1p2 ; le boot reste possible en repli SD/eMMC si le NVMe est retiré (dernier nibble 1). vcgencmd bootloader_version reflète le nouveau build.
Erreurs fréquentes
- Attendre le Gen 3 : la datasheet le marque explicitement non supporté et possiblement instable — acheter un SSD Gen 3 est OK (il négociera en Gen 2), pas de s'entêter sur des liens instables.
- Compter sur
rpi-eeprom-update: désactivé par défaut sur Compute Modules ; le modeself-updaten'est pas atomique (coupure de courant = EEPROM possiblement corrompue). - Oublier le jumper J2 pendant
rpiboot, ou laissereeprom_write_protect=1+ broche EEPROM_nWP active : l'écriture n'a pas lieu. - SSD 22110 ou Wi-Fi M.2 : le socket accepte 2230–2280 en M-key NVMe ; une carte clé A/B (Wi-Fi) ne sera tout simplement pas reconnue.
Autres tutoriels pour cette carte
- Alimenter un CM5 comme il faut : USB-C PD 5 V / 5 A et bouton d'alimentation
- La première RTC des Compute Modules : câbler et vérifier la VBAT du CM5
- Accès distant sans VPN : enregistrer un CM5 dans Raspberry Pi Connect
- GPIO du CM5 côté RP1 : force de conduite, budget 50 mA et broches pièges
- Refroidir le CM5 : ventilateur PWM sur le connecteur JST-SH et tachymétrie
- Deux ports USB 3.0 simultanés : le CM5 fait du stockage rapide, pas sur une carte CM4
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash