🛠 Déplacer le rootfs sur un SSD NVMe via le port mini-PCIe
Objetivos
El puerto mini-PCIe del BPI-CM4IO está cableado como PCIe Gen2 x1 + USB 2.0: con un adaptador de mini-PCIe a NVMe (la placa base no tiene conector M.2 M-key), el wiki del fabricante mide 351 MB/s en lectura y 101 k IOPS en aleatorio de 4 k. Restricción absoluta: la ROM del A311D y el u-boot BSP no saben arrancar por PCIe — el gestor de arranque debe permanecer en la SD (o la eMMC) y solo se traslada el rootfs al SSD, mediante setenv rootfsdev en /boot/boot.ini.
Material
- BPI-CM4 + BPI-CM4IO, imagen del fabricante (procedimiento documentado en el wiki) o Armbian
- Adaptador de mini-PCIe a NVMe + SSD (p. ej. Samsung 970 EVO Plus para reproducir las cifras del wiki)
- Fuente de alimentación de 5 V / 3 A (el SSD añade su consumo)
- Sistema que ya arranca desde microSD
Código completo
# 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
Verificación esperada
findmnt / devuelve /dev/nvme0n1p2 ; hdparm se acerca a los 350 MB/s publicados por el wiki ; la puntuación de PiBenchmarks Storage se dispara (24550 frente a 5446 en eMMC). El sistema debe seguir solicitando la SD (o la eMMC) al iniciar: es normal, es la única ruta de arranque de la plataforma.
Errores frecuentes
- Retirar la microSD «porque ya arranca desde el SSD»: sin gestor de arranque en SD/eMMC, no hay arranque alguno.
- Buscar un puerto M.2: no existe ni en el módulo ni en la placa base; solo está previsto el formato mini-PCIe.
- Olvidar el parche disableuhs y acumular errores de entrada/salida en la SD una vez poblado el puerto PCIe.
- Dejar un /etc/fstab con UUID incoherentes tras reformatear: verificar blkid antes de reiniciar.
- Fuente de alimentación insuficiente: el pico del SSD sumado al del A311D hace caer un cargador de 5 V / 2 A.
Otros tutoriales para esta placa
- 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
Ejemplos de código para esta placa
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash