Compare commits

..

10 Commits

Binary file not shown.

@ -26,6 +26,12 @@
% Pour les hyperliens
\usepackage{hyperref}
% Pour rayer un texte avec \sout{}
\usepackage{ulem}
% Pour les icones awesome
\usepackage{fontawesome}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\title[U-Boot]{Café Vie Privée \\ \textbf{Alternative pour Android}}
\titlegraphic{\includegraphics[width=.5\textwidth]{logos/CVP-Nantes.png}}
@ -40,6 +46,10 @@
% (activer le debugage par usb pour accèder vie adb)
% adb shell screenrecord --output-format=h264 - | ffplay -
% Pour streamer l'écran
% =====================
% Utiliser l'application ScreenSream disponible sur F-droid
\begin{document}
% *******************************
@ -90,7 +100,24 @@ On peut le trouver sur
\item Voiture
\item
\end{itemize}
Il possède plus de 80\% de part de marché des smartphone (en 2015).
Il possède plus de 82\% de part de marché des smartphone (en 2019).
\end{frame}
\subsection{La surveillance de masse}
\begin{frame}
\begin{center}
\large{\color{cvp}{La surveillance de masse}}
\end{center}
\end{frame}
\begin{frame}{Les puissants - la centralisation}
Nos environnements informatiques utilisent des \textbf{logiciels propriétaires},\newline
et pour la plupart détenue par quelques uns qui ont un \textbf{poids important} dans notre société. \newline
\newline
D'où la création du terme \textbf{GAFAM}: Google Apple Facebook Amazon Microsoft\newline
\newline
\textcolor{gray}{\tiny{\sout{GAFAM} $\to$ les vampires de données}}
\end{frame}
\subsection{Économie de la surveillance}
@ -114,7 +141,7 @@ Est une plate-forme d'analyse des applications Android qui liste les traqueurs e
Créer en 2017.\newline
\newline
\newline
\textcolor{gray}{\tiny{(ClassyShark3xodus le fait pour les apk de F-droid)}}
\textcolor{gray}{\tiny{(ClassyShark3xodus le fait pour d'autres apk du système)}}
\end{frame}
\subsection{Programme de surveillance}
@ -130,7 +157,7 @@ Il existe de nombreux programmes de surveillance plus ou moins connus.
\begin{block}{Jérémy Zimmermamn}
Ne pas confondre entre: j'ai rien à me reprocher et j'ai rien à cacher.
\end{block}
Cf. Lo documentaire Notiong To Hide
Cf. Le documentaire Notiong To Hide \textcolor{gray}{\tiny{(\url{https://vimeo.com/193515863})}}
\end{frame}
\begin{frame}{}
@ -165,29 +192,6 @@ Il existe des projet pour se défendre contre ça:
On y reviendra :)
\end{frame}
\subsection{La surveillance de masse}
\begin{frame}
\begin{center}
\large{\color{cvp}{La surveillance de masse}}
\end{center}
\end{frame}
\begin{frame}{Les puissants - la centralisation}
Nos environnements informatiques utilisent des \textbf{logiciels propriétaires},\newline
et pour la plupart détenue par quelques uns qui ont un \textbf{poids important} dans notre société. \newline
\newline
D'où la création du terme \textbf{GAFAM}: Google Apple Facebook Amazon Microsoft
\end{frame}
\begin{frame}{Les besoins}
Accéder au code source permet d'\textbf{auditer} le code et vérifier que le logiciel correspond à ce pourquoi il est fait. \newline
\newline
Le logiciel libre permet de \textbf{modifier} le code pour nos besoins personnels.\newline
\newline
Ainsi que la \textbf{décentralisation}.
\end{frame}
% *******************************
% **** COMMENT SE PROTEGER ****
@ -201,11 +205,17 @@ Ainsi que la \textbf{décentralisation}.
\end{center}
\end{frame}
\subsection{Avec du logiciel Libre}
\begin{frame}
En utilisant du logiciel Libre.\newline
On se permet d'auditer le code source,\newline
de l'adapter pour soi même.\newline
Donc il ne \textbf{dépend pas} d'un \textbf{modèle économique} particulier.
Accéder au code source permet d'\textbf{auditer} le code et vérifier que le logiciel correspond à ce pourquoi il est fait.\footnote{Confiance par la transparence $ \neq $ Sécurité pas l'obscurité.} \newline
\newline
Le logiciel libre permet de \textbf{modifier} le code pour nos besoins personnels.\newline
\newline
Ainsi que d'installer librement le logiciel.\newline
\textcolor{gray}{\tiny{On peut appeler ça la \textbf{décentralisation} pour des serveurs, c'est ce qui permet l'autonomie.}}\newline
\newline
De faite, le logiciel libre ne \textbf{dépend pas} d'un \textbf{modèle économique} particulier.
\end{frame}
\subsection{Avec quels logiciels ?}
@ -253,12 +263,12 @@ Google $\to$ Duckduckgo\newline
\newline
Tor Browser \textcolor{gray}{\tiny{(anciennement Orfox)}}\newline
\newline
Orobot \textcolor{gray}{\tiny{(Proxy pour le réseau Tor)}}
Orbot \textcolor{gray}{\tiny{(Proxy pour le réseau Tor)}}
\end{frame}
\subsection{Réseaux sociaux}
\begin{frame}
Facebook $\to$ slim social \textcolor{gray}{\tiny{(ou Frost for fackbook)}}\newline
Facebook $\to$ slim social \textcolor{gray}{\tiny{(ou Frost for facebook)}}\newline
\newline
Diaspora\newline
Mastodon
@ -295,7 +305,7 @@ Google $\to$ Duckduckgo
\item[Caméra] Open Caméra
\item[Transport] Transportr
\item[Bloqueur] Blokada
\item[Liseure] Book Reader
\item[Liseuse] Book Reader
\item[Luminosité] Red Moon
\item[Battery] Drowser
\end{description}
@ -316,36 +326,78 @@ Google $\to$ Duckduckgo
\subsection{État de l'art}
\begin{frame}
Il n'existe pas beaucoup d'alternatives complètes, car la difficulté est le support matériel du téléphone.
Il n'existe pas beaucoup d'alternatives complètes, car la difficulté est le support matériel du téléphone. (Il n'existe pas de matériel Libre.)\newline
\newline
Exemple:
\begin{itemize}
\item Replicant
\item PureOS
\item LineageOS
\item \href{https://www.replicant.us}{Replicant}
\item \href{https://www.pureos.net}{PureOS}
\item \href{https://e.foundation}{/e/}
\item \href{https://www.plasma-mobile.org}{PlasmaMobile}
\item \href{https://lineageos.org}{LineageOS}
\end{itemize}
\end{frame}
\subsection{Replicant}
\begin{frame}
\href{https://fr.wikipedia.org/wiki/Replicant_\%28syst\%C3\%A8me_d\%27exploitation\%29}{Replicant} est un système d'exploitation entièrement libre pour les smartphones et les tablettes, en remplaçant les composants privateurs d'Android par leurs équivalents libres.
\href{https://fr.wikipedia.org/wiki/Replicant_\%28syst\%C3\%A8me_d\%27exploitation\%29}{\textbf{Replicant}} est un système d'exploitation \textbf{entièrement libre} pour les smartphones et les tablettes, en remplaçant les composants privateurs d'Android par leurs équivalents libres.
\end{frame}
\subsection{PureOS}
\begin{frame}
Fait pour \href{https://puri.sm/products/librem-5/}{Librem5}.\newline
\href{https://puri.sm/products/librem-5/pureos-mobile/}{\textbf{PureOS}} est un OS (non-Android) pour le téléphone \href{https://puri.sm/products/librem-5/}{Librem5} fabriqué par Purism.\newline
\newline
L'OS est un système GNU/Linux.\newline
Peut se lier avec KDE et Gnome.
\end{frame}
\subsection{/e/}
\begin{frame}
\textbf{/e/} une entreprise faisant un OS pour smatphone (éponyme) basé sur Android, sans la sur-couche google.\newline
\newline
Leur \href{https://e.foundation/wp-content/uploads/ManifesteFR.pdf}{Manifeste} décrit leur démarche.
\end{frame}
\url{https://puri.sm/products/librem-5/pureos-mobile/}
\subsection{Plasma-mobile}
\begin{frame}
\textbf{Plasma Mobile} est un OS basé sur GNU/Linux, fait pour fonctionner avec gestionnaire de fenêtre Linux KDE.
\end{frame}
\subsection{LineageOS}
\begin{frame}
- Théorie avec microG
\textbf{LineageOS} est un OS pour les téléphones et tablettes basé sur Android Open Source Project (AOSP).\newline
\newline
C'est un fork de Cyanogenmod créer en décembre 2016.
\end{frame}
\begin{frame}{Un système «classique»}
% Documentation:
% https://linuxfr.org/news/installer-lineageos-sur-son-appareil-android
% https://www.montelephonelibre.fr
\begin{center}
\includegraphics[width=.75\textwidth]{schemas/Android_private.png}
\end{center}
\textcolor{gray}{\tiny{Image tiré de \url{https://www.montelephonelibre.fr}}}
\end{frame}
\begin{frame}{Un système plus libre}
\begin{center}
\includegraphics[width=.75\textwidth]{schemas/Android_free.png}
\end{center}
\textcolor{gray}{\tiny{Image tiré de \url{https://www.montelephonelibre.fr}}}
\end{frame}
\subsection{MicroG}
\begin{frame}
- Avantage du contrôle accès applications
- Démo
LineageOS permet d'utiliser son système avec \textbf{MircoG}.\newline
\end{frame}
\subsection{Mise en pratique}
\begin{frame}
\begin{center}
\includegraphics[width=.50\textwidth]{images/retro-phone.jpg}
\end{center}
\end{frame}
\end{document}

Binary file not shown.

@ -0,0 +1,531 @@
% 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]{beamer}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Thèmes suppélmentaires
\useoutertheme[]{miniframes} % barre menu du haut
\setbeamertemplate{frametitle}[default] % replace le titre à la bonne place
\useinnertheme[shadow=true]{rounded} % arrondi les angles
\usecolortheme{orchid}
\usecolortheme{whale}
%\usepackage{xcolor}
%\definecolor{smileOrange}{RGB}{254,128,86}
\setbeamertemplate{footline}[text line]{
\textcolor{gray}{%
\parbox{\linewidth}{\vspace*{-8pt}Smile\hfill\insertshortauthor\hfill\insertpagenumber/\inserttotalframenumber}}
}
\beamertemplatenavigationsymbolsempty
% Language
\usepackage[french]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
%\usepackage[latin1]{inputenc}
% 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}
}
% 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}
}
\lstdefinelanguage{diff}{
morecomment=[f][\color{blue}]{@@}, % group identifier
morecomment=[f][\color{red}]-, % deleted lines
morecomment=[f][\color{green}]+, % added lines
morecomment=[f][\color{magenta}]{---}, % Diff header lines (must appear after +,-)
morecomment=[f][\color{magenta}]{+++},
}
% Pour utiliser des colonnes
\usepackage{multicol}
% Pour integrer un pdf
\usepackage[final]{pdfpages}
% Pour les hyperliens
\usepackage{hyperref}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\title[U-Boot]{Memoires \\ \textbf{Partitionnement et manipulation de mémoires}}
\author[Mickaël Tansorier]{Mickaël Tansorier}
\date[Août 2018]{Présentation du fonctionnement Globale de mémoire.}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
%\tableofcontents[subsectionstyle=hide]
% *******************************
% **** PAGE DE GARDE ****
% *******************************
\begin{frame}
\titlepage
\end{frame}
% *******************************
% **** INTRODUCTION ****
% *******************************
\begin{frame}{Plan}
\tableofcontents[hideallsubsections]
\end{frame}
\section{Introduction}
\begin{frame}{}
Si l'on veux scripter les créations/modifications de partitions, il faut connaître:
\begin{itemize}
\item Comment fonctionne les tables de partition
\item Le type de partitionnement
\item le Format de partitionnement
\item Les outils de partitionnement
\end{itemize}
\end{frame}
% *******************************
% **** PRÉSENTATION ****
% *******************************
\section{Le types, les tables et le format de partitions}
\subsection{Type de partitionnent}
\begin{frame}[fragile]
Il existe trois types de partitions:
\begin{itemize}
\item \texttt{primary} — est utiliser comme partition de boot (pour windows)
\item \texttt{extended} — sert à abriter de multible partitions logique
\item \texttt{logical} — sert à abriter les fichier non relatif au système (audio, vidéo, ...)
\end{itemize}
\begin{lstlisting}[basicstyle=\tiny\ttfamily\color{white}]
+----------+----------+------------------------------------------------------+
| | | +---------+ +--------------------------+ |
| | | | | | | | |
| P1 | P2 | | L1 | | L2 | L3 | E1 |
| | | | | | | | |
| | | +---------+ +--------------------------+ |
+----------+----------+------------------------------------------------------+
\end{lstlisting}
\end{frame}
\subsection{Table de partition}
\begin{frame}[fragile]
Le type de table de partition défini l'entête du block device.\newline
On le retrouve sous lappellation label sous parted.\newline
Il en existe de plusieurs types: \texttt{aix}, \texttt{amiga}, \texttt{bsd}, \texttt{dvh}, \texttt{gpt}, \texttt{loop}, \texttt{mac}, \texttt{msdos}, \texttt{pc98}, ou \texttt{sun}.\newline
\newline
En règle général on se trouve en MBR (Master boot record) (ou \texttt{msdos}) car c'est le plus courant pour des système simpliste.\newline
Donc dans le doute c'est celui-là qu'il faut choisir... :) \newline
En effet \texttt{GPT} est son "successeur" et s'adresse à l'utilisation de boot en UEFI.
\end{frame}
\begin{frame}[fragile]{Exemple de différences}
Taille de partitions:
\begin{itemize}
\item Avec \texttt{msdos} il est impossible de créer une partition supérieur à 2.2 To ($2^{41}$ octets) sur des secteur de bloc de 512 byte.
\item Avec \texttt{GPT} (GUID Partition Table) il est possible de créer une partition allant jusqu'à 9,4 Zo (9,4 x 1021 octets)
\end{itemize}
Nombre de block:
\begin{itemize}
\item Avec \texttt{GTP} il est possible de créer jusqu'à 128 block logique
\item Avec \texttt{msdos} on peut aller seulement jusqu'à 4 block
\end{itemize}
Du fait de ses limitations le système de partitions \texttt{MBR} est remplacé la plupart du temps depuis 2013 par le système \texttt{GPT}.
\end{frame}
\subsection{Format de système de fichier}
\begin{frame}[fragile]
Le type de partition est défini par un numéro d'id.\newline
Ce numéro se trouve en entête de partition.
\begin{lstlisting}[basicstyle=\tiny\ttfamily\color{white}]
0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx
5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data
6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility
8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt
9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access
a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Rufus alignment
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs
f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT
10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/
11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b
12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor
16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto
1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep
1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT {frame}
\end{lstlisting}
\textcolor{gray}{\tiny{Logical Block Addressing: Cet adressage permet de désigner dune façon unique un secteur dun disque.}}
\end{frame}
% *******************************
% **** PRÉSENTATION ****
% *******************************
\section{Les outils}
\begin{frame}[fragile]{Les outils}
Les outils classique sous Linux:
\begin{itemize}
\item \texttt{parted}
\item \texttt{fdisk}
\item \texttt{sfdisk}
\end{itemize}
\end{frame}
\subsection{Parted}
\begin{frame}[fragile]
\begin{block}{Objectif}
Est de rendre scriptable un repartionnement.
\end{block}
Donc si vous pensez au confort de \texttt{gparted} vous pouvez oublier...
\end{frame}
\begin{frame}[fragile]{mkpart}
Exemple de commande:
\begin{lstlisting}[style=shell]
$ parted -a optimal /dev/usb mkpart primary 0% 4096MB
\end{lstlisting}
\begin{onlyenv}<2>
L'option -a (ou --align) peut prendre plusieurs valeurs:
\begin{itemize}
\item \texttt{none} — Utilise l'alignement le plus petit autorisé par le disque
\item \texttt{cylinder} — Aligne les partitions sur les cylindres
\item \texttt{minimal} — Utilise le le plus petit alignement défini par la topologie du disque.
\item \texttt{optimal} — Utilise l'alignement le plus optimisé donnée par la topologie du disque.
\end{itemize}
\end{onlyenv}
\begin{onlyenv}<3>
L'option \texttt{mkpart} prend en paramètre le type de partition (\texttt{primary}, \texttt{extended}, \texttt{logical}).\newline
Puis en option le type de file système:\newline
\texttt{mkpart part-type [fs-type] start end}\newline
Et enfin l'adresse de départ et celle d'arrivé.\newline
\newline
Par defaut les valeurs sont en megabit, sinon on peut préciser en pourcent, en secteur \texttt{2024s} ou \texttt{-1s} pour aller jusqu'au dernier secteur
\end{onlyenv}
\end{frame}
\begin{frame}[fragile]{label-type}
\begin{lstlisting}[style=shell]
mklabel label-type
\end{lstlisting}
L'option prend en paramètre une des valeurs:\newline
\texttt{aix}, \texttt{amiga}, \texttt{bsd}, \texttt{dvh}, \texttt{gpt}, \texttt{loop}, \texttt{mac}, \texttt{msdos}, \texttt{pc98}, ou \texttt{sun}.
\end{frame}
\begin{frame}[fragile]
L'option print nous renseigne sur des informations intéressante sur le type de mémoire.
\begin{lstlisting}[style=shell,basicstyle=\tiny\ttfamily\color{white}]
$ parted /dev/mmcblk0
GNU Parted 3.2
Using /dev/mmcblk0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: MMC W32508 (sd/mmc)
Disk /dev/mmcblk0: 7650MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 17.8MB 16.8MB primary fat32 lba
2 17.8MB 34.6MB 16.8MB primary fat32 lba
3 34.6MB 7650MB 7616MB extended
5 35.7MB 560MB 524MB logical ext4
6 561MB 1085MB 524MB logical ext4
7 1086MB 3183MB 2097MB logical ext4
8 3185MB 3709MB 524MB logical ext4
9 3710MB 4234MB 524MB logical ext4
10 4235MB 7650MB 3415MB logical ext4
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]{Alignement}
La difficulté est de bien aligner les secteurs si l'on utilise l'option optimal.\newline
On risque de tomber sur ce genre d'avertissement:
\begin{lstlisting}[style=shell]
(parted) mkpart primary 0 100%
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel?
\end{lstlisting}
Si on ignore il va replacer le premier secteur (à \texttt{512B}).
\end{frame}
\begin{frame}[fragile]
Pour anticiper ce genre de problème et pour être sûre d'être sur des secteurs optimiser on peut trouver de l'information dans \texttt{/sys/}.
\begin{lstlisting}[style=shell]
$ cat /sys/block/sdb/queue/optimal_io_size
1048576
$ cat /sys/block/sdb/queue/minimum_io_size
262144
$ cat /sys/block/sdb/alignment_offset
0
$ cat /sys/block/sdb/queue/physical_block_size
512
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
Pour connaitre le premier block, il faut prendre:\newline
$(optimal\_io\_size + alignment\_offset)/physical\_block\_size$ \newline
\newline
Sauf qu'il nous manques des infos.\newline
Dans l'exemple on avait:\newline
$(1048576 + 0) / 512 = 2048$.\newline
\begin{lstlisting}[style=shell]
(parted) mkpart primary 2048s 100%
\end{lstlisting}
C'est possible de tester l'alignement de la partition avec
\begin{lstlisting}[style=shell]
(parted) align-check optimal 1"
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\begin{block}{Attention}
Avec \texttt{parted}, les effets sont immédiat contrairement à \texttt{fdisk} où il faut sauvegarder les changement avant application
\end{block}
\end{frame}
\subsection{sfdisk}
\begin{frame}[fragile]{sfdisk}
\texttt{sfdisk} vs \texttt{fdisk} [man]
\begin{itemize}
\item fdisk - Manipuler la table de partitions d'un disque
\item sfdisk - Afficher ou manipuler une table de partitions de disque
\end{itemize}
On peut lire: "sfdisk est un outil orienté script pour le partitionnement de nimporte quel périphérique bloc."\newline
\newline
\texttt{sfdisk} prend en entrée de ligne au format:
\begin{lstlisting}[style=shell]
<start> <size> <id> <bootable> <c,h,s> <c,h,s>
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
Exemple:
\begin{lstlisting}[style=shell]
{
echo ,9,0x0C,*
echo ,,,-
} | sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE
\end{lstlisting}
Ou
\begin{lstlisting}[style=shell]
sfdisk /dev/hdc << EOF
0,407
,407
;
;
EOF
\end{lstlisting}
\end{frame}
\subsection{fdisk}
%http://www.octetmalin.net/linux/tutoriels/fdisk-gestion-creer-supprimer-modifier-changer-partition-lister-afficher-disque-dur-ligne-commande.php
\begin{frame}[fragile]{fdisk}
\texttt{fdisk} est normalement utilisable sous forme de menu.\newline
On peut scripter les commandes envoyés au menu:
\begin{lstlisting}[style=shell]
(
echo "n" # creer une nouvelle partition
echo "p" # de type primary
echo "1" # de numero 1
echo "" # a partir du premier secteur de libre
echo "+16M" # de taille 16Mo
echo "w" # sauvegarder et quitter
) | fdisk ${DEVICE}
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
On peut formater la partition (fat/ext) :
\begin{lstlisting}[style=shell]
(
echo "t" # change le format
echo "1" # partition number
echo "c" # id
echo "w" #
) | fdisk ${DEVICE}
\end{lstlisting}
c = fat (LBA)\newline
83 = linux
\begin{lstlisting}[style=shell]
$ mkfs.vfat ${DEVICE}p1
\end{lstlisting}
\end{frame}
% *******************************
% **** PRÉSENTATION ****
% *******************************
\section{U-Boot env}
\begin{frame}[fragile]
\huge{Var d'environnement d'U-Boot}
\end{frame}
\begin{frame}[fragile]{Erreur de partition d'environnement}
\begin{lstlisting}[style=shell]
Warning - bad CRC, using default environment
\end{lstlisting}
Answer:
Most probably everything is OK. The message is printed because the flash sector or ERPROM containing the environment variables has never been initialized yet. The message will go away as soon as you save the envrionment variables using the saveenv command.
\url{https://www.denx.de/wiki/DULG/WarningBadCRCUsingDefaultEnvironment}
\end{frame}
\begin{frame}[fragile]
Une des possibilités est que côté espace utilisateur vos paramétrages ne soient pas correcte pour les outils u-boot.\newline
Exemple d'adressage dans le fichier \texttt{/etc/fw\_env.config}:
\begin{lstlisting}[style=shell,basicstyle=\tiny\ttfamily\color{white}]
# Up to two entries are valid, in this case the redundant
# environment sector is assumed present.
# MTD device name Device offset Env. size Flash sector size
/dev/mmcblk0 0x70000 0x2000 0x2000
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
On obtiendrait un partitionnement comme ceci:
\begin{lstlisting}[style=shell]
+---------------+ 0x0000
| |
+---------------+ 0x2000 8kb
| |
| mmcblk0p1 |
| |
+---------+ | 0x70000 450kb
| ENV | |
+---------+ |
| |
| |
+---------------+
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
Avec un correctif adapté on pourrait comme par exemple:
\texttt{/etc/fw\_env.config}
\begin{lstlisting}[language=diff,basicstyle=\tiny\ttfamily\color{white}]
----------- /etc/fw_env.config -----------
index 650a4c3b7..f833324b4 100644
@@ -2,4 +2,4 @@
# Up to two entries are valid, in this case the redundant
# environment sector is assumed present.
# MTD device name Device offset Env. size Flash sector size
-/dev/mmcblk0 0x70000 0x2000 0x2000
+/dev/mmcblk0 0x2000 0x4000 0x200
\end{lstlisting}
$0x2000 = 8kb$\newline
$0x4000 = 16kb$\newline
$0x200 = 512 bytes$
\end{frame}
\begin{frame}[fragile]
On obtiendrait donc dans \texttt{/dev/mmcblk0}:
\begin{lstlisting}[style=shell]
+---------------+ 0x0000
| |
+---------------+ 0x2000 8kb
| ENV |
| 16kb |
+---------------+ 0x6000 24kb
| |
+---------------+ 0x8000 32kb
| |
| mmcblk0p1 |
| |
| |
| |
| |
+---------------+
\end{lstlisting}
\end{frame}
% *******************************
% **** PRÉSENTATION ****
% *******************************
\section*{Conclusion}
\begin{frame}
\begin{center}
\begin{huge}
Question ?
\end{huge}
\end{center}
\begin{center}
\textcolor{gray}{\tiny{Enfin je vais essayer de répondre...}}
\end{center}
\end{frame}
\end{document}

Binary file not shown.

@ -0,0 +1,415 @@
% 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,aspectratio=169]{beamer}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Thèmes suppélmentaires
\useoutertheme[]{miniframes} % barre menu du haut
\setbeamertemplate{frametitle}[default] % replace le titre à la bonne place
\useinnertheme[shadow=true]{rounded} % arrondi les angles
\usecolortheme{orchid}
\usecolortheme{whale}
%\usepackage{xcolor}
%\definecolor{smileOrange}{RGB}{254,128,86}
\setbeamertemplate{footline}[text line]{
\textcolor{gray}{%
\parbox{\linewidth}{\vspace*{-8pt}Smile\hfill\insertshortauthor\hfill\insertpagenumber/\inserttotalframenumber}}
}
\beamertemplatenavigationsymbolsempty
% Language
\usepackage[french]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
%\usepackage[latin1]{inputenc}
% 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}
}
% 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}
}
\lstdefinelanguage{diff}{
morecomment=[f][\color{blue}]{@@}, % group identifier
morecomment=[f][\color{red}]-, % deleted lines
morecomment=[f][\color{green}]+, % added lines
morecomment=[f][\color{magenta}]{---}, % Diff header lines (must appear after +,-)
morecomment=[f][\color{magenta}]{+++},
}
% Pour utiliser des colonnes
\usepackage{multicol}
% Pour integrer un pdf
\usepackage[final]{pdfpages}
% Pour les hyperliens
\usepackage{hyperref}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\title[U-Boot]{UDEV \\ \textbf{Gérerer les device node}}
\author[Mickaël Tansorier]{Mickaël Tansorier}
\date[Août 2018]{Présentation du fonctionnement d'UDEV.}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
%\tableofcontents[subsectionstyle=hide]
% *******************************
% **** PAGE DE GARDE ****
% *******************************
\begin{frame}
\titlepage
\end{frame}
% *******************************
% **** INTRODUCTION ****
% *******************************
\begin{frame}{Plan}
\tableofcontents[hideallsubsections]
\end{frame}
\section{Introduction}
\subsection{device-node}
\begin{frame}
\texttt{UDEV} est un démon chargé de gérer les device-nodes.
\begin{block}{Principe d'unix}
Tout est fichier
\end{block}
Donc les périphériques matériels sont des pseudo-fichier.\newline
Ils peuvent être manipulés par: cat, grep, open(), read(), write() etc…\newline
\newline
Ils sont stockés dans: \texttt{/dev} \newline
On les appelle device-nodes.
\end{frame}
\begin{frame}
\begin{list}{-}{Les device nodes sont:}
\item des points d'entrée vers le noyau
\item de type bloc ou char
\item identifiés par un majeur et un mineur
\end{list}
$ $\newline
Le majeur permet au noyau de savoir quel driver doit gérer le périphérique.\newline
Le mineur permet au driver de savoir quel périphérique parmi ceux quil gère est utilisé.
\end{frame}
\subsection{Historique}
\begin{frame}{}
\begin{itemize}
\item Le script \texttt{MAKEDEV}
\begin{itemize}
\item[-] Les majeur et mineur était codés en dur dans un script appelé par la commande mknode.
\item[-] Pour créer les périphériques dans \texttt{/dev}.
\item[-] Tout ceux possible existaient sur le système (\texttt{\~} 18 000)
\item[-] Ne gère pas le hotplug
\end{itemize}
\item Le \texttt{devfs}
\begin{itemize}
\item[-] Les noeuds ne sont plus crées par le système mais par les drivers eux-mêmes à la détection d'un périphérique.
\item[-] Mais les majeurs mineurs étaient toujours codé en dur
\item[-] devfs est difficile à paramétrer
\end{itemize}
\item Le \texttt{udev}
\begin{itemize}
\item[-] udev est un programme purement user-space
\item[-] udev évolue en s'appuyant sur les évolutions du noyau
\item[-] Il sappuie sur les informations laissées dans \texttt{/sys} (majeur et mineur)
\item[-] Le noyau fournit un lien netlink qui permet à udev d'être prévenu lors d'un changement.
\end{itemize}
\end{itemize}
\end{frame}
% *******************************
% **** PRÉSENTATION ****
% *******************************
\section{Les événements noyau}
\subsection{monitor}
\begin{frame}[fragile]
\texttt{udev} réagit donc à des événements envoyés par le noyau via \texttt{inotify}.
\begin{lstlisting}[style=shell]
udevadm monitor -k
\end{lstlisting}
Lorsque l'on branche un USB:
\begin{lstlisting}[style=shell,basicstyle=\tiny\ttfamily\color{white}]
KERNEL[805.692293] add /devices/soc0/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1 (usb)
KERNEL[805.694999] add /devices/soc0/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1:1.0 (usb)
KERNEL[806.006810] add /devices/soc0/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1:1.0/net/eth1 (net)
KERNEL[806.006948] add /devices/soc0/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1:1.0/net/eth1/queues/rx-0 (queues)
KERNEL[806.007010] add /devices/soc0/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1:1.0/net/eth1/queues/tx-0 (queues)
\end{lstlisting}
Et si l'on retire:
\begin{lstlisting}[style=shell,basicstyle=\tiny\ttfamily\color{white}]
KERNEL[800.026043] remove /devices/soc0/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1:1.0/net/eth1/queues/rx-0 (queues)
KERNEL[800.026228] remove /devices/soc0/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1:1.0/net/eth1/queues/tx-0 (queues)
KERNEL[800.026366] remove /devices/soc0/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1:1.0/net/eth1 (net)
KERNEL[800.050534] remove /devices/soc0/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1:1.0 (usb)
KERNEL[800.080535] remove /devices/soc0/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1 (usb)
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
On peut demander à \texttt{udev} de nous fournir les propriétés du périphérique:
\begin{lstlisting}[basicstyle=\tiny\ttfamily\color{white}]
udevadm monitor -k -p
\end{lstlisting}
Pour une seule sortie:
\begin{lstlisting}[style=shell,basicstyle=\tiny\ttfamily\color{white}]
KERNEL[5763.052898] add /devices/soc0/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1 (usb)
ACTION=add
BUSNUM=001
DEVNAME=/dev/bus/usb/001/003
DEVNUM=003
DEVPATH=/devices/soc0/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1
DEVTYPE=usb_device
MAJOR=189
MINOR=2
PRODUCT=bda/8153/3000
SEQNUM=1544
SUBSYSTEM=usb
TYPE=0/0/0
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
Les propriétés dépendent du type exact de périphérique mais certaines propriétés sont toujours présentes:
\begin{itemize}
\item \texttt{ACTION} : Le type dévénement à traiter,
\item \texttt{MAJOR}, \texttt{MINOR} : Les numéro majeur et mineur du périphérique concerné,
\item \texttt{SEQNUM} : un numéro croissant pour ordonner les événements,
\item \texttt{SUBSYSTEM} : Le sous-système noyau ayant causé lévénement,
\item \texttt{DEVPATH} : Le fichier dans \texttt{/sys} correspondant au périphérique.
\end{itemize}
\end{frame}
% *******************************
% **** PRÉSENTATION ****
% *******************************
\section{Les règles udev}
\begin{frame}[fragile]{Lécriture de règles}
Les règles udev peuvent venir de plusieurs endroits différents:
\begin{lstlisting}[style=shell,basicstyle=\tiny\ttfamily\color{white}]
/etc/udev/rules.d/ # regles locales ajoutees par l'administrateur
/run/udev/rules.d/ # regles volatiles, generalement creees par d'autres regles
/usr/lib/udev/rules.d/ # regles fourni par la distribution
/lib/udev/rules.d/ # regles fourni par la distribution
\end{lstlisting}
Les fichiers sont préfixé par un numéro (comme init), et postfixé par \texttt{.rules}.\newline
Exemple: \texttt{/usr/lib/udev/rules.d/82-net-usb-up.rules}
\begin{lstlisting}[style=shell]
ACTION=="add", RUN+="/bin/sh -c '/bin/echo %k : %p >> /root/events'"
\end{lstlisting}
\end{frame}
\subsection{Les règles de filtrage}
\begin{frame}[fragile]
Pour filtrer les évènements on utilise la syntaxe: \texttt{PROPRIETE==valeur} \newline
"\texttt{==}", "\texttt{!=}", "\texttt{=}", "\texttt{+=}", "\texttt{-=}", "\texttt{:=}"
\newline
\newline
Le champs \texttt{PROPRIETE} peut prendre les valeurs suivantes:
\begin{itemize}
\item \texttt{ATTR\{fichier\}} — permet de filtrer sur le contenu dun fichier dans le répertoire sysfs correspondant à lévénement en cours.
\item \texttt{ATTRS\{fichier\}} — idem + également sur ceux des périphériques parents (bus, plateforme etc…).
\item \texttt{ENV\{clé\}} — permet de filtrer sur une propriété ajoutée par une autre règle udev.
\item \texttt{PROGRAM} — permet de filtrer sur la valeur de retour dun programme.
\end{itemize}
\end{frame}
\subsection{Les actions possibles}
\begin{frame}[fragile]
Lorsque l'on a le filtrage que l'on souhaite, on peut effectuer des actions avec les options suivantes:
\begin{itemize}
\item \texttt{SYMLINK} — crée un lien symbolique vers le fichier \texttt{/dev} du pérphérique. Le noyau fournit un premier fichier \texttt{/dev} dont le nom ne peut pas être changé.
\item \texttt{OWNER}, \texttt{GROUP}, \texttt{MODE}, \texttt{SECLABEL\{module\}} — permet de préciser les droits daccès et les propriétés SELinux du périphérique.
\item \texttt{ATTR\{fichier\}} — permet décrire une valeur dans un fichier du répertoire sysfs correspondant au périphérique.
\item \texttt{ENV\{clé\}} — permet de positionner un attribut interne à udev pour le périphérique en cours,
\item \texttt{RUN} — permet dexécuter un programme
\end{itemize}
\end{frame}
\begin{frame}[fragile]
Certain mots clés peuvent être utilisés pour ces actions, comme:
\begin{itemize}
\item \texttt{\$kernel}, \texttt{\%k} — The kernel name for this device.
\item \texttt{\$devpath}, \texttt{\%p} — The devpath of the device.
\end{itemize}
Exemple:
\begin{lstlisting}[style=shell,basicstyle=\tiny\ttfamily\color{white}]
ACTION=="add", SUBSYSTEM=="net", RUN+="/bin/sh -c '/bin/echo %k : %p >> /root/events'"
\end{lstlisting}
Donne
\begin{lstlisting}[style=shell,basicstyle=\tiny\ttfamily\color{white}]
$ cat /tmp/event
usb0 : /devices/soc0/soc/2100000.aips-bus/2184000.usb/ci_hdrc.0/gadget/net/usb0
eth0 : /devices/soc0/soc/2100000.aips-bus/2188000.ethernet/net/eth0
eth1 : /devices/soc0/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1:1.0/net/eth1
sit0 : /devices/virtual/net/sit0
lo : /devices/virtual/net/lo
\end{lstlisting}
\end{frame}
% *******************************
% **** PRÉSENTATION ****
% *******************************
\section{Analyse d'évènements}
\subsection{Trouver les propriétés d'un périphérique}
\begin{frame}[fragile]
retrouver le répertoire sysfs d'un device:
\begin{lstlisting}[style=shell,basicstyle=\tiny\ttfamily\color{white}]
$ udevadm info -x -q path -n /dev/hidraw0
/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.3/1-1.3:1.0/0003:046D:C01A.0015/hidraw/hidraw0
\end{lstlisting}
Obtenir des info sur le device:
\begin{lstlisting}[style=shell,basicstyle=\tiny\ttfamily\color{white}]
$ udevadm info /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.3/1-1.3:1.0/0003:046D:C01A.0015/hidraw/hidraw0
P: //devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.3/1-1.3:1.0/0003:046D:C01A.0015/hidraw/hidraw0
N: hidraw0
E: DEVNAME=/dev/hidraw0
E: DEVPATH=//devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.3/1-1.3:1.0/0003:046D:C01A.0015/hidraw/hidraw0
E: MAJOR=247
E: MINOR=0
E: SUBSYSTEM=hidraw
\end{lstlisting}
\begin{itemize}
\item E: une propriété purement udev. elles sont accessibles grâce à \texttt{ENV\{\}}
\item N: le nom du périphérique suggéré par le noyau
\item S: les liens symboliques créés vers le périphérique
\item P: le chemin vers lentrée dans \texttt{sysfs}
\end{itemize}
\end{frame}
\subsection{Surveiller les évènements}
\begin{frame}[fragile]
Monitorer les actions en direct:
\begin{lstlisting}[style=shell]
$ udevadm monitor -p
\end{lstlisting}
L'option \texttt{-p} permet d'avoir les propriétés des évènements.
\end{frame}
\subsection{Tester des évènements}
\begin{frame}[fragile]
Tester un évènement:
\begin{lstlisting}[style=shell]
$ udevadm test -a add /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.3/1-1.3:1.0/0003:046D:C01A.0018/hidraw/hidraw0
\end{lstlisting}
\end{frame}
% *******************************
% **** PRÉSENTATION ****
% *******************************
\section{Divers}
\subsection{La règle réseau}
\begin{frame}[fragile]
\begin{lstlisting}[style=shell]
$ cat board/eolane/modx6/rootfs_pendant/usr/lib/udev/rules.d/82-net-usb-up.rules
# do not edit this file, it will be overwritten on update
ACTION!="add", GOTO="net_usb_up_end"
SUBSYSTEM!="net", GOTO="net_usb_up_end"
ENV{ID_BUS}=="usb", RUN+="/bin/sh -c 'ifup %k'"
LABEL="net_usb_up_end"
\end{lstlisting}
\end{frame}
\subsection{mdev}
\begin{frame}[fragile]
\texttt{mdev} est un utilitaire similaire à \texttt{udev} présent dans \texttt{busybox}. Très utilisé dans l'embarqué.\newline
\newline
Mais \texttt{udev} est déjà très léger (le binaire fait 520K).
\end{frame}
% *******************************
% **** PRÉSENTATION ****
% *******************************
\section*{Conclusion}
\begin{frame}
\begin{center}
\begin{huge}
Question ?
\end{huge}
\end{center}
\begin{center}
\textcolor{gray}{\tiny{Enfin je vais essayer de répondre...}}
\end{center}
$ $\newline
\newline
Document basé sur:\newline
\url{http://www.linuxembedded.fr/2015/05/une-introduction-a-udev/}
\end{frame}
\end{document}

Binary file not shown.

@ -0,0 +1,412 @@
% 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,aspectratio=169]{beamer}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Thèmes suppélmentaires
\useoutertheme[]{miniframes} % barre menu du haut
\setbeamertemplate{frametitle}[default] % replace le titre à la bonne place
\useinnertheme[shadow=true]{rounded} % arrondi les angles
\usecolortheme{orchid}
\usecolortheme{whale}
%\usepackage{xcolor}
%\definecolor{smileOrange}{RGB}{254,128,86}
\setbeamertemplate{footline}[text line]{
\textcolor{gray}{%
\parbox{\linewidth}{\vspace*{-8pt}Smile\hfill\insertshortauthor\hfill\insertpagenumber/\inserttotalframenumber}}
}
\beamertemplatenavigationsymbolsempty
% Language
\usepackage[french]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
%\usepackage[latin1]{inputenc}
% 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}
}
% 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}
}
\lstdefinelanguage{diff}{
morecomment=[f][\color{blue}]{@@}, % group identifier
morecomment=[f][\color{red}]-, % deleted lines
morecomment=[f][\color{green}]+, % added lines
morecomment=[f][\color{magenta}]{---}, % Diff header lines (must appear after +,-)
morecomment=[f][\color{magenta}]{+++},
}
% Pour utiliser des colonnes
\usepackage{multicol}
% Pour integrer un pdf
\usepackage[final]{pdfpages}
% Pour les hyperliens
\usepackage{hyperref}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\title[U-Boot]{fitImage \& signature de paquets \\ \textbf{Introduction}}
\author[Mickaël Tansorier]{Mickaël Tansorier}
\date[Août 2018]{Présentation du fonctionnement des fitImage et \newline du fonctionnement de signature de paquets}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
%\tableofcontents[subsectionstyle=hide]
% *******************************
% **** PAGE DE GARDE ****
% *******************************
\begin{frame}
\titlepage
\end{frame}
% *******************************
% **** INTRODUCTION ****
% *******************************
\begin{frame}{Plan}
\tableofcontents[hideallsubsections]
\end{frame}
\section{Introduction}
\begin{frame}{Images Linux}
\begin{itemize}
\item \textbf{Image}: image générique binaire
\item \textbf{zImage}: image générique binaire compressé
\item \textbf{uImage}: image avec une entête d'information utilisé par U-Boot
\item \textbf{fitImage}: enveloppe d'image pouvant contenir plusieurs noyaux, devicetree, firmware. Chaque image peut être signé, et d'autres choses
\end{itemize}
\end{frame}
{
\setbeamercolor{background canvas}{bg=}
\includepdf[pages=12-13]{docs/Vasut--secure_and_flexible_boot_with_u-boot_bootloader.pdf}
}
{
\setbeamercolor{background canvas}{bg=}
\includepdf[pages=22]{docs/Josserand-schulz-secure-boot.pdf}
}
% *******************************
% **** PRÉSENTATION ****
% *******************************
\section{Construire fitImage}
\subsection{Les sources mainline}
\begin{frame}[fragile]
% Prevent first column disapear
\begin{columns}\begin{column}{0.2\textwidth}\end{column}\end{columns}
\begin{lstlisting}[style=shell,basicstyle=\tiny\ttfamily\color{white}]
KERNEL=/path/to/zImage
KEYNAME=my_key
\end{lstlisting}
\begin{columns}
\begin{column}{0.5\textwidth}
\begin{lstlisting}[style=shell,basicstyle=\tiny\ttfamily\color{white}]
/dts-v1/;
/ {
description = "fitImage for sign Kernel image and DTB";
#address-cells = <1>;
images {
kernel@1 {
description = "Linux Kenel";
data = /incbin/("%KERNEL%");
type = "kernel";
arch = "arm";
os = "linux";
compression = "none";
load = <0x12000000>;
entry = <0x12000000>;
signature@1 {
algo = "sha256,rsa4096";
key-name-hint = "%KEYNAME%";
};
};
\end{lstlisting}
\end{column}
\begin{column}{0.5\textwidth}
\begin{lstlisting}[style=shell,basicstyle=\tiny\ttfamily\color{white}]
fdt@1 {
description = "Devicetree";
data = /incbin/("%DTB%");
type = "flat_dt";
arch = "arm";
compression = "none";
load = <0x18000000>;
entry = <0x18000000>;
signature@1 {
algo = "sha256,rsa4096";
key-name-hint = "%KEYNAME%";
};
};
};
configurations {
default = "conf@1";
conf@1 {
kernel = "kernel@1";
fdt = "fdt@1";
};
};
};
\end{lstlisting}
\end{column}
\end{columns}
\end{frame}
\begin{frame}[fragile]
Plusieurs type de signature sont disponible: \texttt{common/image-sig.c}
\begin{lstlisting}[style=shell,basicstyle=\tiny\ttfamily\color{white}]
struct image_sig_algo image_sig_algos[] = {
{
"sha1,rsa2048",
rsa_sign,
rsa_add_verify_data,
rsa_verify,
&checksum_algos[0],
},
{
"sha256,rsa2048",
rsa_sign,
rsa_add_verify_data,
rsa_verify,
&checksum_algos[1],
},
{
"sha256,rsa4096",
rsa_sign,
rsa_add_verify_data,
rsa_verify,
&checksum_algos[2],
}
};
\end{lstlisting}
\end{frame}
\subsection{Ajouter les clés dans uboot}
\begin{frame}[fragile]
Crée un devicetree spécifique
\begin{lstlisting}
/dts-v1/;
/ {
model = "Keys";
compatible ="vendor,board";
signature {
key-%KEYNAME% {
required = "image";
algo = "sha256,rsa4096";
key-name-hint = "%KEYNAME%";
};
};
};
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
Pour le générer le dtb
\begin{lstlisting}[style=shell]
dtc -p 4096 $(@D)/u-boot_pubkey.dts -O dtb -o $(@D)/u-boot_pubkey.dtb
\end{lstlisting}
Ce qui donne:
\begin{lstlisting}[style=shell]
$ cat u-boot_pubkey.dtb
vendor,board signature key-my_key image sha256,rsa4096 my_key modelcompatiblerequiredalgokey-name-hint
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
Pour y ajouter la clé public
\begin{lstlisting}[style=shell]
mkimage -D "-I dts -O dtb -p 4096" -f $(@D)/fitImage.its -K $(@D)/u-boot_pubkey.dtb -k $(@D) -r fitImage
\end{lstlisting}
Ce qui donne:
\begin{lstlisting}[style=shell]
$ cat u-boot_pubkey.dtb
vendor,board signature key-my_key
[...]
image sha256,rsa4096 my_key modelcompatiblerequiredalgokey-name-hintrsa,num-bitrsa,n0-inversersa,exponentrsa,modulusra,r-squaredsquared
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
Pour s'assurer que le device tree contenant la clé public soit dans dans le binaire u-boot, il faut que cette option soit à non:
\begin{lstlisting}[style=shell]
BR2_TARGET_UBOOT_USE_CUSTOM_CONFIG
\end{lstlisting}
Pour ajouter dans notre U-boot alors que l'on a pas de dtb, on utiliser l'option EXT\_DTB de make:
\begin{lstlisting}[style=shell]
make CROSS_COMPILE=arm-linux-gnueabihf- EXT_DTB=u-boot_pubkey.dtb
\end{lstlisting}
\end{frame}
\subsection{Signer l'image noyau}
\begin{frame}[fragile]
Ok maintenant il faut siqner le kernel linux.\newline
Il faut le signer avant de compiler u-boot puisque pour ajouter la clé public au devicetree il faut executer mkimge avec en entrée l'its et en sortier le fitImage:
\begin{lstlisting}[style=shell]
mkimage -D "-I dts -O dtb -p 4096" -f $(@D)/fitImage.its -K $(@D)/u-boot_pubkey.dtb -k $(@D) -r fitImage
\end{lstlisting}
Le noyau Linux est bien construit avant U-boot, donc pas besoin d'ajouter de dépendance.
\end{frame}
% *******************************
% **** PRÉSENTATION ****
% *******************************
\section{Paramétrer buildroot - fitImage}
\subsection{uboot}
\begin{frame}[fragile]
J'ai rajouté quelques config dans buildroot.
\begin{lstlisting}[style=shell]
BR2_PACKAGE_UBOOT_TOOLS_FIT_SUPPORT=y
BR2_PACKAGE_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y
BR2_PACKAGE_HOST_UBOOT_TOOLS=y
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y
BR2_TARGET_UBOOT_NEEDS_OPENSSL=y
BR2_TARGET_UBOOT_SIGN_FITIMAGE=y
BR2_TARGET_UBOOT_ITS="$(CONFIG_DIR)/board/eolane/modx6/fitImage.its"
BR2_TARGET_UBOOT_SIGN_DTS="$(CONFIG_DIR)/board/eolane/modx6/u-boot_pubkey.dts"
BR2_TARGET_UBOOT_KEY_NAME="my_key"
BR2_TARGET_UBOOT_KEY_SERVER="bep@hgweb:/home/apache/distribution/keys/"
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]{Vérification de la signature}
il est possible de tester la signature d'une image avec:
\begin{lstlisting}[style=shell]
fit_check_sign -f output/images/fitImage -k u-boot_pubkey.dtb
\end{lstlisting}
dans \texttt{./output/build/host-uboot-tools-2017.07/tools/fit\_check\_sign}
\end{frame}
\begin{frame}[fragile]
Documentation:
\begin{itemize}
\item \url{https://elinux.org/images/e/e0/Josserand-schulz-secure-boot.pdf}
\item \url{https://www.denx.de/wiki/pub/U-Boot/Documentation/multi_image_booting_scenarios.pdf}
\item \url{https://elinux.org/images/8/8a/Vasut--secure_and_flexible_boot_with_u-boot_bootloader.pdf}
\end{itemize}
\end{frame}
% *******************************
% **** PRÉSENTATION ****
% *******************************
\section{Signature de paquets}
\subsection{Générer les clés}
\begin{frame}[fragile]
Il faut une clé paire de clé:
\begin{lstlisting}[style=shell]
$ openssl genrsa -out my_key.key 4096
$ openssl req -batch -new -x509 -key my_key.key -out my_key.crt
\end{lstlisting}
Pour extraire le clé publique du certificat
\begin{lstlisting}[style=shell]
openssl x509 -pubkey -noout -in my_key.crt > my_key.pub
\end{lstlisting}
\end{frame}
\subsection{Signer}
\begin{frame}[fragile]
Pour signer:
\begin{lstlisting}[style=shell]
openssl dgst -sha256 -sign my_key.key -out file_to_sign.sha256 file_to_sign
\end{lstlisting}
Si la signature est sous forme binaire, on peut la convertir sous forme textuel:
\begin{lstlisting}[style=shell]
openssl base64 -in file_to_sign.sha256 -out file_to_sign.sign
\end{lstlisting}
\end{frame}
\subsection{Vérifier}
\begin{frame}[fragile]
Pour signer:
\begin{lstlisting}[style=shell]
openssl dgst -sha256 -verify my_key.pub -signature file_to_sign.sha256 file_to_sign
\end{lstlisting}
Si la signature est sous forme binaire, on peut la convertir sous forme textuel:
\begin{lstlisting}[style=shell]
openssl base64 -d -in file_to_sign.sign -out file_to_sign.sha256
\end{lstlisting}
\end{frame}
% *******************************
% **** PRÉSENTATION ****
% *******************************
\section*{Conclusion}
\begin{frame}
\begin{center}
\begin{huge}
Question ?
\end{huge}
\end{center}
\begin{center}
\textcolor{gray}{\tiny{Enfin je vais essayer de répondre...}}
\end{center}
\end{frame}
\end{document}

@ -1,4 +1,4 @@
PRESENTATIONS = Logiciel_Libre Yocto-RapsberryPi-devtool-Ansible Alternative_pour_Android Presentation_fitImage
PRESENTATIONS = Logiciel_Libre Yocto-RapsberryPi-devtool-Ansible Alternative_pour_Android Presentation_fitImage Formation_Udev Yocto-devel Formation_Memoires
# Individual project
@ -10,6 +10,12 @@ Alternative_pour_Android: Alternative_pour_Android.pdf
Presentation_fitImage: Presentation_fitImage.pdf
Formation_Udev: Formation_Udev.pdf
Yocto-devel: Yocto-deve.pdf
Formation_Memoires: Formation_Memoires.pdf
# Commun project
all: $(addsuffix .pdf,$(PRESENTATIONS))

@ -4,7 +4,10 @@ Pésentations
1. L'alternative Logiciel Libre
2. Yocto - devtool - Ansible: La dernière recette de ma grand-mère
3. Alternative pour Android
4. Prentation fitImage - Introduction
4. Prentation fitImage & signature de paquets - Introduction
5. Udev - Gérer les divices nodes
6. Yocto devtool et autre - Comment développer efficassement sous Yocto
7. Mémoires - Partitionnement et manipulation de mémoires
L'alternative Logiciel Libre
@ -44,17 +47,35 @@ _Présentation de retour d'expérience de l'utilisation et du fonctionnement du
Nom du projet à compiler: **Presentation_fitImage**
Udev - Gérer les divices nodes
------------------------------
_Présentation sur l'utilisation de Udev et des devices node sous linux. Comment ça fonctionne, comment les utiliser, et quels outils utiliser pour écrire des règle simple._
Nom du projet à compiler: **Formation_Udev**
Yocto devtool et autre - Comment développer efficassement sous Yocto
--------------------------------------------------------------------
_Présentation d'outils de développement pour travailler efficassement sous Yocto._
Nom du projet à compiler: **Yocto-devel**
Mémoires - Partitionnement et manipulation de mémoires
------------------------------------------------------
_Présentation sur la manipulation de zones mémoires, leur formatage et de leur secteur. Spécifiquement lié à l'utilisation de U-boot et de ses variable d'environnement._
Nom du projet à compiler: **Formation_Memoires**
Compilation
===========
Prerequis
---------
install packages:
```shell
texlive
texlive-core
texlive-latex-extra
fonts-font-awesome
texlive-lang-french
```
Pour utiliser le paquet latex `fontawesome` il faut intaller le paquet système: texlive-fontsextra
Commands
------

Binary file not shown.

@ -0,0 +1,685 @@
% 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]{beamer}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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}{
basicstyle=\fontsize{7pt}{7pt}\ttfamily\color{white},
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} - et autres… \\ \textbf{Comment développer efficacement sous Yocto}}
\author[Mickaël Tansorier]{Mickaël Tansorier}
\date[Mars 2018]{Présentation des outils et commandes pratique pour travailler sous Yocto}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
%\tableofcontents[subsectionstyle=hide]
% *******************************
% **** PAGE DE GARDE ****
% *******************************
\begin{frame}
\titlepage
\end{frame}
% *******************************
% **** INTRODUCTION ****
% *******************************
\begin{frame}
\underline{Objectif de la présentation}
\begin{itemize}
\item Présenter rapidement Yocto
\item Présenter des outils utiles
\begin{itemize}
\item \texttt{devtool}
\item \texttt{opkg}
\item \texttt{}
\end{itemize}
\end{itemize}
\end{frame}
\begin{frame}{Plan}
\tableofcontents[hideallsubsections]
\end{frame}
% *******************************
% **** PRÉSENTATION ****
% *******************************
\section{Présentation rapide 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}{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}
Yocto utilise le principe de \texttt{MACHINE} et de \texttt{DISTRO} qui sent à la différenciation de l\textbf{architecture matérielle} de l\textbf{application logicielle} de la cible
\begin{itemize}
\item \texttt{MACHINE} : définit larchitecture matérielle
\item \texttt{DISTRO} : définit la distribution à générer
\end{itemize}
Il dispose de plusieurs outils très pratique pour le développement:
\begin{itemize}
\item \texttt{devtool}
\item \texttt{ipk}/\texttt{opkg}
\end{itemize}
\end{frame}
\begin{frame}
\tikzstyle{recette} = [draw, fill=orange!70, rectangle, minimum height=2.5em, minimum width=10em,rounded corners=5pt]
\tikzstyle{cadre} = [rectangle, draw, minimum height=12em, minimum width=8.5em, fill=orange!70]
\begin{center}
\begin{tikzpicture}[node distance=1.2cm]
% Yocto
\node[draw,rectangle,minimum height=8cm, minimum width=10cm, fill=orange!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=0cm, 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=0cm, 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=0cm, 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=0cm, 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}
%
% **** LE COEUR ****
%
\subsection{Le coeur}
\begin{frame}
\begin{center}
\textcolor{orange}{\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=orange!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}
\textcolor{gray}{\tiny{Pour avoir les vrais étapes d'une recette: \texttt{bitbake <recette> -c listtasks}}}
\end{frame}
\subsection{recette}
\begin{frame}{recette}
\begin{block}{À quoi ça ressemble une recette ?}
\includegraphics[width=\textwidth]{images/recette-yocto.png}
\end{block}
\end{frame}
% *******************************
% **** OUTILS DEVTOOL ****
% *******************************
\section{\texttt{devtool}}
\begin{frame}{\texttt{devtool}}
\tableofcontents[currentsection,hideallsubsections]
\end{frame}
\begin{frame}{\texttt{devtool}}
\begin{center}
\textcolor{orange}{\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'une recette
\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=-16px,xrightmargin=-16px]
$ 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{orange}{\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 normalement
\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}
\begin{frame}[fragile]
Dans le cas où vous modifiez déjà une recette avec un bbappend, je vous conseil d'extraire les patchs à la main:
\begin{lstlisting}[style=shell]
$ cd $POKY/build/workspace/sources/weston/
$ git format patch -<nb_patch>
\end{lstlisting}
Il ne reste plus qu'a copier ces patch dans la recette et d'ajouter dans le bbappend avec:
\begin{lstlisting}[style=shell]
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
SRC_URI += "file://000X-mon-patch.patch"
\end{lstlisting}
\end{frame}
\subsection{Déployer directement vos modifications sur cible}
\begin{frame}
\begin{center}
\textcolor{orange}{\huge{Exemple pour deployer directement ses modifications sur cible}}
\end{center}
\end{frame}
\begin{frame}[fragile]
Après modification de source avec devtool il est possible de déployer ces modification directement sur une cible avec:
\begin{lstlisting}[style=shell]
$ devtool deploy-target <recette> <user@cible>
\end{lstlisting}
La cible doit disposer d'un serveur ssh. \newline
\newline
Attention, devtool n'envoit pas un paquet mais le résultat de la recette, donc pas besoin d'un \texttt{package-management} sur cible.\\
Une fois votre mise au point terminée vous pouvez supprimer tous les fichiers ajoutés par votre recette la commande:
\begin{lstlisting}[style=shell]
$ devtool undeploy-target <recette> <user@cible>
\end{lstlisting}
\end{frame}
% *******************************
% **** OUTILS OPKG et IPK ****
% *******************************
\section{\texttt{opkg} et \texttt{ipk}}
\begin{frame}
\tableofcontents[currentsection,hideallsubsections]
\end{frame}
\begin{frame}
\begin{center}
\textcolor{orange}{\huge{Exemple de l'utilisation des l'outils \texttt{opkg} et \texttt{ipk}}}
\end{center}
\end{frame}
\subsection{\texttt{opkg} un gestionnaire de paquets}
\begin{frame}{\texttt{opkg} est un gestionnaire de paquets}
\texttt{opkg} est gestionnaire de paquet tout comme apt l'est pour les distribution hérité de Debian.\newline
\newline
Les commandes de base:
\begin{description}
\item[\texttt{opkg update}] Mettre à jour la list des paquets
\item[\texttt{opkg upgrade <pkgs>}] Mettre à jour un paquet
\item[\texttt{opkg install <pkgs|url>}] Installer un paquet
\item[\texttt{opkg remove <pkgs>}] Supprimer un paquet
\end{description}
\end{frame}
\subsection{Créer son propre serveur de paquet}
\begin{frame}[fragile]{Créer son propre serveur \texttt{opkg}}
Pour créer son serveur opkg il suffit d'avoir un sereur http.\newline
On peut le crée simplement avec python en remplaçant les variable par leur valeur :
\begin{lstlisting}[style=shell]
$ cd ${POKY}/build/tmp/deploy/ipk
$ ${NATIVE_SDK_BINS}/usr/bin/python-native/python -m SimpleHTTPServer ${IPK_SERVER_PORT}
\end{lstlisting}
Avec python3:
\begin{lstlisting}[style=shell]
$ cd ${POKY}/build/tmp/deploy/ipk
$ ${NATIVE_SDK_BINS}/usr/bin/python-native/python3 -m http.server ${IPK_SERVER_PORT}
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]{Définir le serveur \texttt{opkg} sur cible}
Ajouter ces lignes dans le fichier \texttt{opkg.conf} en remplaçant les variable correspondante par leur valeur:
\begin{lstlisting}[style=shell,xleftmargin=-18px,xrightmargin=-18px]
src/gz all http://ipk-server:${IPK_SERVER_PORT}/all
src/gz ${MACHINE_ARCH} http://ipk-server:${IPK_SERVER_PORT}/${MACHINE_ARCH}
src/gz ${MACHINE_SOCARCH} http://ipk-server:${IPK_SERVER_PORT}/${MACHINE_SOCARCH}
src/gz ${TUNE_PKGARCH} http://ipk-server:${IPK_SERVER_PORT}/${TUNE_PKGARCH}
\end{lstlisting}
\textcolor{gray}{\tiny{Recette opkg}}
\newline
Ajouter dans \texttt{/etc/hosts} le serveur:
\begin{lstlisting}[style=shell]
${IP_HOST} ipk-server
\end{lstlisting}
\textcolor{gray}{\tiny{Recette netbase}}
\end{frame}
% *******************************
% **** OUTILS DIVERS ****
% *******************************
\section{Outils et commandes diverses}
\begin{frame}
\tableofcontents[currentsection,hideallsubsections]
\end{frame}
\begin{frame}
\begin{center}
\textcolor{orange}{\huge{Quelques outils et commandes diverses qui peuvent intéresser}}
\end{center}
\end{frame}
\subsection{La plus puissante option}
\begin{frame}[fragile]{environnement}
Pour connaitre l'état de n'importe quelle recette et quelle variable est compléter par quel fichier de recette, l'option \texttt{-e} est le plus puissant.\newline
\begin{lstlisting}[style=shell]
$ bitbake <recipe> -e
\end{lstlisting}
La sortie est assez velue, il vaut mieux l'ouvrir dans un éditeur comme:
\begin{lstlisting}[style=shell]
$ bitbake <recipe> -e | vim -
\end{lstlisting}
\end{frame}
\subsection{devshell}
\begin{frame}[fragile]{environnement}
Si vous souhaitez tester des commandes dans un environnement de cross compilation, l'option \texttt{devshell} est l'outils qu'il faut:
\begin{lstlisting}[style=shell]
$ bitbake <recipe> -c devshell
\end{lstlisting}
\end{frame}
\subsection{defconfig}
\begin{frame}[fragile]{defconfig}
Ajouter un fichier de configuration.\newline
\newline
Pour la plupart des paquets la gestion de yocto reconnais les defconfig. Il faut ajouter dans un bbappend pour dans une recette maitrisé:
\begin{lstlisting}[style=shell]
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
SRC_URI += "file://defconfig"
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]{savedefconfig}
Ajouter une option de configuration à un paquet facilement.\newline
\newline
Ceci fonctionne si vous avez le defconfig dans votre layer.
\begin{enumerate}
\item Ajouter une config
\begin{lstlisting}[style=shell]
$ bitbake linux-fslc -c menuconfig
\end{lstlisting}
\item Tester
\item Générer le nouveau defconfig
\begin{lstlisting}[style=shell]
$ bitbake linux-fslc -c savedefconfig
\end{lstlisting}
\item Remplacer le defconfig par sa génération
\end{enumerate}
\end{frame}
\begin{frame}[fragile]{diffconfig}
Ajouter une option de configuration à un paquet facilement.
\begin{enumerate}
\item Ajouter une config
\begin{lstlisting}[style=shell]
$ bitbake linux-fslc -c menuconfig
\end{lstlisting}
\item Tester
\item Extraire la configuration et ses dépendances mutualisé
\begin{lstlisting}[style=shell]
$ bitbake linux-fslc -c diffconfig
linux-fslc-4.10-r0 do_diffconfig: Config fragment has been dumped into:
/home/user/yocto/build/tmp/work/archi/linux-fslc/4.10-r0/fragment.cfg
\end{lstlisting}
\item Ajouter le fragment à la recette
\begin{lstlisting}[style=shell]
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
SRC_URI += "file://myfragment.cfg"
\end{lstlisting}
\textcolor{gray}{\tiny{Après la génération du diffconfig il faut ajouter l'option à la recette car elle est retiré du config}}
\end{enumerate}
\end{frame}
\subsection{Compiler le plus loin possible}
\begin{frame}[fragile]{Compilation}
Si vous souhaitez compiler une image le plus loin possible après une erreur:
\begin{lstlisting}[style=shell]
$ bitbake <image> -k
\end{lstlisting}
\end{frame}
\subsection{oe-pkgdata-util}
\begin{frame}[fragile]{Quel parquet embarque quoi comme ficher}
Lister les fichier contenue dans un paquet:
\begin{lstlisting}[style=shell]
$ oe-pkgdata-util list-pkg-files <recipe>
\end{lstlisting}
Trouver quel paquet fournis quel fichier:
\begin{lstlisting}[style=shell]
$ oe-pkgdata-util find-path /etc/opkg/pokg.conf
\end{lstlisting}
\end{frame}
\subsection{buildhistory}
\begin{frame}[fragile]{buildhistory}
Buildhistory fourni un ensemble de détails sur le contenue des paquets, leur dépendances, et leur inclusion dans une image.\newline
\newline
Ajouter dans \texttt{conf/local.conf}:
\begin{lstlisting}[style=shell]
INHERIT += "buildhistory"
BUILDHISTORY_COMMIT = "1"
\end{lstlisting}
Le résultat se situe dans le dossier de build dans \texttt{buildhistory}.
\end{frame}
\subsection{autocompletion}
\begin{frame}[fragile]{Autocompletion}
Pour faciliter le développement l'autocompletion est plus confortable.\newline
\newline
Il existe des projets, mais qui date un peut...
\url{https://github.com/sergioprado/bitbake-bash-completion}
\url{https://github.com/lukaszgard/bitbake-completion}\newline
\newline
Il faut copier les fichier dans:
\begin{lstlisting}[style=shell]
/etc/bash_completion.d/
\end{lstlisting}
Suivez les instructions des dépôts.
\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{https://openwrt.org/docs/guide-user/additional-software/opkg}
\end{itemize}
\end{frame}
\begin{frame}
\centering
\textcolor{orange}{\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}

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Loading…
Cancel
Save