🛠 Images custom et flotte : construire son Yocto, déployer par OTA avec fioctl et Waves
Objetivos
Pasar de « trasteo con mi placa » a « gestiono una flota ». La imagen de fábrica es una Linux microPlatform (LMP) de Foundries.io, construida con Yocto; la capa BSP de Arduino es pública (arduino/meta-partner-arduino), y los módulos del kernel también (portentax8-x8h7). El flujo de trabajo oficial: una FoundriesFactory compila el SO + contenedores, fioctl gestiona las actualizaciones, y la OTA —garantizada como atómica por la estructura A/B de LMP— despliega tanto el SO como los contenedores. En la versión gestionada, Arduino Cloud for Business / Portenta X8 Manager añade el aprovisionamiento mediante claves individuales y la monitorización de la flota; el tutorial oficial waves-fleet-managment cubre el despliegue remoto de contenedores.
Hardware
- 1 × Arduino Portenta X8 (idealmente 2: una de producción, otra de banco de pruebas)
- Estación de compilación Linux potente (Yocto: calcula muchos GB de disco y horas de compilación la primera vez)
- Cuenta de GitHub + una FoundriesFactory (oferta gratuita para empezar)
- CLI fioctl instalado en la estación de trabajo (docs.foundries.io)
- Acceso adb a la placa para inscribirla en la factory
Código completo
# --- Cote poste de build ---
# 1. Initialiser sa factory (guidé par la doc Foundries.io)
fioctl login
# 2. Récuperer la BSP Arduino : couche meta-partner-arduino
# (github.com/arduino/meta-partner-arduino) + recipes LMP ;
# tuto officiel : docs.arduino.cc/tutorials/portenta-x8/image-building
# puis : bitbake lmp-factory-image
# 3. Pousser la branche de build vers la factory
git push
# -> la factory compile en cloud et héberge l'OTA
# --- Cote carte : suivre la mise a jour ---
adb shell
fio@portenta-x8:~$ sudo journalctl -fu ostree-remount # ou update manager
fio@portenta-x8:~$ docker ps # les conteneurs applicatifs suivent l'OTA
# --- Cote flotte ---
fioctl updates list # état de rollout par appareil
fioctl devices list
# Gestion managée alternative : Arduino Cloud for Business /
# Portenta X8 Manager (provisioning keys + monitoring),
# ou le workflow « Waves » du tuto officiel waves-fleet-managment.
Verificación esperada
Tras git push, la factory compila la imagen; la placa inscrita descarga la OTA y cambia al nuevo SO sin bloquearse: en caso de fallo de arranque, el mecanismo A/B de LMP vuelve a la imagen anterior. Los contenedores de aplicación se actualizan de forma independiente, versionados como imágenes Docker —este es exactamente el modelo de despliegue que explota el tutorial Waves para una flota.
Errores frecuentes
- Querer usar
apt installen la imagen: es Yocto — todo lo que afecta al SO se declara en las recipes y se recompila; las pruebas rápidas se hacen conopkg(usado por Arduino para sus módulos de kernel) o mediante contenedores. - Modificar la BSP sin leer image-building: la capa meta-partner-arduino tiene compatibilidad con el kernel LMP 6.1.24 — mezclar ramas recientes de LMP con esta capa rompe la compilación.
- Perder las claves de la factory: el aprovisionamiento se basa en claves individuales (modelo Portenta X8 Manager) — una clave perdida = dispositivo que hay que reinscribir físicamente.
- Probar la OTA en la única placa en producción: el rollback A/B protege el arranque, no tus datos — mantén una placa de banco de pruebas y valida en ella cada despliegue.
- Confundir los dos niveles de OTA: el SO (ostree/LMP vía factory) y los contenedores (registries) se actualizan por separado; un fallo al extraer un contenedor no afecta al SO, y viceversa.
- >
- >
Otros tutoriales para esta placa
- Premiers pas : comprendre le monstre à 9 cœurs et entrer dans Linux via ADB
- Premier sketch sur le cœur M4 : le blink qui se flash par ADB
- Docker dès la sortie de l'emballage : premier conteneur sur le Linux embarqué
- Pont Linux ↔ Arduino : appeler des fonctions du sketch M4 depuis Python (RPC)
- Mettre la X8 en réseau : Wi-Fi du Murata 1DX et Gigabit Ethernet sur porteuse
- Nœud IoT de datalogging : capteurs sur le M4, stockage et transport en conteneur
Ejemplos de código para esta placa
etat-systeme.shBashgpio-libgpiod.shBashpython-gpio.pyPythondocker-hello.shBashflasher-core-arduino.shBashwifi-nmcli.shBash