% 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} % \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 -c1" $ ansible linuxembedded.exemple.fr -a "/bin/ping 8.8.8.8 -c1" \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 | 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=" \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}