🛠 Démarrer le CM5 sur un SSD NVMe dans le socket M.2 de la CM5IO
Objetivos
El socket M.2 M-key (2230 a 2280) de la CM5IO está conectado al host PCIe Gen 2 x1 (5 Gb/s) del BCM2712, y la documentación oficial considera NVMe como un dispositivo de arranque de primera clase: BOOT_ORDER=0xf6. Este tutorial instala el sistema en NVMe y reprograma la EEPROM del módulo (BOOT_ORDER=0xf641: NVMe, con SD/eMMC como respaldo) mediante el flujo de recuperación usbboot — el único admitido en Compute Module, ya que recovery.bin nunca se ejecuta desde el almacenamiento.
Hardware
- 1 × CM5 (eMMC o Lite) en una placa CM5IO, con Raspberry Pi OS de 64 bits funcional
- 1 × SSD NVMe M.2 (2230–2280) — atención, el Gen 3 «es posible en algunos casos pero no está admitido y puede ser poco fiable» (hoja de datos §2.3)
- Jumper J2 (nRPI_BOOT) + cable USB-C desde el puerto esclavo J11 hacia un PC host Linux
- usbboot compilado en el host (
git clone https://github.com/raspberrypi/usbboot)
Código completo
# --- 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 /
Verificación esperada
Tras retirar el jumper y reiniciar, df -h / y lsblk muestran la raíz en /dev/nvme0n1p2; cat /proc/cmdline contiene root=/dev/nvme0n1p2; el arranque sigue siendo posible mediante respaldo SD/eMMC si se retira el NVMe (último nibble 1). vcgencmd bootloader_version refleja la nueva compilación.
Errores frecuentes
- Esperar Gen 3: la hoja de datos lo marca explícitamente como no admitido y posiblemente inestable — comprar un SSD Gen 3 está bien (negociará a Gen 2), pero no insista con enlaces inestables.
- Confiar en
rpi-eeprom-update: desactivado por defecto en los Compute Modules; el modoself-updateno es atómico (corte de corriente = EEPROM posiblemente corrupta). - Olvidar el jumper J2 durante
rpiboot, o dejareeprom_write_protect=1+ el pin EEPROM_nWP activo: la escritura no se realiza. - SSD 22110 o Wi-Fi M.2: el socket acepta 2230–2280 en M-key NVMe; una tarjeta con llave A/B (Wi-Fi) simplemente no será reconocida.
Otros tutoriales para esta placa
- 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
Ejemplos de código para esta placa
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash