Dans le cadre de mon alternance je dois concevoir un système embarqué pour interfacer plusieurs machine médicales, capteurs bio etc pour pouvoir centralisé les mesures d’une opérations sensible. Le projet est pas dingue en gros c’est faire un hub. MAIS ça reste une occasion de passer du temps à manipuler du materiel nouveau.
En cherchant des SoM proposant des GPIO comme sur une raspi, mais gérer par un MCU indépendant pour éviter les interruptions, je suis tombé sur la Portenta X8:
Elle fait la taille d’une raspi zero mais est beaucoup plus puissante sur plein d’aspect (RAM, Processeur, MPU, puce graphique etc).
La philosophie du systeme est d’alimenter leurs image Yocto en ajoutant des containers dockers. J’ai jamais fait de docker donc je vais utiliser cette page comme prise de note sur ce que je fais.
Linux sur la X8
Pour choper un terminal on a besoin d’adb, et de connecter en USB-C la carte à notre ordi. J’ai eu des galère car les ports du Macbook ne fournisse pas assez de courant pour que le proc de la Portenta démarre, donc je dois utiliser un hub usb-c alimenté pour pouvoir y accéder en filaire. Je vais vite installer openssh dessus mais pour la première connexion c’est chiant qd même.
L’image fournis par Arduino fait tourner une petite interface web sur le port 8080, on peut y accéder en tapant:
18nelli@MacBook-Pro-van-18nelli ~ % adb devices
List of devices attached
0A2A7209DABC16AC device
18nelli@MacBook-Pro-van-18nelli ~ % adb forward tcp:8080 tcp:80
On a accès à pas grand chose d’interessant. Un truc payant, un autre truc payant un shell et les paramètre pour connecter la X8 en wifi, ethernet ou 4G/LTE
Dans board info on a un genre de tableau de bord assez pratique ou on notamment voir les 3 conteneurs natifs de l’OS.
x8-provisioningetx8-devel: Containers qui s’occupe de l’identification auprès des services Arduino Cloud, des scripts pour les mise à jours OTA etc donc osef pr l’instantx8-webapp: Containers de l’interface web
Explications approximative de docker et premier container.
Docker permet la creation de mini VM sur un systèmes. Mais la ou une VM est une émulation complète d’un système, un container docker partage le noyaux principal et les ressource avec les autre containers.
Ça permet une certaines modularités dans le systèmes, éviter les problèmes de compatibilité entre les outils etc, c’est mieux pour la reproductibilité etc. Tout ça j’en sais r juste c’est ce que je lit sur internet.
Comme premier container j’aimerai setup un environnement linux de dev classique pour retrouver une expérience comme sur raspberry pi os etc.
On crée notre petit dossier:
su
mkdir ~/ssh-docker/
cd ~/ssh-docker/
Puis on écrit la config docker qui sera lu lors de la création du container. Vu qu’on est sur une image minimale il n’y a pas nano pour editer du texte donc on passe par un classique cat EOF:
cat > Dockerfile << 'EOF'
# Choisir la distribution sur laquel tournera le LXC.
# Mieux vaut fixer la version plutot que d'écrire :latest, ça assurera que les outils installé qui fonctionneront toujorus avec la bonne version
FROM alpine:3.24.2
# RUN exectute une commande dans le LXC.
RUN apk add --no-cache \ #apk = gestionnaire de paquets d'alpine linux (comme apt)
# on liste les outils qu'on veut installer
openssh \
nano \
vim \
curl \
wget \
git \
htop \
bash \
python3 \
py3-pip
RUN ssh-keygen -A # Génère les clés ssh
RUN echo 'root:changeme' | chpasswd # Définie le mot de passe root
RUN sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config # Modifie la config ssh pour authoriser la connexion en root
EXPOSE 22 # indique sur quel port écoute ce LXC
CMD ["/usr/sbin/sshd", "-D"] # définie le processus principal du conteneur (celui qui tourne tout le temps et par défaut)
Une fois qu’on a le Docker de prêt, on peut lancer la construction de l’image:
sudo docker build -t ssh-server .
puis le démarrer:
sudo docker run -d --name ssh-server -p 2222:22 ssh-server
Si on souhaite rendre notre container persistant, c’est à dire qu’il démarre automatiquement quand la X8 se lance, on doit ajouter:
sudo docker update --restart unless-stopped ssh-server
On peut voir notre LXC crée en taper docker ps ou bien
sur l’interface web comme tout à l’heure.

On peut maintenant se connecter à notre container en ssh youpi !!!
Ajouter et modifier le contenue d’un LXC.
Imaginons que je souhaite installer bluetoothctl dans ce
nouveau containers. Je peux l’installer simplement via
apk add bluez et ça marcherait. Mais imaginons que je
souhaite installer sur une autre carte exactement le même container, en
garantissant qu’il soit fonctionnel. Notre configuration précédente
n’incluait pas bluez, donc il faudra à chaque reconstruction de l’image
ecrire apk add bluez . Pour que bluez soit un outil natif à
notre LXC, on doit l’ajouter dans notre Dockerfile.
Mainenant qu’on a un container avec nano on va pouvoir éditer plus simplement notre fichier de config. Sur la console adb (donc hors de tout container), on éteins notre LXC ssh et on le relance en montant le dossier qui contient le Dockerfile :
sudo docker stop ssh-server
sudo docker rm ssh-server
sudo docker run -d --name ssh-server --restart unless-stopped \
-p 2222:22 \
-v /root/dockerfiles:/dockerfiles \
ssh-server
Via le container ssh, on peut maintenant accéder à notre fichier de config et le modifier avec nano pour ajouter bluez à notre LXC :
on met à jour notre image:
sudo docker build -t ssh-server .
Puis on supprime l’ancien containers pour le remplacer par le nouveau à partir de l’image:
sudo docker stop ssh-server
sudo docker rm ssh-server
On relance le container avec les autorisation d’accès au bus matériel requis pour l’outil bluez
sudo docker run -d --name ssh-server --restart unless-stopped \
-p 2222:22 \
-v /run/dbus:/run/dbus:ro \
ssh-server