% Copyright (C) 2018 TANSORIER.
% Permission is granted to copy, distribute and/or modify this document
% under the terms of the GNU Free Documentation License, Version 1.3
% or any later version published by the Free Software Foundation;
% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
% A copy of the license is included in the section entitled "GNU
% Free Documentation License".
% https://www.gnu.org/licenses/fdl-1.3.html
% compress option to have horyzontal circle
\documentclass [compress] { smilebeamer}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Thèmes suppélmentaires
\useoutertheme [] { miniframes} % barre menu du haut
\setbeamertemplate { frametitle} [default] % replace le titre à la bonne place
\useinnertheme { rounded} % arrondi les angles
\setbeamertemplate { footline} [text line]{
\textcolor { gray} { %
\parbox { \linewidth } { \vspace * { -8pt} Smile ECS\hfill \insertshortauthor \hfill \insertpagenumber /\inserttotalframenumber } }
}
\beamertemplatenavigationsymbolsempty
% Language
\usepackage [french] { babel}
\usepackage [utf8] { inputenc}
\usepackage [T1] { fontenc}
% Display Table Of Content spécific for smilebeamer
% Force to get empty
\AtBeginSection [] { }
\AtBeginSubsection [] { }
%{
% \begin{frame}<beamer>
% \frametitle{Plan}
% \tableofcontents[currentsection]
% \end{frame}
%}
% Change color of definiton block
\AtBeginEnvironment { definition} { %
\setbeamercolor { block title} { use=example text,fg=example text.fg,bg=example text.fg!20!bg}
\setbeamercolor { block body} { parent=normal text,use=block title,bg=block title.bg!50!bg}
}
% caption size reduce
\usepackage { caption}
\setbeamerfont { caption} { size=\scriptsize }
% code coloration
\usepackage { listings}
% L'option "[fragile]" doit être rajouté au frame pour pouvoir utiliser correctement
% la police verbatim
\usepackage { color}
\lstset {
breaklines=true,
tabsize=4,
backgroundcolor=\color [RGB] { 49,54,59} ,
basicstyle=\footnotesize \ttfamily \color { white} ,
commentstyle=\itshape \color [RGB] { 0,136,136} ,
morecomment=[l]{ \# } ,
morekeywords={ *,\$ ,\{ ,\} } ,
stringstyle=\itshape \color [RGB] { 218,116,0} ,
showstringspaces=false,
frame=LTBR,
}
\lstdefinestyle { shell} {
language=bash,
keywords={ \$ } ,
keywordstyle=\bfseries \color [RGB] { 66,198,66} ,
literate=
{ ├} { { \smash { \raisebox { -1ex} { \rule { 1pt} { \baselineskip } } } \raisebox { 0.5ex} { \rule { 1ex} { 1pt} } } } 1
{ ─} { { \raisebox { 0.5ex} { \rule { 1.5ex} { 1pt} } } } 1
{ │} { { \smash { \raisebox { -1ex} { \rule { 1pt} { \baselineskip } } } \raisebox { 0.5ex} { \rule { 1ex} { 0pt} } } } 1
{ └} { { \smash { \raisebox { 0.5ex} { \rule { 1pt} { \dimexpr \baselineskip -1.5ex} } } \raisebox { 0.5ex} { \rule { 1ex} { 1pt} } } } 1
}
\lstdefinestyle { bitbake} {
language=bash,
alsoletter=-,
morekeywords={ \$ ,\{ ,\} } ,
morekeywords={ BBFILES,BBFILE_ COLLECTIONS,BBFILE_ PATTERN_ meetup,BBFILE_ PRIORITY_ meetup,%
BBLAYERS,MACHINE,DISTRO,LAYERDEPENDS_ meta-python,DISTRO_ FEATURES_ remove,%
DISTRO_ FEATURES_ append,VIRTUAL-RUNTIME_ init_ manager,require,DISTRO_ NAME,%
DISTRO_ VERSION,DISTRO_ FEATURES_ DEFAULT,DISTRO_ FEATURES_ LIBC,PACKAGE_ CLASSES,%
POKY_ DEFAULT_ DISTRO_ FEATURES,DISTRO_ FEATURES,IMAGE_ FEATURES,IMAGE_ INSTALL,BBPATH} ,
keywordstyle=\bfseries \color [RGB] { 152,251,152} ,
}
% pour les schemas
\usepackage { tikz}
\usepackage { tikz}
% Pour utiliser des colonnes
\usepackage { multicol}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\title [Yocto] { Yocto - \texttt { devtool} - Ansible \\ \textbf { La dernière recette de ma grand-mère} }
\author [Mickaël Tansorier] { Mickaël Tansorier}
\date [Mars 2018] { Présenstation sur le fonctionnement de Yocto et d'outils pratiques.}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin { document}
%\tableofcontents[subsectionstyle=hide]
% *******************************
% **** PAGE DE GARDE ****
% *******************************
\begin { frame}
\titlepage
\end { frame}
% *******************************
% **** INTRODUCTION ****
% *******************************
\section { Introduction}
\begin { frame}
\underline { Objectif de la présentation}
\begin { itemize}
\item Présenter Yocto
\item Démonstration concrète sur Rapsberry Pi
\item Présentation d'outils utiles
\begin { itemize}
\item \texttt { devtool}
\item \texttt { Ansible}
\end { itemize}
\end { itemize}
\end { frame}
\begin { frame} { Plan}
\tableofcontents [hideallsubsections]
\end { frame}
\subsection { Historique}
\begin { frame} { D'où vient ce nom ?}
\begin { definition}
Yocto est un préfixe représentant 10\textsuperscript { -24} unités (SI)
\end { definition}
\end { frame}
\begin { frame}
\begin { block} { Qu'est ce qu'est vraiment Yocto ?}
Yocto est un outil qui répond au besoin de générer une distribution
\textbf { Linux embarqué} pour un matériel \textbf { dédié} .
\end { block}
\end { frame}
\begin { frame}
\begin { block} { Pourquoi Yocto existe ?}
Ce projet s'est basé sur l'outil \textbf { OpenEmbedded} pour voir le jour.\newline { } \\
En effet il y avait une volonté de pouvoir moduler les applications sur
\textbf { différents matériels} sans avoir à investir dans un nouveau développement.
\newline { } \\
Des développeurs et la Fondation Linux se sont unis pour proposer une
mécanique qui fasse abstraction du matériel, et ainsi rendre réutilisables
les développements déjà effectués.\newline { } \\
\textbf { Depuis 2010 ce projet continue sa route !}
\end { block}
\end { frame}
% *******************************
% **** PRÉSENTATION ****
% *******************************
\section { Présentation de Yocto}
\begin { frame} { Présentation de Yocto}
\tableofcontents [currentsection,hideallsubsections]
\end { frame}
\begin { frame} { Présentation de Yocto}
\begin { center}
\includegraphics [width=0.7\textwidth] { logos/yocto-project-transp.png}
\end { center}
\end { frame}
\begin { frame} { Pas si vite …}
Avant tout, un peut de contexte.\newline
\newline
\begin { itemize}
\item Est-ce que Yocto est le seul outils qui existe ?
\item Qu'est-ce qu'il a de plus que les autres ?
\item Comment c'est architecturé ?
\end { itemize}
\end { frame}
%
% **** ALTERNATIVES ****
%
\subsection { Alternatives à Yocto}
\begin { frame}
D’ autres outils permettent de créer des distributions Linux pour les systèmes embarqués.
\begin { columns} [t]
\begin { column} { 0.33\textwidth }
\begin { exampleblock} { Buildroot}
\includegraphics [width=\textwidth] { logos/buildroot.png}
Buildroot est un outil qui ressemble à un jeu de makefile, capable de générer tous les éléments pour démarrer un système sous Linux.
\end { exampleblock}
\end { column}
\begin { column} { 0.33\textwidth }
\begin { exampleblock} { Linux From Scratch}
\includegraphics [width=\textwidth] { logos/linux_ from_ scratch-with_ text.png}
\newline
\newline
Linux from scratch est un projet qui décrit pas à pas les instructions pour construire un système Linux. Très instructif mais fastidieux !
\end { exampleblock}
\end { column}
\begin { column} { 0.33\textwidth }
\begin { exampleblock} { OpenWrt}
\includegraphics [width=\textwidth] { logos/OpenWrt.png}
\newline
\newline
\newline
OpenWrt est un système libre et issu de Buildroot. Très orienté réseau, il offre la possibilité de gérer les paquets ipk.
\end { exampleblock}
\end { column}
\end { columns}
\end { frame}
%
% **** LE PLUS DE YOCTO ****
%
\subsection { Qu'est ce que Yocto a de plus ?}
\begin { frame}
Yocto et Buildroot sont deux outils très proches mais avec fonctionnalité qui diffères en fonction des besoins
\begin { center}
\includegraphics [width=0.7\textwidth] { schemas/buildroot_ vs_ yocto.png}
\end { center}
\end { frame}
\begin { frame}
La différenciation de l’ \textbf { architecture matérielle} de l’ \textbf { application logicielle} de la cible
\begin { itemize}
\item \texttt { MACHINE} : définit l’ architecture matérielle
\item \texttt { DISTRO} : définit la distribution à générer
\end { itemize}
Une \textbf { communauté} active
\begin { itemize}
\item Nouvelle version tous les 6 mois
\item 1 version de dev, 3 stables, le reste en communauté
\item Channel IRC actif
\end { itemize}
De la \textbf { documentation} bien fournie
\begin { itemize}
\item Doc classique
\item Vidéo
\end { itemize}
Des \textbf { outils} puissants
\begin { itemize}
\item \texttt { devtool}
\item \texttt { ipk} /\texttt { opkg}
\end { itemize}
\end { frame}
%
% **** LE PLUS DE YOCTO ****
%
\subsection { Configuration et Évolution}
\begin { frame}
\begin { itemize}
\item Yocto est gourmand en ressources, une configuration minimale de 50Go de disque dur, un CPU à 1,6GHz et 8Go de RAM est recommandée.
\item Plusieurs distributions Linux supportent Yocto : Ubuntu, Fedora, Debian, OpenSuse, CentOS.
\item Le projet Yocto produit une nouvelle version majeure tous les 6 mois environ.
\item Elle porte généralement un nom associé à un numéro de version.
ex : Morty (2.2), Pyro (2.3), Rocko (2.4), Sumo (2.5), ...
\end { itemize}
\end { frame}
\subsection { Le squelette}
\begin { frame} { Workflow}
\includegraphics [width=\textwidth] { schemas/yocto_ workflow.png}
\end { frame}
\begin { frame}
\tikzstyle { recette} = [draw, fill=smileOrange!70, rectangle, minimum height=2.5em, minimum width=10em,rounded corners=5pt]
\tikzstyle { cadre} = [rectangle, draw, minimum height=12em, minimum width=8.5em, fill=smileOrange!70]
\begin { center}
\begin { tikzpicture} [node distance=1.2cm]
% Yocto
\node [draw,rectangle,minimum height=8cm, minimum width=10cm, fill=smileOrange!70, label={[anchor=north] north:Yocto} ] (YOCTO) { } ;
% Bitbake
\node [draw,rectangle, minimum height=2.5em, minimum width=8cm,rounded corners=5pt, fill=blue!40, yshift=2.8cm] (bitbake) { BITBAKE} ;
% Layers
\node [draw,rectangle, minimum height=2.5cm, minimum width=3cm,rounded corners=5pt, fill=green!70!black!70, yshift=0.7cm, xshift=-2cm, label={[anchor=north] north:LAYER A} ] (layer-A) { } ;
\node [draw,rectangle, right of=layer-A, minimum height=2.5cm, minimum width=3cm,rounded corners=5pt, fill=green!70!black!70, xshift=2.6cm, label={[anchor=north] north:LAYER B} ] (layer-B) { } ;
\node [draw,rectangle, below of=layer-A, minimum height=2.5cm, minimum width=3cm,rounded corners=5pt, fill=green!70!black!70, yshift=-1.8cm, label={[anchor=north] north:LAYER C} ] (layer-C) { } ;
\node [draw,rectangle, below of=layer-B, minimum height=2.5cm, minimum width=3cm,rounded corners=5pt, fill=green!70!black!70, yshift=-1.8cm, label={[anchor=north] north:LAYER D} ] (layer-D) { } ;
% Recettes
\node [draw,rectangle, below of=layer-A, fill=red!80!black!70, xshift=0.3cm, yshift=1.6cm] (rectte-A1) { RECETTE A1} ;
\node [draw,rectangle, below of=rectte-A1, fill=red!80!black!70, yshift=0.6cm] (rectte-A2) { RECETTE A2} ;
\node [draw,rectangle, below of=rectte-A2, fill=red!80!black!70, yshift=0.6cm] (rectte-A3) { RECETTE A3} ;
\node [draw,rectangle, below of=layer-B, fill=red!80!black!70, xshift=0.3cm, yshift=1.6cm] (rectte-B1) { RECETTE B1} ;
\node [draw,rectangle, below of=rectte-B1, fill=red!80!black!70, yshift=0.6cm] (rectte-B2) { RECETTE B2} ;
\node [draw,rectangle, below of=rectte-B2, fill=red!80!black!70, yshift=0.6cm] (rectte-B3) { RECETTE B3} ;
\node [draw,rectangle, below of=layer-C, fill=red!80!black!70, xshift=0.3cm, yshift=1.6cm] (rectte-C1) { RECETTE C1} ;
\node [draw,rectangle, below of=rectte-C1, fill=red!80!black!70, yshift=0.6cm] (rectte-C2) { RECETTE C2} ;
\node [draw,rectangle, below of=rectte-C2, fill=red!80!black!70, yshift=0.6cm] (rectte-C3) { RECETTE C3} ;
\node [draw,rectangle, below of=layer-D, fill=red!80!black!70, xshift=0.3cm, yshift=1.6cm] (rectte-D1) { RECETTE D1} ;
\node [draw,rectangle, below of=rectte-D1, fill=red!80!black!70, yshift=0.6cm] (rectte-D2) { RECETTE D2} ;
\node [draw,rectangle, below of=rectte-D2, fill=red!80!black!70, yshift=0.6cm] (rectte-D3) { RECETTE D3} ;
\end { tikzpicture}
\end { center}
\end { frame}
\begin { frame}
Quelques layers générique communautaire
\begin { itemize}
\item meta
\item meta-openembedded
\begin { itemize}
\item meta-oe
\item meta-networking
\item meta-python
\item meta-gnome
\end { itemize}
\item meta-poky
\end { itemize}
D'autre plus spécifique
\begin { itemize}
\item meta-raspberrypi
\item meta-intel
\item meta-xfce
\item meta-qt5
\end { itemize}
\end { frame}
%
% **** LE COEUR ****
%
\subsection { Le coeur}
\begin { frame}
\begin { center}
\textcolor { smileOrange} { \huge { Avant de passer aux recettes, qui fait le travail dans Yocto ?} }
\end { center}
\end { frame}
\begin { frame} { bitbake}
\begin { block} { bitbake c'est quoi ?}
\begin { itemize}
\item Un moteur d'exécution de tâches écrite en Python
\item Fonctionne en ligne de commande
\item Exécute automatiquement les tâches nécessaires à la fabrication de la cible fournie
\end { itemize}
\end { block}
\end { frame}
\begin { frame} { bitbake}
\tikzstyle { block} = [draw, fill=smileOrange!70, rectangle, minimum height=2.5em, minimum width=10em,rounded corners=5pt]
\tikzstyle { arrow} = [thick,->,>=stealth]
\begin { center}
\begin { tikzpicture} [node distance=1.2cm]
\node [block, fill=green!60!black!50] (read) { LECTURE RECETTE} ;
\node [block, below of=read] (fetch) { FETCH} ;
\node [block, below of=fetch] (unpack) { UNPACK} ;
\node [block, below of=unpack] (patch) { PATCH} ;
\node [block, below of=patch] (configure) { CONFIGURE} ;
\node [block, right of=configure, xshift=3cm] (compile) { COMPILE} ;
\node [block, above of=compile] (install) { INSTALL} ;
\node [block, above of=install] (package) { PACKAGE} ;
\node [block, above of=package, fill=green!60!black!50] (rootfs) { ROOFS} ;
\draw [arrow] (read) -- (fetch);
\draw [arrow] (fetch) -- (unpack);
\draw [arrow] (unpack) -- (patch);
\draw [arrow] (patch) -- (configure);
\draw [arrow] (configure) -- (compile);
\draw [arrow] (compile) -- (install);
\draw [arrow] (install) -- (package);
\draw [arrow] (package) -- (rootfs);
\end { tikzpicture}
\end { center}
\end { frame}
\begin { frame} { recette}
\begin { block} { À quoi ça ressemble une recette ?}
\includegraphics [width=\textwidth] { images/recette-yocto.png}
\end { block}
\end { frame}
%
% **** CHOISIR UNE IMAGE ****
%
\subsection { Se choisir une image}
\begin { frame}
\begin { center}
\textcolor { smileOrange} { \huge { Comment crée son image spécifique pour une carte donnée ?} }
\end { center}
\end { frame}
\begin { frame}
Yocto à la particularité de bien séparer la \textbf { distribution} de l'\textbf { architecture matériel} .
\newline \\
Les architectures matériel
\begin { itemize}
\item ARM
\item x86
\item x86-64
\item PowerPC
\item MIPS
\end { itemize}
Les cartes associés
\begin { itemize}
\item Raspberry Pi (différent versions)
\item Beaglebone
\item intel-core2-32
\end { itemize}
\textcolor { gray} { \tiny { Les différents BSP sont répertoriés sur le site de yoctoproject : \url { https://www.yoctoproject.org/downloads/bsps} } }
\end { frame}
\begin { frame} [fragile]
Le paramétrage de la \texttt { DISTRO} et de la \texttt { MACHINE} se fait en local.
\newline \\
\texttt { \$ POKY/build/conf/local.conf}
\begin { lstlisting} [style=bitbake]
# This sets the default machine to be qemux86 if no other machine is selected:
MACHINE ??= "qemux86"
# Default distro:
DISTRO ?= "poky"
# Mes parametres
MACHINE = "raspberrypi3-64"
DISTRO = "distromeetup"
\end { lstlisting}
\end { frame}
% *******************************
% **** TP RASPBERRY PI ****
% *******************************
\section { TP Rapsberry Pi}
\begin { frame} { TP Raspberry Pi}
\tableofcontents [currentsection,hideallsubsections]
\end { frame}
\begin { frame} { TP Raspberry Pi}
\begin { center}
\includegraphics [width=0.9\textwidth] { logos/yocto_ plus_ raspberry_ pi.png}
\end { center}
\end { frame}
\subsection { Installer l'environnement Yocto}
\begin { frame}
Les étapes:
\begin { enumerate}
\item Installer l'environnement de développement
\item Construire une distribution générique
\item Créer sa propre distribution
\item Tester son image
\end { enumerate}
\end { frame}
\begin { frame} [fragile]
On se base sur la dernière version de Yocto stable disponible, c'est à dire \texttt { rocko} qui est sortie en octobre 2017. \textcolor { gray} { \tiny { (la prochaine est en avril 2018)} }
\begin { lstlisting} [style=shell]
$ git clone git: / / git.yoctoproject.org / poky - b rocko
$ cd poky
$ git clone git: / / git.yoctoproject.org / meta - raspberrypi - b rocko
$ git clone git: / / git.openembedded.org / meta - openembedded - b rocko
\end { lstlisting}
\end { frame}
\subsection { Construire une distribution générique}
\begin { frame} [fragile]
Pour construire son image il faut d'abord:
\begin { itemize}
\item Sourcer l'environnement pour bitbake
\begin { lstlisting} [style=shell]
$ . oe - init - build - env
\end { lstlisting}
Cela nous créer un dossier \texttt { build} dans lequel tout va se passer.
\item Paramétré la \texttt { MACHINE} et la \texttt { DISTRO} \newline
Ces variables sont écrites dans le fichier \texttt { local.conf} .
\end { itemize}
\end { frame}
\begin { frame} [fragile]
Il reste plus qu'à modifier \texttt { \$ POKY/build/conf/local.conf}
\begin { lstlisting} [style=bitbake]
# Mes parametres
MACHINE = "raspberrypi3-64"
\end { lstlisting}
et ajouter le layer manquant dans \texttt { \$ POKY/build/conf/bblayers.conf}
\begin { lstlisting} [style=bitbake]
BBLAYERS += " \
$ { TOPDIR } / .. / meta - raspberrypi \
"
\end { lstlisting}
\textcolor { gray} { \tiny { Les chemains sont en général absolue comme: \texttt { /home/username/path/to/project/poky/meta-raspberrypi} } } \newline
Et enfin lancer la construction de l'image avec
\begin { lstlisting} [style=shell]
$ bitbake core - image - minimal
\end { lstlisting}
\end { frame}
\subsection { Yocto est intelligent}
\begin { frame} [fragile]
Yocto est là pour vous aider à construire votre image.\newline
En effet si l'on ne rajoute seulement \texttt { meta-raspberrypi} dans \texttt { bblayers.conf} on obtiens l'erreur suivante:
\begin { block} { meta-python}
\begin { lstlisting} [basicstyle=\footnotesize \ttfamily \color { red!80!black!60} ]
ERROR: ParseError at /home/ubuntu/meetup/poky/meta-raspberrypi/recipes-devtools/python/rpio_ 0.10.0.bb:9: Could not inherit file classes/pypi.bbclass
\end { lstlisting}
Il faut donc rajouter \texttt { meta-openembedded/meta-python}
\end { block}
\begin { block} { meta-oe}
\begin { lstlisting} [basicstyle=\footnotesize \ttfamily \color { red!80!black!60} ]
ERROR: Layer 'meta-python' depends on layer 'openembedded-layer', but this layer is not enabled in your configuration
\end { lstlisting}
De plus dans \texttt { meta-python/conf/layer.conf} on a
\begin { lstlisting} [style=bitbake]
LAYERDEPENDS_ meta-python = "core openembedded-layer"
\end { lstlisting}
\end { block}
\end { frame}
\begin { frame} [fragile]
Il faut donc rajouter les layers qui vont bien dans \texttt { bblayers.conf}
\begin { lstlisting} [style=bitbake,escapeinside={ <@} { @>} ]
BBLAYERS += " \
$ { TOPDIR } / .. / meta - raspberrypi \
<@\textit { \texttt { \textcolor { green!80!black} { \$ \{ TOPDIR\} /../meta-openembedded/meta-python} } } @> \
<@\textit { \texttt { \textcolor { green!80!black} { \$ \{ TOPDIR\} /../meta-openembedded/meta-oe} } } @> \
"
\end { lstlisting}
\textcolor { gray} { On peut maintenant construire et tester une image}
\end { frame}
\subsection { Créer sa propre distribution}
%https://www.yoctoproject.org/docs/2.5/mega-manual/mega-manual.html#enabling-wayland-in-an-image
\begin { frame}
\begin { center}
\textcolor { smileOrange} { \huge { Étape suivante:} }
\end { center}
\begin { center}
\textcolor { smileOrange} { \huge { Créer sa propre distribution} }
\end { center}
\end { frame}
\begin { frame} [fragile]
Pour créer sa propre distribution il est préférable de créer son propre layer
\begin { lstlisting} [style=shell]
$ cd $ POKY
$ mkdir - p meta - meetup / conf
\end { lstlisting}
Il faut déclarer la layer avec \texttt { ./conf/layer.conf}
\begin { lstlisting} [style=bitbake]
# We have a conf and classes directory, add to BBPATH
BBPATH .= ":$ { LAYERDIR } "
# We have recipes-* directories, add to BBFILES
BBFILES += "$ { LAYERDIR } / recipes - * / * / * .bb \
$ { LAYERDIR } / recipes - * / * / * .bbappend"
BBFILE_ COLLECTIONS += "meetup"
BBFILE_ PATTERN_ meetup = "^ $ { LAYERDIR } / "
BBFILE_ PRIORITY_ meetup = "10"
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]
Il faut maintenant l'ajouter dans \texttt { \$ POKY/build/conf/bblayers.conf}
\begin { lstlisting} [style=bitbake,escapeinside={ <@} { @>} ]
BBLAYERS += " \
$ { TOPDIR } / .. / meta - raspberrypi \
$ { TOPDIR } / .. / meta - openembedded / meta - python \
$ { TOPDIR } / .. / meta - openembedded / meta - oe \
<@\textit { \texttt { \textcolor { green!80!black} { \$ \{ TOPDIR\} /../meta-meetup} } } @> \
"
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]
Créer sa distro avec \texttt { ./conf/distro/distromeetup.conf}
\begin { lstlisting} [style=bitbake]
# Distribution base sur poky
require conf/distro/poky.conf
DISTRO = "distromeetup"
DISTRO_ NAME = "Distro meetup example"
DISTRO_ VERSION = "0.1"
# Ajout d'option pour la distribution
DISTRO_ FEATURES_ append = " systemd"
VIRTUAL-RUNTIME_ init_ manager = "systemd"
# Utilisation seulement du paquetage ipk
PACKAGE_ CLASSES = "package_ ipk"
\end { lstlisting}
Si on souhaite utiliser la nouvelle distribution il faut ajouter dans \texttt { \$ POKY/build/conf/local.conf}
\begin { lstlisting} [style=bitbake]
MACHINE = "raspberrypi3-64"
DISTRO = "distromeetup"
\end { lstlisting}
\end { frame}
\begin { frame}
\begin { center}
\textcolor { smileOrange} { \huge { Créer son image et choisir ce que l'on met dedans ?} }
\end { center}
\end { frame}
\begin { frame} [fragile]
Par defaut la distro héritant de poky contiens
\begin { lstlisting} [style=bitbake]
DISTRO_ FEATURES = "$ { DISTRO _ FEATURES _ DEFAULT } $ { DISTRO_ FEATURES_ LIBC} $ { POKY _ DEFAULT _ DISTRO _ FEATURES } "
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]
Avec dans chaques variables
\begin { lstlisting} [style=bitbake]
DISTRO_ FEATURES_ DEFAULT="acl alsa argp bluetooth ext2 irda largefile pcmcia usbgadget us bhost wifi xattr nfs zeroconf pci 3g nfc x11"
DISTRO_ FEATURES_ LIBC="ipv4 ipv6 libc-backtrace libc-big-macros libc-bsd libc-cxx-tests l ibc-catgets libc-charsets libc-crypt libc-crypt-ufc libc-db-aliases libc-envz libc-fcvt libc-fmtmsg libc-fstab libc-ftraverse libc-getlogin libc-idn libc-inet-anl libc-libm libc-locales libc-locale-code libc-memusage libc-nis libc-nsswitch libc-rcmd libc-rtld-debug libc-spawn libc-streams libc-sunrpc libc-utmp libc-utmpx libc-wordexp libc-posix-clang-wchar libc-posix-regexp libc-posix-regexp-glibc libc-posix-wchar-io"
POKY_ DEFAULT_ DISTRO_ FEATURES="largefile opengl ptest multiarch wayland vulkan"
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]
Créer son image \texttt { ./recipes-image/rapsberrypi/myrpi.bb}
\begin { lstlisting} [style=bitbake]
require recipes-graphics/images/core-image-weston.bb
IMAGE_ FEATURES += "
ssh-server-openssh \
"
IMAGE_ INSTALL += " \
setkey \
"
\end { lstlisting}
{ \color [RGB] { 232,120,0} \texttt { ssh-server-openssh} } permet d'avoir accès à la carte en ssh
{ \color [RGB] { 232,120,0} \texttt { setkey} } nouvelle recette permettant de passer qwerty en bépo
\end { frame}
\begin { frame}
\begin { center}
\huge { Testons notre image !}
\includegraphics [width=1\textwidth] { images/weston-desktop.png}
\end { center}
\end { frame}
% *******************************
% **** OUTILS DEVTOOL ****
% *******************************
\section { \texttt { devtool} }
\begin { frame} { \texttt { devtool} }
\tableofcontents [currentsection,hideallsubsections]
\end { frame}
\begin { frame} { \texttt { devtool} }
\begin { center}
\textcolor { smileOrange} { \huge { Exemple de l'utilisation de l'outil \texttt { devtool} } }
\end { center}
\end { frame}
\subsection { Les commandes de base}
\begin { frame}
\texttt { devtool} est un outils très utiles lorsque l'on souhaite créer, développer ou modifier une recette et ses sources.\newline
\newline
Les commandes de base:
\begin { description}
\item [\texttt{devtool add}] Ajoute un nouveau software à construire
\item [\texttt{devtool modify}] Génère un environnement pour modifier les sources d'un composant
\item [\texttt{devtool upgrade}] Met à jour une recette existante
\item [\texttt{devtool reset}] Arrête le contexte de développement
\end { description}
\end { frame}
\begin { frame}
Les sources peuvent provenir de plusieurs endroits différent
\begin { center}
\includegraphics [width=1\textwidth] { images/devtool-add-src.png}
\end { center}
\end { frame}
\begin { frame}
De même pour modifier une recette
\begin { center}
\includegraphics [width=1\textwidth] { images/devtool-modify-src.png}
\end { center}
\end { frame}
\subsection { Le comportement de \texttt { devtool} }
\begin { frame} [fragile]
Dès lors \texttt { devtool} créer un layer spécial (\texttt { workspace} ) qui prend la priorité maximal sur les autres layers.
\begin { lstlisting} [style=shell,breaklines=false,xleftmargin=-18px,xrightmargin=-18px]
$ bitbake - layers show - layers
NOTE: Starting bitbake server...
layer path priority
=========================================================================
meta /home/[...]/meta 5
meta-poky /home/[...]/meta-poky 5
meta-yocto-bsp /home/[...]/meta-yocto-bsp 5
workspace /home/[...]/build/workspace 99
meta-raspberrypi /home/[...]/build/../meta-raspberrypi 9
meta-python /home/[...]/build/../meta-openembedded/meta-python 7
meta-oe /home/[...]/build/../meta-openembedded/meta-oe 6
meta-meetup /home/[...]/build/../meta-meetup 10
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]
Dans ce layer on retrouve
\begin { itemize}
\item les sources mis sous git et patché
\item un bbappend de la recette
\end { itemize}
\begin { lstlisting} [style=shell]
$ cd $ POKY/build/workspace/
$ tree - L 2
.
├── appends
│ └── weston_ 2.0.0.bbappend
├── conf
│ └── layer.conf
├── README
└── sources
└── weston
\end { lstlisting}
\end { frame}
\subsection { Exemple pratique}
\begin { frame}
\begin { center}
\textcolor { smileOrange} { \huge { Exemple pratique avec la recette \texttt { weston} } }
\end { center}
\end { frame}
\begin { frame} [fragile]
Modification avec \texttt { devtool} des sources de weston
\begin { lstlisting} [style=shell]
$ devtool modify weston
$ cd $ POKY/build/workspace/sources/weston/
$ vim libweston / compositor - wayland.c + 1655
\end { lstlisting}
Ajout du patch "Fix an uninitialized variable"
% https://github.com/wayland-project/weston/commit/6b2fb180d99bb9d6deaddb1cdf735422d4dd5b93
\begin { lstlisting} [escapeinside={ <@} { @>} ]
@@ -1652,6 +1652,7 @@ input_ handle_ axis(void *data, struct wl_ pointer *pointer,
weston_ event.axis = axis;
weston_ event.value = wl_ fixed_ to_ double(value);
<@\textcolor { green!80!black} { \texttt { +\, \, \, \, weston\_ event.has\_ discrete = false;} } @>
if (axis == WL_ POINTER_ AXIS_ VERTICAL_ SCROLL & &
input->vert.has_ discrete) {
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]
Les étapes:
\begin { enumerate}
\item Faire la modification
\item Tester
\item Commiter
\item Appliquer la modification sous forme de patch
\begin { lstlisting} [style=shell]
$ devtool update - recipe weston
[...]
NOTE: Adding new patch 0001-Fix-an-uninitialized-variable.patch
NOTE: Updating recipe weston_ 2.0.0.bb
\end { lstlisting}
\item Ajouter la modification dans son layer
% L'ajout d'un bbappend dans meta-meetup
% Supprimer l'ajout de meta/recipes-graphics/wayland/weston_2.0.0.bb
% Le déplacement du patch dans meta-meetup
\item Arrêter devtool
\begin { lstlisting} [style=shell]
$ devtool reset weston
\end { lstlisting}
\end { enumerate}
\end { frame}
% *******************************
% **** OUTILS ANSIBLE ****
% *******************************
\section { Ansible}
\begin { frame} { Ansible}
\tableofcontents [currentsection,hideallsubsections]
\end { frame}
\begin { frame}
\begin { center}
\includegraphics [width=0.3\textwidth] { logos/Ansible.png}
\end { center}
\begin { center}
\textcolor { smileOrange} { \huge { Utiliser Ansible pour mettre en place un environnement Yocto} }
\end { center}
\end { frame}
\subsection { C'est quoi Ansible ?}
\begin { frame}
\begin { definition}
Ansible est un logiciel destiné à la configuration et la gestion de parc informatique.
\end { definition}
Il permet de :
\begin { itemize}
\item déployer des logiciels
\item gérer des configurations
\item lancer des tâches
\end { itemize}
Pour:
\begin { itemize}
\item une machine donnée
\item plusieurs machines
\end { itemize}
\end { frame}
\begin { frame}
Un des avantage est qu'il utilise des fichiers de configuration au format YAML.\newline
\newline
Le format YAML est:
\begin { itemize}
\item humainement lisibles
\item plus facile à géré que certain autres formats %comme XML
\end { itemize}
\end { frame}
\subsection { Exemple simple de syntaxe}
\begin { frame} [fragile]
Défénition des cibles dans \texttt { /etc/ansible/hosts}
\begin { lstlisting}
192.0.2.50
linuxembedded.exemple.fr
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]
Pour lancer un programme à distance on peux soit spécifier
\begin { itemize}
\item tout les hôtes
\item un hôte particulier
\end { itemize}
\begin { lstlisting} [style=shell]
$ ansible all - a " / bin / ping 8 . 8 . 8 . 8 - c 1 "
$ ansible linuxembedded.exemple.fr - a " / bin / ping 8 . 8 . 8 . 8 - c 1 "
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]
Ansible fournit un ensemble de modules qui permettent de lancer des actions spécifiques à distance.
\begin { lstlisting} [style=shell]
$ ansible all - m ping
<address_ ip> | SUCCESS => {
"changed": false,
"ping": "pong"
}
\end { lstlisting}
\textcolor { gray} { \tiny { Attention au faux amis, ici ping se connecte à un hôte, teste l’ utilisabilité de python puis de renvoie le résultat pong en cas de succès} }
\end { frame}
\subsection { Le playbook}
\begin { frame}
\begin { center}
\textcolor { smileOrange} { \huge { Les actions multiples – le principe de playbook} }
\end { center}
\end { frame}
\begin { frame} [fragile]
Pour effectuer plusieurs actions en une seule commande on utilise un playbook
\begin { lstlisting} [style=shell]
$ ansible - playbook mon - fichier.yml
\end { lstlisting}
\end { frame}
\begin { frame}
\begin { center}
\textcolor { smileOrange} { \huge { La syntaxe YAML} }
\end { center}
\end { frame}
\begin { frame}
\begin { exampleblock} { YAML}
Le standard YAML a été créé en 2001 et est utilisé dans divers projets.
\end { exampleblock}
Un fichier YAML est formé de:
\begin { itemize}
\item variables
\item dictionnaires \textcolor { gray} { (clé/valeur)}
\item listes
\end { itemize}
\end { frame}
\begin { frame} [fragile]{ Les variables}
Déclaration
\begin { lstlisting} [style=shell]
vars:
base_ path: /mon/path
\end { lstlisting}
Accès à la varible
\begin { lstlisting} [style=shell]
{ { base_ path } }
\end { lstlisting}
Il est conseillé d'entourer la varible de guillemets
\begin { lstlisting} [style=shell]
app_ path: "{ { base_ path } } /app"
\end { lstlisting}
Passer les variables en ligne de commande avec l'option
\begin { lstlisting} [style=shell]
--extra-vars "base_ path=/mon/path/"
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]{ Les dictionnaires}
Les dictionnaires sont définis sous la forme \textit { \texttt { clé: valeur} } .
\begin { lstlisting} [style=bitbake]
# Information sur une personne
martin:
nom: Martin Devloper
travail: Developer
niveau: Experimente
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]{ Les listes}
Les listes sont définies avec \textit { \texttt { -\textcolor { gray} { ␣} } } , un tiret suivi d’ un espace.
\begin { lstlisting} [style=bitbake]
# Une liste de fruits
- Pomme
- Orange
- Framboise
- Mangue
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]{ Mélanger les syntaxes}
D’ autres choses plus complexes sont possibles en mélangeant les différentes syntaxes:
\begin { lstlisting} [style=bitbake]
# Liste de plusieurs employes
- martin:
nom: Martin D'vloper
travail: Developer
competences:
- python
- perl
- tabitha:
nom: Tabitha Bitumen
travail: Developer
competences:
- lisp
- fortran
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]{ Les modules}
Les modules lut par Ansible sont déclaré sous la forme \textit { \texttt { clé: valeur} } .\newline
Voici une liste non exhaustive de types de modules disponibles :
\begin { multicols} { 2}
\begin { itemize}
\item git
\item patch
\item get\_ url
\item shell
\item copy
\item service
\item apt
\item yum
\item lxc\_ container
\item make
\end { itemize}
\end { multicols}
\end { frame}
\begin { frame} [fragile]{ Exemple}
Le module \texttt { git} utilise de sous-options
\begin { lstlisting} [style=bitbake]
# Exemple d'un telechargement de source git
- git:
repo: 'https://git.yoctoproject.org/git/poky'
version: krogoth
dest: /home/user/poky
\end { lstlisting}
D'autres sous-options:
\begin { itemize}
\item \texttt { update: yes}
\item \texttt { archive: /path/to/archive.zip}
\item ...
\end { itemize}
\end { frame}
\begin { frame} [fragile]{ Module particulier: hosts}
Ce module est obligatoire.\newline
Il fait référence aux hôtes dans \texttt { /etc/ansible/hosts} .
\begin { lstlisting} [style=bitbake]
- hosts: all
remote_ user: root
\end { lstlisting}
\end { frame}
\subsection { Ansible avec Yocto}
\begin { frame}
\begin { center}
\textcolor { smileOrange} { \huge { Comment utilisé Ansible pour déployer un environnement de développement pour Yocto ?} }
\end { center}
\end { frame}
\begin { frame} [fragile]{ Définir l'hôte}
On utilise le \texttt { hosts} local
\begin { lstlisting} [style=bitbake]
- hosts: 127.0.0.1
connection: local
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]{ Répertoire de travail}
Pour centraliser les sources on utilise un variable \texttt { TOP\_ SRCDIR} .\newline
Elle sera passé en paramètre de la commande Ansible.
\begin { lstlisting} [style=shell]
--extra-vars "TOP_ SRCDIR=<path_ to_ top_ srcdir>"
\end { lstlisting}
Ce qui donnera:
\begin { lstlisting} [style=bitbake]
- name: "Get poky"
git:
repo: https://git.yoctoproject.org/git/poky
version: krogoth
dest: "{ { TOP_ SRCDIR} } "
\end { lstlisting}
\end { frame}
\subsection { Exemple complet}
\begin { frame} [fragile]
\begin { lstlisting} [style=bitbake,basicstyle=\tiny \ttfamily \color { white} ]
- name: "Mon Projet"
hosts: 127.0.0.1
connection: local
tasks:
- name: "Get poky"
git:
repo: https://git.yoctoproject.org/git/poky
version: krogoth
dest: "{ { TOP_ SRCDIR} } "
update: no
- name: "Patch poky krogoth"
patch:
src: ../0001-qemu-Add-space-to-fix-concatenated-SRC_ URI.patch
basedir: "{ { TOP_ SRCDIR} } "
strip: 1
- name: "Copy hooks into poky"
copy:
src: /path/to/hooks/commit-msg
dest: "{ { TOP_ SRCDIR} } /.git/hooks/commit-msg"
mode: 755
- name: "Get toolchain"
get_ url:
url: http://192.168.2.200/src/toolchain/toolchain-M2.1.tgz
checksum: md5:31a70bd7f7b74724af915a88fbe64f3d
dest: "{ { TOP_ SRCDIR} } "
- name: "Untar toolchain"
shell: tar xzf { { TOP_ SRCDIR} } /toolchain-M2.1.tgz -C { { TOP_ SRCDIR} } /sdk/prebuilts/gcc/
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]{ Lancer}
Pour lancer le projet:
\begin { lstlisting} [style=shell]
$ ansible - playbook mon - fichier.yml - - extra - vars "TOP _ SRCDIR = / home / user / mon - projet / "
\end { lstlisting}
\begin { lstlisting} [style=shell,basicstyle=\tiny \ttfamily \color { white} ]
$ tree poky
poky/
.
├── bitbake
├── build
├── documentation
├── LICENSE
├── meta
├── meta-poky
├── meta-selftest
├── meta-skeleton
├── meta-yocto
├── meta-yocto-bsp
├── oe-init-build-env
├── oe-init-build-env-memres
├── README
├── README.hardware
├── sdk
├── scripts
└── toolchain-M2.1.tgz
\end { lstlisting}
\end { frame}
% *******************************
% **** CONCLUSION ****
% *******************************
\section * { Questions}
\begin { frame} { Sources}
Ce document à été rédigé à partir des sources suivantes:\newline
\begin { itemize}
\item \url { www.yoctoproject.org}
\item \url { www.linuxembedded.fr}
\item \url { www.ansible.com}
\item \url { http://fabienlahouderepro.blogspot.fr/2017/03/building-weston-image-with-yocto-for.html}
\end { itemize}
\end { frame}
\begin { frame}
\centering
\textcolor { smileOrange} { \huge { Merci de votre attention !} }
\textcolor [RGB] { 99,153,253} { Quetions ?}
\includegraphics [width=0.5\textwidth] { logos/smile-logo.png}
Mickaël Tansorier
\url { mickael.tansorier@smile.fr}
\url { mickael@tansorier.fr}
\vfill
\textcolor { gray} { \tiny { GNU Free Documentation License, Version 1.3} }
\end { frame}
\end { document}