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

View file

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

View file

@ -79,10 +79,10 @@ l'une de ces trois situations :
```
</div>
::::: {.question}
Avant d'aller plus loin, notez que les exemples seront donnés pour les deux
versions des `cgroup`s à chaque fois.
::::: {.question}
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è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
dans les autres *cgroup*s).
::::: {.question}
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
le système de fichier est entièrement simulé et que certains comportements sont
adaptés.
:::::
### Consultation de l'état
@ -233,7 +237,9 @@ echo 0 > /sys/fs/cgroup/virli/cgroup.freeze # v2
</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
données des statistiques issues des *cgroup*s, tel `telegraf`.
@ -266,7 +272,6 @@ mémoire.
```
</div>
::::: {.question}
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
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.
- `prog [args [...]]` est la commande que l'on souhaite monitorer, à exécuter
dans le *cgroup*.
:::::
::::: {.warning}
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.
:::::
:::::
### Fixer des limites {#Fixer-des-limites}
@ -357,5 +362,8 @@ limites que vous avez définies :
### Pour aller plus loin {-}
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
article sur la version 2](https://lwn.net/Articles/679786/).
Control groups](https://lwn.net/Articles/604609/)[^lwncgroups] est excellente !
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) {-}
É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
```
</div>
:::::

View file

@ -1,8 +1,6 @@
Prérequis
---------
### Noyau Linux
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
plus être compilé avec les options suivantes (lorsqu'elles sont disponibles
@ -29,10 +27,18 @@ General setup --->
```
</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,
chaque noyau Linux peut être entièrement personnalisé en fonction des options
et des pilotes que l'on voudra utiliser.
@ -50,7 +56,7 @@ make menuconfig
</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
configuration ayant servi à compiler le noyau et ses modules dans le dossier
@ -80,22 +86,10 @@ CONFIG_CGROUP_NET_CLASSID=y
</div>
#### Vérification via `/proc/config.gz`\
### Vérification via `/proc/config.gz`
Dans la plupart des autres distributions, la configuration est accessible à
travers le fichier `/proc/config.gz`. Comme vous ne pouvez pas écrire dans
`/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.
### 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 ?
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.
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
killer ne passe.
Jetez un œil à [cet article parru sur LWN](https://lwn.net/Articles/590960/) à
ce sujet.
Jetez un œil à [cet article paru sur LWN](https://lwn.net/Articles/590960/) à
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
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
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`.
#### Consultation et modification\
### Consultation et modification
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 !
### Exercices
::::: {.exercice}
#### `procinfo`\
@ -158,7 +158,7 @@ Remaining time: N/A
```
</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>.
@ -243,7 +243,7 @@ Voici un exemple d'utilisation :
Vous aurez besoin de définir une alarme au niveau de votre RTC, via le
fichier :\
`/sys/class/rtc/rtcX/wakealarm`
`/sys/class/rtc/rtcX/wakealarm`\
::::: {.warning}
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.
:::::
::::: {.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/>
:::::

View file

@ -77,7 +77,7 @@ seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog);
</div>
### Exercice {-}
::::: {.exercice}
É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>
Dans cet exemple, l'appel système filtré est `nanosleep(2)`.
:::::