🛠 Déplacer le rootfs sur un SSD NVMe via le port mini-PCIe
Objectifs
Le port mini-PCIe du BPI-CM4IO est câblé en PCIe Gen2 x1 + USB 2.0 : avec un adaptateur mini-PCIe vers NVMe (le carrier n'a pas de connecteur M.2 M-key), le wiki vendor mesure 351 MB/s en lecture et 101 k IOPS en 4 k aléatoire. Contrainte absolue : le ROM de l'A311D et le u-boot BSP ne savent pas booter en PCIe — le bootloader doit rester sur la SD (ou l'eMMC) et seul le rootfs est déplacé sur le SSD, via setenv rootfsdev dans /boot/boot.ini.
Matériel
- BPI-CM4 + BPI-CM4IO, image vendor (procédure documentée par le wiki) ou Armbian
- Adaptateur mini-PCIe vers NVMe + SSD (ex. Samsung 970 EVO Plus pour reproduire les chiffres du wiki)
- Alimentation 5 V / 3 A (le SSD ajoute sa consommation)
- Système qui boote déjà sur microSD
Code complet
# 1) Carrier éteint : visser l'adaptateur + SSD dans le port mini-PCIe, rallumer.
sudo apt install -y nvme-cli rsync
lsblk && sudo nvme list # le SSD apparaît comme /dev/nvme0n1
# 2) Partitionner (p1 boot, p2 racine ext4) et formater
sudo fdisk /dev/nvme0n1
sudo mkfs.ext4 /dev/nvme0n1p2
# 3) Copier le système en cours sur le SSD
sudo mkdir -p /mnt/nvme && sudo mount /dev/nvme0n1p2 /mnt/nvme
sudo rsync -aAXx --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/tmp / /mnt/nvme/
# 4) Forcer la racine sur le SSD (partition boot de la SD)
sudo mount /dev/mmcblk1p1 /mnt
sudo tee -a /mnt/boot.ini >/dev/null <<'EOF'
setenv rootfsdev "/dev/nvme0n1p2"
EOF
# Si la SD et le PCIe se marchent dessus : sortir la SD du mode UHS
sudo sed -i 's/^user_kernel_args=.*/user_kernel_args=pci=pcie_bus_safe disableuhs/' /mnt/env.txt
sudo umount /mnt /mnt/nvme && sudo reboot
# 5) Vérifier et benchmarker
findmnt -no SOURCE / # -> /dev/nvme0n1p2
sudo hdparm -Tt /dev/nvme0n1p2
Vérification attendue
findmnt / renvoie /dev/nvme0n1p2 ; hdparm approche les 350 MB/s publiés par le wiki ; le score PiBenchmarks Storage bondit (24550 contre 5446 en eMMC). Le système doit continuer à demander la SD (ou l'eMMC) au démarrage : c'est normal, c'est le seul chemin de boot de la plateforme.
Erreurs fréquentes
- Retirer la microSD « puisque c'est booté sur le SSD » : sans bootloader sur SD/eMMC, plus de boot du tout.
- Chercher un port M.2 : il n'existe ni sur le module ni sur le carrier ; seul le format mini-PCIe est prévu.
- Oublier le correctif disableuhs et accumuler des erreurs d'entrée/sortie sur la SD une fois le port PCIe peuplé.
- Laisser un /etc/fstab avec des UUID incohérentes après reformatage : vérifier blkid avant le reboot.
- Alimentation trop faible : le pic du SSD ajouté à l'A311D fait chuter un chargeur 5 V / 2 A.
Autres tutoriels pour cette carte
- Monter le module BPI-CM4 sur son carrier et réussir le premier boot
- Apprivoiser les LED et la touche ADC du carrier CM4IO
- Mesurer le stockage du BPI-CM4 : eMMC, microSD et le palier NVMe
- Activer I2C, SPI et UART sur le BPI-CM4 : env.txt ou armbianEnv.txt
- Brancher un capteur BME280 sur l'I2C1 du carrier (GPIOX_17/18)
- Exploiter le NPU 5 TOPS de l'A311D pour l'inférence embarquée
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash