Note exercices, little rework for the book

This commit is contained in:
nemunaire 2022-04-08 22:39:14 +02:00
parent 0794ecaa2b
commit bbd704d413
29 changed files with 210 additions and 120 deletions

View file

@ -68,17 +68,17 @@ depuis un conteneur, par exemple :
<div lang="en-US"> <div lang="en-US">
``` ```
42sh$ docker run -it --rm alpine 42sh$ docker run -it --rm alpine
(ctnr)# apk add --no-cache acl iputils (ctnr)# apk add --no-cache acl iputils
(1/4) Installing libacl (2.2.53-r0) (1/4) Installing libacl (2.2.53-r0)
(2/4) Installing acl (2.2.53-r0) (2/4) Installing acl (2.2.53-r0)
(3/4) Installing libcap (2.50-r0) (3/4) Installing libcap (2.50-r0)
(4/4) Installing iputils (20210202-r0) (4/4) Installing iputils (20210202-r0)
(ctnr)# su -s/bin/ash daemon (ctnr)# su -s/bin/ash daemon
(ctnr)$ _ (ctnr)$ _
``` ```
</div> </div>
@ -87,10 +87,10 @@ tests en retirant le *setuid* :
<div lang="en-US"> <div lang="en-US">
``` ```
(ctnr)# chmod u-s /bin/ping (ctnr)# chmod u-s /bin/ping
(ctnr)$ ping epita.fr (ctnr)$ ping epita.fr
ping: socket: Operation not permitted ping: socket: Operation not permitted
``` ```
</div> </div>
@ -98,10 +98,10 @@ Puis en ajoutant la *capability* :
<div lang="en-US"> <div lang="en-US">
``` ```
(ctnr)# setcap cap_net_raw+p /bin/ping (ctnr)# setcap cap_net_raw+p /bin/ping
(ctnr)$ ping epita.fr (ctnr)$ ping epita.fr
PING epita.fr (172.67.156.141) 56(84) bytes of data. PING epita.fr (172.67.156.141) 56(84) bytes of data.
``` ```
</div> </div>
@ -200,8 +200,9 @@ du fichier ; et on peut l'afficher dans sa version plus lisible :
``` ```
</div> </div>
::::: {.exercice}
### Exercice : visualisateur de capabilities d'un processus {-} ### Visualisateur de capabilities d'un processus {-}
Écrivons maintenant un programme permettant de voir les *capabilities* Écrivons maintenant un programme permettant de voir les *capabilities*
d'un processus : d'un processus :
@ -241,6 +242,7 @@ courant.
Astuces : `capget(2)`, X-macros, ... Astuces : `capget(2)`, X-macros, ...
:::::
### Pour aller plus loin {-} ### Pour aller plus loin {-}

View file

