Bâtir sa distribution Linux embarquée avec Yocto : Premiers pas avec Toaster

Le projet Yocto est aujourd’hui la référence en ce qui concerne la création d’une distribution Linux embarqué. Personnellement j’ai l’habitude de travailler en mode console, ce qui peut rebuter les personnes habituées aux interfaces graphiques. Pour ceux-ci existe l’option d’utiliser Toaster. J’ai donc voulu tester ce mode de travail plus graphique pour la génération d’une distribution basée sur les outils du projet Yocto.

Avant tout, téléchargeons Yocto Project core version 2.0 depuis le site du Yocto Project :

cch@cch-tosh:/media/yocto-1504/yocto-jethro$ git clone -b jethro git://git.yoctoproject.org/poky.git 
Clonage dans 'poky'... 
remote: Counting objects: 290732, done. 
remote: Compressing objects: 100% (71058/71058), done. 
remote: Total 290732 (delta 214033), reused 290732 (delta 214033) 
Réception d'objets: 100% (290732/290732), 115.19 MiB | 512.00 KiB/s, done. 
Résolution des deltas: 100% (214033/214033), done. 
Vérification de la connectivité... fait. 

Réorganisons légèrement lé répertoire pour conserver les méta données dans un répertoire source dédié :

cch@cch-tosh:/media/yocto-1504/yocto-jethro$ mkdir sources 
cch@cch-tosh:/media/yocto-1504/yocto-jethro$ mv poky sources/

Installons maintenant un environnement virtuel Python, et activons le :

cch@cch-tosh:/media/yocto-1504/yocto-jethro$ virtualenv venv 
New python executable in venv/bin/python 
Installing setuptools, pip...done. 
cch@cch-tosh:/media/yocto-1504/yocto-jethro$ ls venv 
bin  include  lib  local 
cch@cch-tosh:/media/yocto-1504/yocto-jethro$ source venv/bin/activate

Nous pouvons maintenant installer Toaster :

(venv)cch@cch-tosh:/media/yocto-1504/yocto-jethro$ pip install -r sources/poky/bitbake/toaster-requirements.txt 
Downloading/unpacking Django==1.6 (from -r sources/poky/bitbake/toaster-requirements.txt (line 1)) 
  Downloading Django-1.6-py2.py3-none-any.whl (6.7MB): 6.7MB downloaded 
