Catégories
Informatique

Créer une image pour Raspberry avec Yocto

Présentation et mise en place rapide de yocto pour créer une image pour raspberry pi

Yocto est un projet collaboratif, soutenu par la Linux Foundation, qui fournit des modèles, outils et méthodes pour vous aider à créer des systèmes embarqués (plus d’informations : https://linuxfr.org/news/yocto-ce-n-est-pas-un-systeme-embarque-mais)

Pré-requis

Il est conseillé pour le bon déroulement des opérations suivantes d’utiliser une machine avec ubuntu dans sa dernière version LTS.

Niveau matériel, compter minimum un processeur 3 cores (cas des machines virtuelles par exemple) avec au moins 4 Go de RAM (les compilations sont gourmandes en ressources). Enfin prévoyez un espace disque minimum de 150 Go. Des modifications sont possibles pour réduire l’empattement en mémoire.

La commande suivante permet d’installer le nécessaire à l’utilisation de yocto :

sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \
build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \
xz-utils debianutils iputils-ping libsdl1.2-dev xterm

En complément, les librairies et outils suivants peuvent être installés :

sudo apt-get install gitk libhighgui-devLangage du code : JavaScript (javascript)

Installation de yocto

L’installation de yocto est relativement simple, il suffit de télécharger le dépôt et d’aligner les branches sur le bon SHA1 dans git.

Dans un premier temps, placez vous dans un dossier de votre choix pour le téléchargement. Tout au long du reste de ce documents je me trouverai dans mon /home/Views/

git clone git://git.yoctoproject.org/poky
cd poky
git checkout master
cd ..
git clone https://github.com/openembedded/meta-openembedded.git
cd meta-openembedded
git checkout master
cd ..Langage du code : PHP (php)

Ajout d’un nouveau meta, exemple du meta-raspberry

Afin de pouvoir compiler sur la raspberry, nous allons devoir ajouter le layer correspondant. Ce layer contient tout le nécessaire pour réaliser des cross compilation vers la raspberry pi, quelque soit la version. Il suffit de spécifier la machine cible, nous le verrons par la suite.

Ce dossier s’ajoute très simplement comme lors du téléchargement de yocto. (Nous nous trouvons dans le dossier /home/Views/poky)

git clone git://git.yoctoproject.org/meta-raspberrypi
cd meta-raspberry
git checkout 79ea44b997a6eb6e2f0d36b1d583c85fa9e37f36
cd ..Langage du code : PHP (php)

L’installation de yocto est à présent terminé. Il faut à présent le configurer pour compiler une image utilisable par la raspberry.

Pour ce faire, nous allons utiliser le script présent dans la racine du dossier poky.

On a alors cette vue :

Le script que nous allons utiliser est oe-init-build-env

source oe-init-build-env

Ce script va créer un dossier build et nous déplacer dedans par la même occasion.

C’est dans le dossier conf de ce dossier build que nous allons travailler.

Plus spécifiquement, nous allons modifier le fichier bblayers.conf et local.conf.

Ainsi le fichier bblayer.conf est écrit ainsi (à adapter par rapport à votre install) :

# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"
BBPATH = "${TOPDIR}"
BBFILES ?= ""
BBLAYERS ?= " \
/home/macross/Views/poky/meta \
/home/macross/Views/poky/meta-poky \
/home/macross/Views/poky/meta-yocto-bsp \
/home/macross/Views/poky/meta-raspberrypi \
/home/macross/Views/poky/meta-openembedded/meta-oe \
/home/macross/Views/poky/meta-openembedded/meta-python \
/home/macross/Views/poky/meta-openembedded/meta-multimedia \
/home/macross/Views/poky/meta-openembedded/meta-networking \
/home/macross/Views/poky/meta-openembedded/meta-filesystems \
"Langage du code : PHP (php)

Pour ceux qui suivent dans le fond, j’ai ajouter les différents layers indiqués dans la documentation du meta-raspberrypi.

Concernant le fichier local.conf, les modifications sont plus importantes.

Tout d’abord, il faut rechercher la ligne où est indiqué la machine à compiler. Par défaut, elle est du type X86. Il faut la remplacer par la version de la raspberry pi que vous souhaitez compiler (voir documentations dans le meta associé). Dans mon cas c’est soit la V1 B ou la V2 que je souhaite utiliser.

MACHINE ??= "raspberrypi2"Langage du code : JavaScript (javascript)

Les modifications plus importantes vont se faire par l’ajout de ligne à la fin du fichier local.conf.

LICENSE_FLAGS_WHITELIST = "commercial"
ENABLE_UART = "1"
INHERIT += "rm_work"
EXTRA_IMAGE_FEATURES += " package-management"
RM_OLD_IMAGE = "1"
IMAGE_FSTYPES = "tar.bz2 rpi-sdimg"
RM_WORK_EXCLUDE += " opencv"Langage du code : JavaScript (javascript)

Ajout d’un nouveau programme à l’image

Afin d’ajouter un programme à l’image que nous allons générer, il faut se rendre dans le meta-raspberry/recipes-core/image afin d’éditer le fichier de l’image que nous souhaitons compiler. Dans notre cas, il s’agira de l’image rpi-basic-image qui se trouve dans le fichier rpi-test-image.bb.

Nous allons ajouter les lignes suivantes à la fin du fichier :

IMAGE_INSTALL_append += " packagegroup-core-ssh-openssh openssh-sftp-server"
IMAGE_INSTALL_append += " opencv opencv-samples"Langage du code : JavaScript (javascript)

Ces différents éléments permettent d’ajouter le ssh, opencv et nodejs respectivement dans l’image que nous allons compiler.

Compilation et copie du résultat sur carte SD

Afin de compiler l’image il faut se trouver dans le dossier build via le script oe-init-build-env.

à présent nous pouvons lancer la commande suivante et aller nous coucher… compter plusieurs heures de compilation même avec une bonne machine. Ceci est dû au temps de récupération des sources très long.

bitbake rpi-test-image -k

Le -k permet de compiler un maximum de choses même en cas d’erreur.

Une fois la compilation terminé. L’image de la carte SD se trouve dans le dossier build/tmp/deploy/images//*.rpi-sdimg

Utiliser etcher (etcher.io) pour flasher votre carte SD et tenter de booter sur la raspberry.

Via ssh, le nom de connexion est root. pas de mot passe. De même en connexion directe.

Conclusion

Cet article est une introduction rapide à l’utilisation de yocto pour créer une image pour raspberry. De nombreux éléments peuvent être modifiés afin de réduire, d’une part la quantité de données a téléchargé et compilé, d’autre part le temps de compilation.

Bien évidemment, n’hésitez pas à creuser les ressources que je mets en lien plus bas.

Bon dev !

Ressources

https://linuxfr.org/news/yocto-ce-n-est-pas-un-systeme-embarque-mais

https://www.yoctoproject.org/docs/1.7/yocto-project-qs/yocto-project-qs.html

https://www.learnopencv.com/

https://www.opencv-srf.com/p/introduction.html

https://www.packtpub.com/books/content/building-our-first-poky-image-raspberry-pi

http://www.yoctoproject.org/docs/current/yocto-project-qs/yocto-project-qs.html

http://kernelhacks.com/raspberry-pi-3-with-yocto/

https://github.com/openembedded/meta-openembedded

https://github.com/Nuand/bladeRF/wiki/Creating-Linux-based-Embedded-System-Images-with-Yocto

https://www.raspberrypi.org/forums/viewtopic.php?f=32&t=178398

http://www.jumpnowtek.com/rpi/Raspberry-Pi-Systems-with-Yocto.html

https://stackoverflow.com/questions/45627686/how-to-delete-deploy-images-beaglebone-dir-in-yocto

https://raspberrypi.stackexchange.com/questions/57155/how-do-i-used-yocto-to-build-an-sdcard-image-for-my-raspberry-pi-3-model-b

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.