@ -1,3 +1,5 @@
::::: {.exercice}
### Exercice (obligatoire pour les SRS -- optionnel pour les GISTRE) ### Exercice (obligatoire pour les SRS -- optionnel pour les GISTRE)
Poursuivons [notre script de monitoring](#script-monitoring) afin d'envoyer nos Poursuivons [notre script de monitoring](#script-monitoring) afin d'envoyer nos
@ -85,3 +87,5 @@ particuliers.
42sh$ ./telegraf.sh my_cgroup_name memhog 500 42sh$ ./telegraf.sh my_cgroup_name memhog 500
``` ```
</div> </div>
:::::

View file

@ -79,10 +79,10 @@ l'une de ces trois situations :
``` ```
</div> </div>
::::: {.question}
Avant d'aller plus loin, notez que les exemples seront donnés pour les deux Avant d'aller plus loin, notez que les exemples seront donnés pour les deux
versions des `cgroup`s à chaque fois. versions des `cgroup`s à chaque fois.
::::: {.question}
La principale différence entre les deux est la fusion des différents La principale différence entre les deux est la fusion des différents
sous-systèmes au sein d'une même arborescence. Dans la première version, chaque sous-systèmes au sein d'une même arborescence. Dans la première version, chaque
sous-système disposait de sa propre arborescence et il fallait créer les sous-système disposait de sa propre arborescence et il fallait créer les
@ -179,11 +179,15 @@ En validant cette commande, nous avons déplacé le processus dans ce groupe, il
n'est alors plus dans aucun autre groupe (pour ce *cgroup*, il ne bouge pas n'est alors plus dans aucun autre groupe (pour ce *cgroup*, il ne bouge pas
dans les autres *cgroup*s). dans les autres *cgroup*s).
::::: {.question}
Malgré l'utilisation de la redirection `>` (et non `>>`), il s'agit bel et Malgré l'utilisation de la redirection `>` (et non `>>`), il s'agit bel et
bien d'un ajout au fichier et non d'un écrasement. Il faut garder en tête que bien d'un ajout au fichier et non d'un écrasement. Il faut garder en tête que
le système de fichier est entièrement simulé et que certains comportements sont le système de fichier est entièrement simulé et que certains comportements sont
adaptés. adaptés.
:::::
### Consultation de l'état ### Consultation de l'état
@ -233,7 +237,9 @@ echo 0 > /sys/fs/cgroup/virli/cgroup.freeze # v2
</div> </div>
### Exercice : script de monitoring {- #script-monitoring} ::::: {.exercice}
### Script de monitoring {- #script-monitoring}
À nous maintenant de concevoir un script qui va enregistrer vers une base de À nous maintenant de concevoir un script qui va enregistrer vers une base de
données des statistiques issues des *cgroup*s, tel `telegraf`. données des statistiques issues des *cgroup*s, tel `telegraf`.
@ -266,7 +272,6 @@ mémoire.
``` ```
</div> </div>
::::: {.question}
Le modèle de sortie standard de votre script `monitor` n'a pas d'importance, il Le modèle de sortie standard de votre script `monitor` n'a pas d'importance, il
doit cependant être possible d'y trouver des statistiques intéressantes, dont doit cependant être possible d'y trouver des statistiques intéressantes, dont
la quantité de mémoire utilisée. Ici nous affichons au début le PID du la quantité de mémoire utilisée. Ici nous affichons au début le PID du
@ -285,7 +290,6 @@ Où :
- `group_name` correspond au nom du/des *cgroup*(s) à créer/rejoindre. - `group_name` correspond au nom du/des *cgroup*(s) à créer/rejoindre.
- `prog [args [...]]` est la commande que l'on souhaite monitorer, à exécuter - `prog [args [...]]` est la commande que l'on souhaite monitorer, à exécuter
dans le *cgroup*. dans le *cgroup*.
:::::
::::: {.warning} ::::: {.warning}
Si vous n'avez pas le *cgroup* *memory*, il est possible qu'il ne soit pas Si vous n'avez pas le *cgroup* *memory*, il est possible qu'il ne soit pas
@ -293,6 +297,7 @@ activé par défaut par votre système. Si vous êtes dans ce cas, essayez
d'ajouter `cgroup_enable=memory` à la ligne de commande de votre noyau. d'ajouter `cgroup_enable=memory` à la ligne de commande de votre noyau.
::::: :::::
:::::
### Fixer des limites {#Fixer-des-limites} ### Fixer des limites {#Fixer-des-limites}
@ -357,5 +362,8 @@ limites que vous avez définies :
### Pour aller plus loin {-} ### Pour aller plus loin {-}
Pour tout connaître en détails, [la série d'articles de Neil Brown sur les Pour tout connaître en détails, [la série d'articles de Neil Brown sur les
Control groups](https://lwn.net/Articles/604609/) est excellente ! Plus [cet Control groups](https://lwn.net/Articles/604609/)[^lwncgroups] est excellente !
article sur la version 2](https://lwn.net/Articles/679786/). Plus [cet article sur la version 2](https://lwn.net/Articles/679786/)[^lwncgroupsv2].
[^lwncgroups]: <https://lwn.net/Articles/604609/>
[^lwncgroupsv2]: <https://lwn.net/Articles/679786/>

View file

@ -1,3 +1,5 @@
::::: {.exercice}
## Exercice (SRS seulement) {-} ## Exercice (SRS seulement) {-}
Écrivons maintenant un programme dont le seul but est de s'échapper du `chroot` : Écrivons maintenant un programme dont le seul but est de s'échapper du `chroot` :
@ -26,3 +28,5 @@ Mais une fois votre programme `escape` exécuté, vous devriez pouvoir !
bash# cat /path/to/foo bash# cat /path/to/foo
``` ```
</div> </div>
:::::

View file

@ -1,8 +1,6 @@
Prérequis Prérequis
--------- ---------
### Noyau Linux
Pour pouvoir suivre les exemples et faire les exercices qui suivent, vous aurez Pour pouvoir suivre les exemples et faire les exercices qui suivent, vous aurez
besoin d'un noyau Linux récent (une version 5.x sera très bien). Il doit de besoin d'un noyau Linux récent (une version 5.x sera très bien). Il doit de
plus être compilé avec les options suivantes (lorsqu'elles sont disponibles plus être compilé avec les options suivantes (lorsqu'elles sont disponibles
@ -29,10 +27,18 @@ General setup --->
``` ```
</div> </div>
Si vous utilisez un noyau standard fourni par votre distribution, les options
requises seront a priori déjà sélectionnées et vous n'aurez donc pas à compiler
votre propre noyau. Néanmoins, nous allons nous interfacer avec le noyau, il
est donc nécessaire d'avoir les en-têtes de votre noyau.
#### Vérification via `menuconfig`\ Sous Debian, vous pouvez les installer via le paquet au nom semblable à
`linux-headers`. Le paquet porte le même nom sous Arch Linux et ses dérivés.
L'arbre ci-dessous correspond aux options qui seront *built-in* (signalées par
### Vérification via `menuconfig`
L'arbre ci-dessus correspond aux options qui seront *built-in* (signalées par
une `*`) ou installées en tant que module (signalées par un `M`). En effet, une `*`) ou installées en tant que module (signalées par un `M`). En effet,
chaque noyau Linux peut être entièrement personnalisé en fonction des options chaque noyau Linux peut être entièrement personnalisé en fonction des options
et des pilotes que l'on voudra utiliser. et des pilotes que l'on voudra utiliser.
@ -50,7 +56,7 @@ make menuconfig
</div> </div>
#### Vérification via `/boot/config-xxx`\ ### Vérification via `/boot/config-xxx`
Les distributions basées sur Debian ont pour habitude de placer le fichier de Les distributions basées sur Debian ont pour habitude de placer le fichier de
configuration ayant servi à compiler le noyau et ses modules dans le dossier configuration ayant servi à compiler le noyau et ses modules dans le dossier
@ -80,22 +86,10 @@ CONFIG_CGROUP_NET_CLASSID=y
</div> </div>
#### Vérification via `/proc/config.gz`\ ### Vérification via `/proc/config.gz`
Dans la plupart des autres distributions, la configuration est accessible à Dans la plupart des autres distributions, la configuration est accessible à
travers le fichier `/proc/config.gz`. Comme vous ne pouvez pas écrire dans travers le fichier `/proc/config.gz`. Comme vous ne pouvez pas écrire dans
`/proc` pour décompresser le fichier, utilisez les outils `zcat`, `zgrep`, ... `/proc` pour décompresser le fichier, utilisez les outils `zcat`, `zgrep`, ...
Vous devez retrouver les mêmes options que celles de la section précédente. Vous devez retrouver les mêmes options que celles de la section précédente.
### Présence des en-têtes
Si vous utilisez un noyau standard fourni par votre distribution, les options
requises seront a priori déjà sélectionnées et vous n'aurez donc pas à compiler
votre propre noyau. Néanmoins, nous allons nous interfacer avec le noyau, il
est donc nécessaire d'avoir les en-têtes de votre noyau.
Sous Debian, vous pouvez les installer via le paquet au nom semblable à
`linux-headers`. Le paquet porte le même nom sous Arch Linux et ses dérivés.

