Construire
Exécuter sur un Raspberry Pi 5
Que faut-il acheter, comment construire et écrire la carte SD, comment lire et vérifier le journal série de la carte, et comment exécuter des systèmes sur le Pi 5 sans surveillance ou regarder l’interface utilisateur sur son écran HDMI.
Le Raspberry Pi 5 est la carte de référence de NoWayOS : bon marché, facile à trouver, et la carte sur laquelle tournent ses premiers tests matériels. Un système qui réussit dans QEMU est vérifié sur le Pi avec le même fichier expect, à partir du journal série de la carte.
Deux règles pour la carte. Ne branchez jamais un adaptateur série 5 V sur l’UART du Pi : c’est un port 3,3 V. Et ne programmez jamais la mémoire programmable une seule fois (OTP) du Pi, et n’activez jamais le démarrage sécurisé, sur une carte de développement : les deux sont irréversibles.
make sdcardrefuse unconfig.txtqui ferait l’un ou l’autre, ou qui modifierait la tension de la carte.
Ce qu’il vous faut
| Élément | Remarques |
|---|---|
| Raspberry Pi 5 | Développé et testé sur la carte de 16 Go. Chaque commande désigne la carte par rpi5b_2gb : la configuration seL4 du Pi 5 qui utilise ses 2 premiers Go de mémoire, dont la compilation donne à seL4 un peu moins de 1 Go. Les cartes de 2, 4 et 8 Go ne devraient donc rien exiger de différent, mais n’ont pas été essayées |
| Alimentation | L’alimentation officielle USB-C 5 V, 5 A, ou une alimentation aussi bonne. Un Pi 5 sous-alimenté se comporte comme s’il avait un bug logiciel |
| Carte microSD | Pour la partition de démarrage que construit make sdcard |
| Raspberry Pi Debug Probe | Son câble UART se branche sur le connecteur de débogage à 3 broches du Pi 5. Tout adaptateur USB-série 3,3 V muni du bon câble convient aussi |
| Écran HDMI, clavier et souris USB | Pour l’interface utilisateur. Branchez l’écran avant la mise sous tension : le firmware ne configure l’écran qu’au démarrage. Les claviers et souris USB compatibles avec le protocole boot fonctionnent ; les hubs, pas encore |
Construire la carte SD
make sdcard BOARD=rpi5b_2gb SYSTEM=hello
Cette commande écrit la partition de démarrage de la carte SD dans build/rpi5b_2gb/hello/sdcard/ : U-Boot, l’arbre de périphériques (device tree) et ses overlays, config.txt, l’image seL4 loader.img, les fichiers de licence et un SHA256SUMS pour vérifier la carte SD ensuite. U-Boot est compilé à partir des sources dans le conteneur, de façon reproductible.
Écrire la carte SD
Sur macOS
- Trouvez la carte SD avec
diskutil list: elle est external, physical, et de la taille de la carte. L’étape suivante efface tout ce disque : vérifiez donc le numéro deux fois. - Formatez-la, avec le libellé
PIBOOT:
diskutil eraseDisk FAT32 PIBOOT MBRFormat /dev/diskN
- Copiez les fichiers, et vérifiez que chacun est arrivé intact (rien ne s’affiche si tous correspondent) :
cp -RX build/rpi5b_2gb/hello/sdcard/ /Volumes/PIBOOT/
dot_clean -m /Volumes/PIBOOT
(cd /Volumes/PIBOOT && shasum -a 256 -c SHA256SUMS | grep -v ': OK$')
- Éjectez-la avec
diskutil eject /dev/diskN, et insérez-la dans le Pi.
Sous Linux
Les mêmes étapes, avec les outils de Linux (les cartes SD du projet lui-même sont préparées sur macOS) :
- Trouvez la carte SD avec
lsblk -p: un disque de la taille de la carte, comme/dev/sdXou/dev/mmcblk0. L’étape suivante efface tout ce disque : vérifiez donc le nom deux fois, et démontez toutes ses partitions. - Créez-y une seule partition FAT32, avec le libellé
PIBOOT(dosfstoolsetparteddoivent être installés) :
sudo parted --script /dev/sdX mklabel msdos mkpart primary fat32 1MiB 100% set 1 lba on
sudo mkfs.vfat -F 32 -n PIBOOT /dev/sdX1
- Copiez les fichiers, et vérifiez que chacun est arrivé intact (rien ne s’affiche si tous correspondent) :
sudo mount /dev/sdX1 /mnt
sudo cp -r build/rpi5b_2gb/hello/sdcard/. /mnt/
(cd /mnt && sha256sum -c SHA256SUMS | grep -v ': OK$')
sudo umount /mnt
- Insérez-la dans le Pi.
Brancher la console série
Branchez la Debug Probe sur le connecteur de débogage dédié à 3 broches du Pi 5, entre les ports HDMI, et non sur les broches GPIO. Elle fonctionne à 115200 bauds, 8N1. La sonde apparaît sur un Mac sous le nom /dev/cu.usbmodem…, et sous Linux sous /dev/ttyACM0 ou un nom similaire (votre utilisateur doit faire partie du groupe dialout).
Lancez la capture avant de mettre le Pi sous tension, un démarrage par journal :
mkdir -p build/rpi5b_2gb/hello
(stty 115200 raw -echo; cat) < /dev/cu.usbmodemXXXX | tee build/rpi5b_2gb/hello/serial.log
Gardez le réglage et la lecture dans une seule commande, comme ici : sur macOS, une seconde ouverture du port repasse à 9600 bauds. Sous Linux, réglez le port avec stty -F /dev/ttyACM0 115200 raw -echo et lisez-le avec cat /dev/ttyACM0. Arrêtez avec Ctrl-C après la dernière ligne attendue.
À la mise sous tension, U-Boot décompte trois secondes, puis démarre le loader.img de la carte SD. Pour vous arrêter plutôt à son invite, tapez stopboot pendant le compte à rebours. (Seul ce mot l’arrête : le bruit que capte une ligne série non connectée ne peut donc jamais retenir un appareil dans U-Boot.)
Vérifier le journal
Vérifiez le journal de la carte par rapport au fichier expect du système, selon les mêmes règles que pour la sortie de QEMU :
make check-serial SYSTEM=hello LOG=build/rpi5b_2gb/hello/serial.log
Ajoutez BOARD=rpi5b_2gb pour un système qui a son propre fichier expect pour le Pi.
Exécuter des systèmes sans surveillance
Avec la sonde branchée, make pi-run exécute une série de systèmes sur la carte, sans carte SD à déplacer et sans personne devant la carte. Lancez-le directement sur votre machine, pas dans le conteneur (sur un Mac, la machine virtuelle de Podman ne voit pas les périphériques série USB). Il y faut Python 3.11 ou plus récent, avec la seule bibliothèque standard :
make pi-run PI_DEVICE=/dev/cu.usbmodemXXXX PI_SYSTEMS="hello ipc-demo isolation-test"
Pour chaque système, il construit l’image dans le conteneur, réinitialise la carte, envoie l’image par la ligne série et vérifie qu’elle est arrivée intacte, arme le watchdog de la carte, puis démarre l’image. Chaque journal est vérifié à mesure qu’il arrive, et le watchdog réinitialise la carte pour le système suivant. Chaque commande qu’il tape lui est renvoyée en écho et vérifiée avant d’être validée. Les journaux sont conservés dans build/rpi5b_2gb/pi-run/.
Regarder l’interface utilisateur
Avec l’écran branché avant la mise sous tension, la commande
make pi-run PI_DEVICE=/dev/cu.usbmodemXXXX PI_SYSTEMS=ui-demo PI_WATCHDOG=15
exécute la session scriptée de l’interface utilisateur sur l’écran HDMI et vérifie une empreinte de chaque image. Pour laisser un système tourner sous les yeux d’une personne, sans watchdog, utilisez make pi-show PI_DEVICE=… SYSTEM=ui-demo ; il tourne jusqu’à ce que la carte soit éteinte puis rallumée.
En cas d’échec
Revenez à la dernière image qui fonctionnait, et vérifiez de nouveau la ligne série et la chaîne de démarrage, avant de changer plus d’une chose à la fois. Si rien du tout n’apparaît avant U-Boot, vérifiez le réglage BOOT_UART du bootloader et enable_uart=1 dans le config.txt de la carte SD avant de soupçonner la sonde ou le câblage.