Downloading/unpacking South==0.8.4 (from -r sources/poky/bitbake/toaster-requirements.txt (line 2))
Downloading South-0.8.4-py2.py3-none-any.whl (135kB): 135kB downloaded Requirement already satisfied (use --upgrade to upgrade): argparse==1.2.1 in /usr/lib/python2.7 (from -r sources/poky/bitbake/toaster-requirements.txt (line 3)) Requirement already satisfied (use --upgrade to upgrade): wsgiref==0.1.2 in /usr/lib/python2.7 (from -r sources/poky/bitbake/toaster-requirements.txt (line 4)) Downloading/unpacking beautifulsoup4>=4.4.0 (from -r sources/poky/bitbake/toaster-requirements.txt (line 5)) Downloading beautifulsoup4-4.4.1-py2-none-any.whl (81kB): 81kB downloaded Installing collected packages: Django, South, beautifulsoup4 Successfully installed Django South beautifulsoup4 Cleaning up...
Toaster propose 2 modes de travail (voir http://www.yoctoproject.org/docs/2.0/toaster-manual/toaster-manual.html#intro-modes) :
  • le mode analyse qui se limite à présenter graphiquement les statistiques et les résultats des builds, le build lui même étant réalisé en ligne de commande à l’aide de bitbake.
  • le mode build dans lequel toaster se subsitue à bitbake pour piloter le build à travers l’interface graphique.
Nous allons utiliser le mode build pour la suite de cet article. Pour cela démarrons Toaster :
(venv)cch@cch-tosh:/media/yocto-1504/yocto-jethro$ cd sources/poky 
(venv)cch@cch-tosh:/media/yocto-1504/yocto-jethro/sources/poky$ bitbake/bin/toaster
Syncing... 
Creating tables ... 
Creating table auth_permission 
Creating table auth_group_permissions 
Creating table auth_group 
Creating table auth_user_groups 
Creating table auth_user_user_permissions 
Creating table auth_user 
Creating table django_content_type 
Creating table django_session 
Creating table django_admin_log 
Creating table south_migrationhistory 
Installing custom SQL ... 
Installing indexes ... 
Installed 0 object(s) from 0 fixture(s) 

Synced: 
 > django.contrib.auth 
 > django.contrib.contenttypes 
 > django.contrib.messages 
 > django.contrib.sessions 
 > django.contrib.admin 
 > django.contrib.staticfiles 
 > django.contrib.humanize 
 > south 

Not synced (use migrations): 
 - orm 
 - bldcontrol 
(use ./manage.py migrate to migrate these) 
Running migrations for orm: 
 - Migrating forwards to 0028_auto__chg_field_logmessage_message. 
 > orm:0001_initial 
 > orm:0002_auto__add_field_build_timespent 
 > orm:0003_timespent 
 - Migration 'orm:0003_timespent' is marked for no-dry-run. 
 > orm:0004_auto__add_field_package_installed_name 
 > orm:0005_auto__add_target_image_file__add_target_file__add_field_variablehistor 
 > orm:0006_auto__add_field_target_image_size__add_field_target_license_manifest_p 
 > orm:0007_auto__add_helptext 
 > orm:0008_auto__chg_field_variablehistory_operation__chg_field_recipe_descriptio 
 > orm:0009_auto__add_projectvariable__add_projectlayer__add_projecttarget__add_pr 
 > orm:0010_auto__add_field_project_branch__add_field_project_short_description__a 
 > orm:0011_auto__add_field_projectlayer_dirpath 
 > orm:0012_auto__add_field_projectlayer_optional__add_field_projecttarget_task 
 > orm:0013_auto__add_release__add_layerversiondependency__add_unique_layerversion 
 > orm:0014_auto__chg_field_package_summary__chg_field_layer_summary__chg_field_re 
 > orm:0015_auto__add_field_layer_vcs_web_url__add_field_layer_vcs_web_tree_base_u 
 > orm:0016_auto__add_field_release_helptext__chg_field_release_branch__add_index_ 
 > orm:0017_auto__del_toastersettingdefaultlayer__add_releaselayersourcepriority__ 
 > orm:0018_auto__add_field_layer_version_project 
 > orm:0019_auto__add_buildartifact 
 > orm:0020_auto__add_field_layer_version_local_path__add_field_recipe_pathflags__ 
 > orm:0021_auto__chg_field_build_project__chg_field_project_bitbake_version__chg_ 
 - Migration 'orm:0021_auto__chg_field_build_project__chg_field_project_bitbake_version__chg_' is marked for no-dry-run. 
 > orm:0022_auto__add_field_target_task__add_field_layer_version_local_path__del_f 
 > orm:0023_auto__del_field_build_warnings_no__del_field_build_errors_no__del_fiel 
 > orm:0024_auto__add_field_recipe_is_image 
 > orm:0025_auto__add_field_project_is_default 
 > orm:0026_set_default_project 
 - Migration 'orm:0026_set_default_project' is marked for no-dry-run. 
 > orm:0027_auto__add_customimagerecipe__add_unique_customimagerecipe_name_project 
 > orm:0028_auto__chg_field_logmessage_message 
 - Loading initial data for orm. 
Installed 0 object(s) from 0 fixture(s) 
Running migrations for orm: 
- Nothing to migrate. 
 - Loading initial data for orm. 
Installed 0 object(s) from 0 fixture(s) 
Running migrations for bldcontrol: 
 - Migrating forwards to 0009_auto__add_field_brlayer_layer_version. 
 > bldcontrol:0001_initial 
 > bldcontrol:0002_auto__add_field_buildenvironment_sourcedir__add_field_buildenvironment 
 > bldcontrol:0003_auto__add_field_brlayer_dirpath 
 > bldcontrol:0004_loadinitialdata 
 - Migration 'bldcontrol:0004_loadinitialdata' is marked for no-dry-run. 
 > bldcontrol:0005_auto__add_brerror 
 > bldcontrol:0006_auto__add_brbitbake 
 > bldcontrol:0007_auto__add_field_buildrequest_environment__chg_field_buildrequest_build 
 > bldcontrol:0008_brarchive 
 - Migration 'bldcontrol:0008_brarchive' is marked for no-dry-run. 
 > bldcontrol:0009_auto__add_field_brlayer_layer_version 
 - Loading initial data for bldcontrol. 
Installed 0 object(s) from 0 fixture(s) 

 -- Validation: The layers checkout directory must be set. 

 -- Validation: The build directory must be set. 

Build configuration saved 

Importing file: /media/yocto-1504/yocto-jethro/sources/poky/meta-yocto/conf/toasterconf.json 

Layer configuration imported. Updating information from the layer sources, please wait. 
You can re-update any time later by running bitbake/lib/toaster/manage.py lsupdates 
2015-11-30 12:01:21,748 DEBUG Fetching branches 
2015-11-30 12:01:27,692 DEBUG Fetching layer information 
2015-11-30 12:01:41,939 DEBUG Fetching machine information 
2015-11-30 12:09:37,227 DEBUG Fetching target information 
Starting webserver... 
Webserver address:  http://0.0.0.0:8000/ 
Starting browser... 
Toaster is now running. You can stop it with Ctrl-C
La fenêtre Toaster est automatiquement lancée dans le navigateur (URL : http://127.0.0.1:8000/toastergui/landing/). Elle propose de créer son 1er projet. Il faut renseigner le nom du projet (on prendra « premiers-pas »), et sélectionner la release (Yocto Project 2.0 Jethro pour bénéficier des données les plus récentes).

Le projet créé il faut choisir la machine cible et l’image à builder. Par défaut est proposé la machine qemux86, conservons là. Il faut renseigner l’image désirée, prenons core-image-minimal (image minimaliste en mode console).

Après avoir choisi les options et cliqué sur Build, Toaster lance les commandes bitbake ad hoc pour générer l’image et fournit une fenêtre de suivi :

Malheureusement dans notre cas, le PC de développement a rebooté au milieu du build de l’image core-image-minimal (surchauffe durant le build). Ceci se traduit par des erreurs lors de la génération de paquets natifs (fichiers générés tronqués du fait du reboot). Chaque fois que le build de l’image est relancé, il sort en erreur sur ces fichiers corrompus. La solution consiste à effacer les composants concernés.

Dans le cas de commande exécutées manuellement, un bitbake -c cleansstate sur les composants en cause suffit à nettoyer le problème et à relancer une génération correcte.

Malheureusement un tel nettoyage ne semble pas accessible à travers l’IHM de Toaster, ce qui nous conduit à une situation bloquée.

Pour pouvoir avancer, tentons une correction manuelle un peu sauvage : effaçons tous les fichiers objets de taille nulle (la cause des erreurs de compilation) trouvés dans les répertoires des composants, et relançons le build.

Après le temps nécessaire à un 1er build (ici plus de 3 heures), on obtient une image correspondant à core-image-minimal. L’IHM nous indique le succés de ce build :

On peut obtenir des informations complémentaires sur l’image qui vient d’être construite :

On peut obtenir des informations complémentaires sur l’image qui vient d’être construite :

Il est possible de consulter bien d’autres informations au sujet du build qui vient d’être généré, telles que :

  • liste des tâches élémentaires effectuées
  • liste des recettes traitées
  • liste des packages générés.

Il est également possible d’obtenir des informations de performance telles que durée d’exécution ou CPU consommée par les diverses tâches élémentaires.

Donc une fois le build généré Toaster fournit une interface agréable pour accéder aux informations.

Par contre un reproche majeur pour des builds qui durent longtemps (ce qui est vrai en particulier pour un 1er build) est que l’on est aveugle sur l’avancée du build jusqu’à ce que celui-ci se soit terminé.

La seule façon de juger de l’avancée des tâches est de rafraîchir périodiquement le fichier de log textuel dans un éditeur de texte. Ceci est bien moins confortable que lors de l’utilisation de bitbake en ligne de commande, qui fournit dans le terminal l’avancée des tâches et leurs sorties console.

Partager cet article

Partager sur facebook
Partager sur twitter
Partager sur linkedin
Partager sur pinterest
Partager sur print
Partager sur email

UN BLOG DE

CIO Systèmes Embarqués – 1 Rue de la Presse, 42 000 Saint-Étienne – contact@ciose.fr – 04 77 93 34 32 

CIO  Systèmes Embarqués est le nom commercial de la SAS CIO Informatique Industrielle 

CIO Informatique Industrielle © 1991-2020 v3.0

Mentions Légales