View file

@ -42,20 +42,24 @@ jusqu'à ce que le système retrouve sa sérénité.
## Esquiver l'OOM killer ? ## Esquiver l'OOM killer ?
Au sein d'un *cgroup* *memory*, les fichiers `memory.oom_control` (v1) ou Au sein d'un *cgroup* *memory*, les fichiers `memory.oom_control` (v1) ou
`memory.events` (v2) peuvent être utilisé afin de recevoir une notification du `memory.events` (v2) peuvent être utilisés afin de recevoir une notification du
noyau avant que l'OOM-killer ne s'attaque à un processus de ce groupe. noyau avant que l'OOM-killer ne s'attaque à un processus de ce groupe.
Grâce à cette notification, il est possible de figer le processus pour Grâce à cette notification, il est possible de figer le processus pour
l'envoyer sur une autre machine. Et ainsi libérer la mémoire avant que l'OOM l'envoyer sur une autre machine. Et ainsi libérer la mémoire avant que l'OOM
killer ne passe. killer ne passe.
Jetez un œil à [cet article parru sur LWN](https://lwn.net/Articles/590960/) à Jetez un œil à [cet article paru sur LWN](https://lwn.net/Articles/590960/) à
ce sujet. ce sujet :\
<https://lwn.net/Articles/590960/>
::::: {.exercice}
## À vous de jouer {-} #### À vous de jouer {-}\
Continuons l'exercice précédent où nous avions [fixé les Continuons l'exercice précédent où nous avions [fixé les
limites](#Fixer-des-limites) de mémoire que pouvez réserver les processus de limites](#Fixer-des-limites) de mémoire que pouvez réserver les processus de
notre groupe. Que se passe-t-il alors si `memhog` dépasse la quantité de notre groupe. Que se passe-t-il alors si `memhog` dépasse la quantité de
mémoire autorisée dans le `cgroup` ? mémoire autorisée dans le `cgroup` ?
:::::

View file

@ -57,7 +57,7 @@ exemple, pour modifier les paramètres du noyau, on passe par le fichier
`/etc/sysctl.conf` et du programme `sysctl`. `/etc/sysctl.conf` et du programme `sysctl`.
#### Consultation et modification\ ### Consultation et modification
La consultation d'un élément se fait généralement à l'aide d'un simple `cat` : La consultation d'un élément se fait généralement à l'aide d'un simple `cat` :
@ -79,7 +79,7 @@ La modification d'un élément se fait avec `echo`, comme ceci :
Vous devriez constater l'effet de cette commande sans plus attendre ! Vous devriez constater l'effet de cette commande sans plus attendre !
### Exercices ::::: {.exercice}
#### `procinfo`\ #### `procinfo`\
@ -158,7 +158,7 @@ Remaining time: N/A
``` ```
</div> </div>
Pour les détails sur l'organisation de ce dossier, regardez : Pour les détails sur l'organisation de ce dossier, regardez :\
<https://www.kernel.org/doc/Documentation/power/power_supply_class.txt>. <https://www.kernel.org/doc/Documentation/power/power_supply_class.txt>.
@ -243,7 +243,7 @@ Voici un exemple d'utilisation :
Vous aurez besoin de définir une alarme au niveau de votre RTC, via le Vous aurez besoin de définir une alarme au niveau de votre RTC, via le
fichier :\ fichier :\
`/sys/class/rtc/rtcX/wakealarm` `/sys/class/rtc/rtcX/wakealarm`\
::::: {.warning} ::::: {.warning}
Attention au fuseau horaire utilisé par votre RTC, si votre système principal Attention au fuseau horaire utilisé par votre RTC, si votre système principal
@ -251,7 +251,7 @@ est Windows, elle utilisera sans doute le fuseau horaire courant. Sinon, ce
sera UTC. sera UTC.
::::: :::::
::::: {.more} Un article très complet sur le sujet est disponible ici :\
Un article très complet sur le sujet est disponible ici :
<https://www.linux.com/tutorials/wake-linux-rtc-alarm-clock/> <https://www.linux.com/tutorials/wake-linux-rtc-alarm-clock/>
::::: :::::

View file

@ -77,7 +77,7 @@ seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog);
</div> </div>
### Exercice {-} ::::: {.exercice}
Écrivez un programme filtrant un appel système, à l'aide de `seccomp` : Écrivez un programme filtrant un appel système, à l'aide de `seccomp` :
@ -90,3 +90,5 @@ sleep: cannot read realtime clock: Operation not permitted
</div> </div>
Dans cet exemple, l'appel système filtré est `nanosleep(2)`. Dans cet exemple, l'appel système filtré est `nanosleep(2)`.
:::::

View file

@ -1,6 +1,8 @@
\newpage \newpage
### Exercice : comparaison de *namespace* -- `cmpns.sh` ::::: {.exercice}
### Comparaison de *namespace* -- `cmpns.sh`
Les *namespaces* d'un programme sont exposés sous forme de liens symboliques Les *namespaces* d'un programme sont exposés sous forme de liens symboliques
dans le répertoire `/proc/<PID>/ns/`. dans le répertoire `/proc/<PID>/ns/`.
@ -63,3 +65,5 @@ Et pourquoi pas :
- uts: same - uts: same
``` ```
</div> </div>
:::::

View file

@ -1,7 +1,9 @@
\newpage \newpage
Exercice : `docker exec` ::::: {.exercice}
------------------------
`docker exec`
-------------
Après voir lu la partie concernant les *namespaces*, vous avez dû comprendre Après voir lu la partie concernant les *namespaces*, vous avez dû comprendre
qu'un `docker exec`, n'était donc rien de plus qu'un `nsenter(1)`. qu'un `docker exec`, n'était donc rien de plus qu'un `nsenter(1)`.
@ -46,3 +48,5 @@ d63ceae86395
... ...
``` ```
</div> </div>
:::::

View file

@ -13,8 +13,7 @@ systèmes de fichiers.
Au premier abord, les points de montage dans l'arborescence d'un système de Au premier abord, les points de montage dans l'arborescence d'un système de
fichiers n'ont pas l'air d'être remplis de notions complexes : un répertoire fichiers n'ont pas l'air d'être remplis de notions complexes : un répertoire
peut être le point d'entrée d'un montage vers la partition d'un disque peut être le point d'entrée d'un montage vers la partition d'un disque
physique... ou d'une partition virtuelle, comme nous l'avons vu dans le TP physique... ou d'une partition virtuelle, comme nous l'avons vu précédemment.
précédent.
Mais avez-vous déjà essayé de monter la même partition d'un disque physique à Mais avez-vous déjà essayé de monter la même partition d'un disque physique à
deux endroits différents de votre arborescence ? deux endroits différents de votre arborescence ?
@ -35,30 +34,30 @@ d'avoir une vision arborescente des points de montage en cours d'utilisation.
``` ```
TARGET SOURCE FSTYPE OPTIONS TARGET SOURCE FSTYPE OPTIONS
/ /dev/sda1 ext4 rw,relatime,data=ordered / /dev/sda1 ext4 rw,relatime,data=ordered
├─/proc proc proc rw,nosuid,nodev,noexec,relatime /proc proc proc rw,nosuid,nodev,noexec,relatime
├─/sys sysfs sysfs rw,nosuid,nodev,noexec,relatime /sys sysfs sysfs rw,nosuid,nodev,noexec,relatime
├─/sys/kernel/security securityfs securityfs rw,nosuid,nodev,noexec,relatime ├─/sys/kernel/security securityfs securityfs rw,nosuid,nodev,noexec,relatime
├─/sys/firmware/efi/efivars efivarfs efivarfs ro,relatime ├─/sys/firmware/efi/efivars efivarfs efivarfs ro,relatime
└─/sys/fs/cgroup cgroup_root tmpfs rw,nosuid,nodev,noexec,relatime,size=10240k,mode=755 └─/sys/fs/cgroup cgroup_root tmpfs rw,nosuid,nodev,noexec,relatime
├─/sys/fs/cgroup/unified none cgroup2 rw,nosuid,nodev,noexec,relatime ├─/sys/fs/cgroup/unified none cgroup2 rw,nosuid,nodev,noexec,relatime
├─/sys/fs/cgroup/cpuset cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset ├─/sys/fs/cgroup/cpuset cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset
├─/sys/fs/cgroup/cpu cpu cgroup rw,nosuid,nodev,noexec,relatime,cpu ├─/sys/fs/cgroup/cpu cpu cgroup rw,nosuid,nodev,noexec,relatime,cpu
├─/sys/fs/cgroup/cpuacct cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct ├─/sys/fs/cgroup/cpuacct cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct
├─/sys/fs/cgroup/blkio blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio ├─/sys/fs/cgroup/blkio blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio
├─/sys/fs/cgroup/memory memory cgroup rw,nosuid,nodev,noexec,relatime,memory ├─/sys/fs/cgroup/memory memory cgroup rw,nosuid,nodev,noexec,relatime,memory
├─/sys/fs/cgroup/devices devices cgroup rw,nosuid,nodev,noexec,relatime,devices ├─/sys/fs/cgroup/devices devices cgroup rw,nosuid,nodev,noexec,relatime,devices
├─/sys/fs/cgroup/freezer freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer ├─/sys/fs/cgroup/freezer freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer
├─/sys/fs/cgroup/net_cls net_cls cgroup rw,nosuid,nodev,noexec,relatime,net_cls ├─/sys/fs/cgroup/net_cls net_cls cgroup rw,nosuid,nodev,noexec,relatime,net_cls
├─/sys/fs/cgroup/perf_event perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event ├─/sys/fs/cgroup/perf_event perf_event cgroup rw,nosuid,nodev,noexec,relatime,p_event
├─/sys/fs/cgroup/net_prio net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_prio ├─/sys/fs/cgroup/net_prio net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_pri
└─/sys/fs/cgroup/pids pids cgroup rw,nosuid,nodev,noexec,relatime,pids └─/sys/fs/cgroup/pids pids cgroup rw,nosuid,nodev,noexec,relatime,pids
├─/dev devtmpfs devtmpfs rw,nosuid,size=10240k,nr_inodes=486250,mode=755 /dev devtmpfs devtmpfs rw,nosuid,size=10240k,nr_inodes=486250
├─/dev/pts devpts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 ├─/dev/pts devpts devpts rw,nosuid,noexec,relatime,gid=5,ptmxmod
├─/dev/shm tmpfs tmpfs rw ├─/dev/shm tmpfs tmpfs rw
└─/dev/mqueue mqueue mqueue rw,nosuid,nodev,noexec,relatime └─/dev/mqueue mqueue mqueue rw,nosuid,nodev,noexec,relatime
├─/home /dev/sda3 ext4 rw,nosuid,nodev,relatime,data=ordered /home /dev/sda3 ext4 rw,nosuid,nodev,relatime,data=ordered
├─/run tmpfs tmpfs rw,nosuid,nodev,noexec,mode=755 /run tmpfs tmpfs rw,nosuid,nodev,noexec,mode=755
└─/tmp tmpfs tmpfs rw,nosuid,nodev,noexec,relatime /tmp tmpfs tmpfs rw,nosuid,nodev,noexec,relatime
``` ```
</div> </div>

View file

@ -63,8 +63,9 @@ Si vous n'avez pas de partition à disposition, vous pouvez utiliser un `tmpfs`
Placez ensuite dans cette nouvelle racine le système de votre choix. Placez ensuite dans cette nouvelle racine le système de votre choix.
::::: {.exercice}
### Exercice : Changer de racine -- `myswitch_root.sh` ### Changer de racine -- `myswitch_root.sh`
Voici les grandes étapes du changement de racine : Voici les grandes étapes du changement de racine :
@ -150,3 +151,5 @@ par :
42sh# exec chroot / command 42sh# exec chroot / command
``` ```
</div> </div>
:::::

View file

@ -4,11 +4,11 @@ Je vous recommande la lecture du *man* `namespaces(7)` introduisant et
énumérant les *namespaces*. énumérant les *namespaces*.
Pour tout connaître en détails, [la série d'articles de Michael Kerrisk sur les Pour tout connaître en détails, [la série d'articles de Michael Kerrisk sur les
*namespaces*](https://lwn.net/Articles/531114/) est excellente ! Auquel il faut *namespaces*](https://lwn.net/Articles/531114/)[^lwnns1] est excellente ! Auquel il faut
ajouter [l'article sur le plus récent `cgroup` ajouter [l'article sur le plus récent `cgroup`
*namespace*](https://lwn.net/Articles/621006/) et [le petit dernier sur le *namespace*](https://lwn.net/Articles/621006/)[^lwnns2] et [le petit dernier sur le
*namespace* `time`](https://lwn.net/Articles/766089/). *namespace* `time`](https://lwn.net/Articles/766089/)[^lwnns3].
[Cet article de Michael Crosby montrant l'utilisation de clone(2)](https://web.archive.org/web/20190206073558/http://crosbymichael.com/creating-containers-part-1.html) [^lwnns1]: <https://lwn.net/Articles/531114/>
est également des plus intéressants, pour ce qui concerne la programmation [^lwnns2]: <https://lwn.net/Articles/621006/>
plus bas-niveau. [^lwnns3]: <https://lwn.net/Articles/766089/>

View file

@ -234,8 +234,11 @@ Pour construire une nouvelle interface de ce type :
Pour approfondir les différentes techniques de routage, je vous Pour approfondir les différentes techniques de routage, je vous
recommande cet article : recommande cet article :
[Linux Containers and Networking](https://blog.flameeyes.eu/2010/09/linux-containers-and-networking). [Linux Containers and Networking](https://blog.flameeyes.eu/2010/09/linux-containers-and-networking)[^netnsmore1].
Appliqué à Docker, vous apprécierez cet article : [Understanding Docker Appliqué à Docker, vous apprécierez cet article : [Understanding Docker
Networking Drivers and their use Networking Drivers and their use
cases](https://www.docker.com/blog/understanding-docker-networking-drivers-use-cases/). cases](https://www.docker.com/blog/understanding-docker-networking-drivers-use-cases/)[^netnsmore2].
[^netnsmore1]: <https://blog.flameeyes.eu/2010/09/linux-containers-and-networking>
[^netnsmore2]: <https://www.docker.com/blog/understanding-docker-networking-drivers-use-cases/>

View file

@ -81,8 +81,10 @@ La sécurité du *namespace* `user` a souvent été remise en cause par le pass
on lui attribue de nombreuses vulnérabilités. Vous devriez notamment consulter on lui attribue de nombreuses vulnérabilités. Vous devriez notamment consulter
à ce sujet : à ce sujet :
* [Security Implications of User Namespaces](https://blog.araj.me/security-implications-of-user-namespaces/) ; * [Security Implications of User Namespaces](https://blog.araj.me/security-implications-of-user-namespaces/) :\
* [Anatomy of a user namespaces vulnerability](https://lwn.net/Articles/543273/) ; <https://blog.araj.me/security-implications-of-user-namespaces/> ;
* [Anatomy of a user namespaces vulnerability](https://lwn.net/Articles/543273/) :\
<https://lwn.net/Articles/543273/> ;
* <http://marc.info/?l=linux-kernel&m=135543612731939&w=2> ; * <http://marc.info/?l=linux-kernel&m=135543612731939&w=2> ;
* <http://marc.info/?l=linux-kernel&m=135545831607095&w=2>. * <http://marc.info/?l=linux-kernel&m=135545831607095&w=2>.

View file

@ -21,6 +21,17 @@ function Div(el)
el.content, el.content,
pandoc.RawBlock("latex", "\\end{codebox}")) pandoc.RawBlock("latex", "\\end{codebox}"))
elseif el.classes[1] == "exercice"
then
-- insert element in front
table.insert(
el.content, 1,
pandoc.RawBlock("latex", "\\noindent\\begin{exercicebox}"))
-- insert element at the back
table.insert(
el.content,
pandoc.RawBlock("latex", "\\end{exercicebox}"))
elseif el.classes[1] == "question" elseif el.classes[1] == "question"
then then
-- insert element in front -- insert element in front

View file

@ -69,7 +69,7 @@ docker run --rm -p 8080:8080 localhost:5000/youp0m
``` ```
</div> </div>
::::: {.more} ::::: {.question}
On notera que ceci est possible exclusivement parce que le registre On notera que ceci est possible exclusivement parce que le registre
`localhost:5000` est considéré non-sûr par défaut. C'est à dire qu'il n'a pas `localhost:5000` est considéré non-sûr par défaut. C'est à dire qu'il n'a pas
besoin de certificat TLS sur sa connexion HTTP pour être utilisé.\ besoin de certificat TLS sur sa connexion HTTP pour être utilisé.\

View file

@ -33,7 +33,7 @@ Dans un premier temps, nous allons nous contenter de publier un binaire associé
### Installation et configuration ### Installation et configuration
Allez c'est parti ! première chose à faire : installer et configurer Aller c'est parti ! première chose à faire : installer et configurer
[Gitea](https://gitea.io/) (ceux qui le souhaitent peuvent choisir [Gitea](https://gitea.io/) (ceux qui le souhaitent peuvent choisir
[gitlab](https://gitlab.org/) ou une autre plate-forme, mais la suite sera [gitlab](https://gitlab.org/) ou une autre plate-forme, mais la suite sera
moins guidée). moins guidée).

View file

@ -116,14 +116,14 @@ Dans ce dernier exemple, nous n'avons pas besoin de préciser l'hôte, car
dans notre conteneur `mytsdb`, il s'agit bien du conteneur où s'exécute dans notre conteneur `mytsdb`, il s'agit bien du conteneur où s'exécute
localement `influxdb`. localement `influxdb`.
::::: {.exercice}
#### Exercice {-}
Ajoutez à la ligne de commande de lancement du conteneur les bon(s) volume(s) Ajoutez à la ligne de commande de lancement du conteneur les bon(s) volume(s)
qui permettront de ne pas perdre les données d'influxDB si nous devions qui permettront de ne pas perdre les données d'influxDB si nous devions
redémarrer le conteneur. Aidez-vous pour cela de la [documentation du redémarrer le conteneur. Aidez-vous pour cela de la [documentation du
conteneur](https://hub.docker.com/_/influxdb). conteneur](https://hub.docker.com/_/influxdb).
:::::
### Collecter les données locales ### Collecter les données locales
@ -192,11 +192,10 @@ system
La nouvelle base a donc bien été créée et tant que nous laissons *Telegraf* La nouvelle base a donc bien été créée et tant que nous laissons *Telegraf*
lancé, celui-ci va régulièrement envoyer des métriques de cette machine. lancé, celui-ci va régulièrement envoyer des métriques de cette machine.
::::: {.exercice}
### Afficher les données collectées ### Afficher les données collectées
#### Exercice {-}
À vous de jouer pour lancer le conteneur À vous de jouer pour lancer le conteneur
[*Chronograf*](https://store.docker.com/images/chronograf). [*Chronograf*](https://store.docker.com/images/chronograf).
@ -214,4 +213,6 @@ ceux ci-après:
::::: :::::
:::::
![Résultat obtenu](chronograf_latest.png) ![Résultat obtenu](chronograf_latest.png)

View file

@ -1,5 +1,4 @@
Exercice {-} ::::: {.exercice}
--------
Pour mettre en pratiques toutes les notions que l'on a vu jusque là, écrivez un Pour mettre en pratiques toutes les notions que l'on a vu jusque là, écrivez un
script `mycloud-run.sh` pour automatiser le lancement de votre instance script `mycloud-run.sh` pour automatiser le lancement de votre instance
@ -45,3 +44,5 @@ http://localhost:12345/
http://localhost:12345/ http://localhost:12345/
``` ```
</div> </div>
:::::

View file

@ -1,4 +1,4 @@
## Exercice {-} ::::: {.exercice}
À vous maintenant de connecter une instance de `nemunaire/fic-admin` à sa base À vous maintenant de connecter une instance de `nemunaire/fic-admin` à sa base
de données. de données.
@ -42,3 +42,5 @@ http://localhost:12345/
http://localhost:12345/ http://localhost:12345/
``` ```
</div> </div>
:::::

View file

@ -217,7 +217,7 @@ une interface `virtual ethernet` :
</div> </div>
## Exercice {-} ::::: {.exercice}
Réalisez une recette `vault.yml` démarrant une instance du gestionnaire de Réalisez une recette `vault.yml` démarrant une instance du gestionnaire de
secrets [Hashicorp Vault](https://www.vaultproject.io/), utilisant une [base de secrets [Hashicorp Vault](https://www.vaultproject.io/), utilisant une [base de
@ -241,3 +241,5 @@ conteneurs, sans quoi vos conteneurs risquent d'être tués prématurément.
En bonus, vous pouvez gérer la [persistance des En bonus, vous pouvez gérer la [persistance des
données](https://github.com/linuxkit/linuxkit/blob/master/examples/swap.yml) données](https://github.com/linuxkit/linuxkit/blob/master/examples/swap.yml)
stockées dans Vault. stockées dans Vault.
:::::

View file

@ -160,7 +160,7 @@ Hello from Docker!
</div> </div>
## Exercice {-} ::::: {.exercice}
Réalisez un script pour automatiser l'ensemble de ces étapes : Réalisez un script pour automatiser l'ensemble de ces étapes :
@ -189,3 +189,5 @@ similaire au driver `vfs` : en extrayant chaque tarball l'une au dessus de
l'autre, en essayant de gérer les *whiteout files*. Ou bien en suivant le l'autre, en essayant de gérer les *whiteout files*. Ou bien en suivant le
driver `overlayfs`, en montant un système de fichier à chaque couche (dans ce driver `overlayfs`, en montant un système de fichier à chaque couche (dans ce
cas, votre script devra être lancé en `root`). cas, votre script devra être lancé en `root`).
:::::

View file

@ -124,8 +124,7 @@ ajouter un élément à cette liste, demandant de *bind* :
``` ```
</div> </div>
::::: {.exercice}
## Exercice {-}
À vous maintenant d'éditer votre `config.json`, pour lancer le service youp0m. À vous maintenant d'éditer votre `config.json`, pour lancer le service youp0m.
@ -146,3 +145,5 @@ Pour cette étape, Considérez que vous avez réussi si vous voyez s'afficher :
> `Ready, listening on :8080` > `Ready, listening on :8080`
On ne pourra pas tester davantage sans avoir du réseau dans notre conteneur. On ne pourra pas tester davantage sans avoir du réseau dans notre conteneur.
:::::

View file

@ -1,4 +1,4 @@
## Exercice {-} ::::: {.exercice}
Déterminez le nombre de vulnérabilités dans les principales images officielles Déterminez le nombre de vulnérabilités dans les principales images officielles
du [Docker Hub](https://hub.docker.com/explore). du [Docker Hub](https://hub.docker.com/explore).
@ -9,3 +9,5 @@ contenant les vulnérabilités les plus inquiétantes. Vous placerez ce rapport
dans un fichier `${IMAGE}:${TAG}.html` ou `${IMAGE}:${TAG}.txt`. dans un fichier `${IMAGE}:${TAG}.html` ou `${IMAGE}:${TAG}.txt`.
Veillez à utiliser une image __différente__ de `mysql`, utilisée en exemple. Veillez à utiliser une image __différente__ de `mysql`, utilisée en exemple.
:::::

View file

@ -133,6 +133,8 @@ Dans un autre terminal, lançons un `docker container ls`, pour consulter la col
Rendez-vous ensuite dans votre navigateur sur <http://localhost:49153/>. Rendez-vous ensuite dans votre navigateur sur <http://localhost:49153/>.
:::::: {.exercice}
#### À vous de jouer {-} #### À vous de jouer {-}
Utilisez l'instruction `COPY`{.dockerfile} pour afficher votre propre Utilisez l'instruction `COPY`{.dockerfile} pour afficher votre propre
@ -140,6 +142,7 @@ Utilisez l'instruction `COPY`{.dockerfile} pour afficher votre propre
d'inspiration, utilisez [cette page de compte à d'inspiration, utilisez [cette page de compte à
rebours](https://virli.nemunai.re/countdown.html).--> rebours](https://virli.nemunai.re/countdown.html).-->
:::::
### Les caches ### Les caches
@ -307,7 +310,7 @@ Consultez <https://docs.docker.com/engine/reference/builder/> pour la liste
complète des instructions reconnues. complète des instructions reconnues.
### Exercice {-} ::::: {.exercice}
Pour mettre en application tout ce que nous venons de voir, réalisons le Pour mettre en application tout ce que nous venons de voir, réalisons le
`Dockerfile` du service web [`youp0m`](https://you.p0m.fr/) que nous avons `Dockerfile` du service web [`youp0m`](https://you.p0m.fr/) que nous avons
@ -329,3 +332,5 @@ WORKDIR /go/src/git.nemunai.re/youp0m
RUN go build -tags dev -v RUN go build -tags dev -v
``` ```
</div> </div>
:::::

View file

@ -70,6 +70,7 @@ possibilité de le surcharger au moyen d'un argument :
``` ```
</div> </div>
::::: {.exerice}
## Personnalisation basique ## Personnalisation basique
@ -100,6 +101,7 @@ Pour améliorer la situation, définissez
l'[`ENTRYPOINT`{.dockerfile}](https://docs.docker.com/engine/reference/builder/#entrypoint) l'[`ENTRYPOINT`{.dockerfile}](https://docs.docker.com/engine/reference/builder/#entrypoint)
de votre image sur le binaire `/srv/youp0m`. de votre image sur le binaire `/srv/youp0m`.
:::::
## Point d'entrée avancé ## Point d'entrée avancé
@ -162,8 +164,7 @@ pouvons obtenir un fichier valide avec :
Il faut ensuite passer le chemin du fichier créé sur la ligne de commande grâce Il faut ensuite passer le chemin du fichier créé sur la ligne de commande grâce
à l'option `-htpasswd`. à l'option `-htpasswd`.
::::: {.exercice}
### Exercice {-}
Écrivez un script d'`ENTRYPOINT`{.dockerfile}, analysant les variables Écrivez un script d'`ENTRYPOINT`{.dockerfile}, analysant les variables
d'environnement, à la recherche de `YOUP0M_USERNAME` et `YOUP0M_PASSWORD` pour d'environnement, à la recherche de `YOUP0M_USERNAME` et `YOUP0M_PASSWORD` pour
@ -184,3 +185,5 @@ You are not allowed to perform this request.
<!DOCTYPE html> <!DOCTYPE html>
``` ```
</div> </div>
:::::

View file

@ -51,11 +51,14 @@ docker buildx build .
``` ```
</div> </div>
::::: {.more}
Nous ne rentrerons pas plus dans les détails de cette nouvelle commande, mais Nous ne rentrerons pas plus dans les détails de cette nouvelle commande, mais
sachez qu'on la retrouve particulièrement fréquemment dans les *GitHub sachez qu'on la retrouve particulièrement fréquemment dans les *GitHub
Actions* :\ Actions* :\
<https://github.com/marketplace/actions/docker-setup-buildx> <https://github.com/marketplace/actions/docker-setup-buildx>
:::::
#### Changer la syntaxe de nos `Dockerfile`\ #### Changer la syntaxe de nos `Dockerfile`\
@ -113,13 +116,13 @@ ou 1.3 (expérimentale).
Les ajouts par rapport à la syntaxe usuelle sont répertoriés sur cette page :\ Les ajouts par rapport à la syntaxe usuelle sont répertoriés sur cette page :\
<https://hub.docker.com/r/docker/dockerfile>. <https://hub.docker.com/r/docker/dockerfile>.
::::: {.exercice}
### Exercice {-}
Faites en sorte que le `Dockerfile` que vous avez créé pour `youp0m` indique un Faites en sorte que le `Dockerfile` que vous avez créé pour `youp0m` indique un
*frontend* BuildKit à utiliser, tout en restant compatible avec la syntaxe du *frontend* BuildKit à utiliser, tout en restant compatible avec la syntaxe du
`docker build` classique. `docker build` classique.
:::::
### Des images sans Docker ### Des images sans Docker
@ -127,7 +130,7 @@ Il est aussi possible de se passer complètement de Docker. La plupart des
outils qui sont capables de générer des images de machines virtuelles, sont outils qui sont capables de générer des images de machines virtuelles, sont
aussi capable de générer des images Docker. Citons notamment : aussi capable de générer des images Docker. Citons notamment :
- [Hashicorp Packer](https://www.packer.io/docs/builders/docker) - [Hashicorp Packer](https://www.packer.io/docs/builders/docker),
- [Nix et Guix](https://nix.dev/tutorials/building-and-running-docker-images) - [Nix et Guix](https://nix.dev/tutorials/building-and-running-docker-images),
- [Kubler](https://github.com/edannenberg/kubler) - [Kubler](https://github.com/edannenberg/kubler),
- et bien d'autres. - et bien d'autres.

View file

@ -5,8 +5,8 @@
spread sidewards,fuzzy halo=1mm with ForestGreen!50!black} spread sidewards,fuzzy halo=1mm with ForestGreen!50!black}
\newtcolorbox{alertbox}[1][]{breakable,enhanced, \newtcolorbox{alertbox}[1][]{breakable,enhanced,
before skip balanced=2mm,after skip balanced=3mm, before=\hspace{.7em},after=\hspace{.5em},
tile,left=11mm,right=2mm,top=1mm,bottom=1mm, tile,left=11mm,right=2mm,top=.5em,bottom=.5em,
colback=white!0, colback=white!0,
sharp corners, sharp corners,
colback=lightgray!20!white, colback=lightgray!20!white,
@ -15,8 +15,8 @@
},#1} },#1}
\newtcolorbox{codebox}[1][]{breakable,enhanced, \newtcolorbox{codebox}[1][]{breakable,enhanced,
before skip balanced=2mm,after skip balanced=3mm, before=\hspace{.7em},after=\hspace{.5em},
tile,left=11mm,right=2mm,top=1mm,bottom=1mm, tile,left=11mm,right=2mm,top=.5em,bottom=.5em,
colback=white!0, colback=white!0,
sharp corners, sharp corners,
colback=lightgray!20!white, colback=lightgray!20!white,
@ -24,9 +24,33 @@
\path[fill=black,draw=none] (interior.south west) rectangle node[white]{\huge\bfseries\texttt >\_} ([xshift=10mm]interior.north west); \path[fill=black,draw=none] (interior.south west) rectangle node[white]{\huge\bfseries\texttt >\_} ([xshift=10mm]interior.north west);
},#1} },#1}
\usetikzlibrary{calc}
\newtcolorbox{exercicebox}[1][parbox=false]{breakable,enhanced,
before=\hspace{.7em},after=\hspace{.5em},
tile,left=2mm,right=12mm,top=.5em,bottom=.5em,
frame code={\path[draw=Gold!85!gray,sharp corners,line width=2.5pt] (frame.north west) -- (frame.north) -- (frame.north east);}
sharp corners,
colback=white,
underlay={%
\path[fill=Gold!85!gray,draw=none] (interior.south east) rectangle node[white]{\begin{tikzpicture}
\draw[fill=white,even odd rule]
let
\n{dpt} = {360/7}
in
(0,0) circle (1.2mm) %
({\n{dpt}*(0.5)}:2.5mm) \foreach \x in {1,...,7}{ %
arc ({\n{dpt}*(\x-0.5)}:{\n{dpt}*(\x-0.25)}:2.5mm) %
--++(\x*\n{dpt}:1.5mm) %
arc ({\n{dpt}*(\x-0.25)}:{\n{dpt}*(\x+0.25)}:2.5mm) %
--++(\x*\n{dpt}:-1.5mm) %
arc ({\n{dpt}*(\x+0.25)}:{\n{dpt}*(\x+0.5)}:2.5mm)--%
({\n{dpt}*(\x+0.5)}:2.5mm)
};\end{tikzpicture}} ([xshift=-10mm]interior.north east);
},#1}
\newtcolorbox{questionbox}[1][]{breakable,enhanced, \newtcolorbox{questionbox}[1][]{breakable,enhanced,
before skip balanced=2mm,after skip balanced=3mm, before=\hspace{.7em},after=\hspace{.5em},
tile,left=11mm,right=2mm,top=1mm,bottom=1mm, tile,left=11mm,right=2mm,top=.5em,bottom=.5em,
colback=white!0, colback=white!0,
sharp corners, sharp corners,
colback=lightgray!20!white, colback=lightgray!20!white,
@ -35,8 +59,8 @@
},#1} },#1}
\newtcolorbox{morebox}[1][]{breakable,enhanced, \newtcolorbox{morebox}[1][]{breakable,enhanced,
before skip balanced=2mm,after skip balanced=3mm, before=\hspace{.2em},after=\hspace{.15em},
tile,left=7mm,right=7mm,top=1mm,bottom=1mm, tile,left=7mm,right=7mm,top=.5em,bottom=.5em,
colback=white!0, colback=white!0,
sharp corners, sharp corners,
colback=lightgray!20!white, colback=lightgray!20!white,