From 5b03f090fe4c7bf9b44827a47aa6d1c86119773e Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Tue, 6 Nov 2018 14:44:59 +0100 Subject: [PATCH] Update 2018 --- tutorial/4/Makefile | 2 +- tutorial/4/lesson.md | 2 +- tutorial/{3 => 4}/mount.md | 4 +-- tutorial/4/namespaces.md | 72 +++++++++++++++++++------------------- tutorial/4/networkns.md | 8 ++--- tutorial/4/pidns.md | 12 +++---- tutorial/4/rendu.md | 9 ++--- tutorial/4/setup.md | 2 +- tutorial/4/tutorial.md | 4 +-- tutorial/4/userns.md | 9 +++-- 10 files changed, 62 insertions(+), 62 deletions(-) rename tutorial/{3 => 4}/mount.md (98%) diff --git a/tutorial/4/Makefile b/tutorial/4/Makefile index 467a384..7f92ebd 100644 --- a/tutorial/4/Makefile +++ b/tutorial/4/Makefile @@ -1,5 +1,5 @@ SOURCES_TUTO = tutorial.md setup.md cmpns.md docker-exec.md mountns.md rendu.md -SOURCES_LESSON = lesson.md namespaces.md networkns.md pidns.md userns.md +SOURCES_LESSON = lesson.md mount.md namespaces.md networkns.md pidns.md userns.md PANDOCOPTS = --latex-engine=xelatex \ --standalone \ diff --git a/tutorial/4/lesson.md b/tutorial/4/lesson.md index e2f18e8..2e3dd5e 100644 --- a/tutorial/4/lesson.md +++ b/tutorial/4/lesson.md @@ -3,7 +3,7 @@ title: Virtualisation légère -- Linux Internals partie 2 subtitle: Support de cours author: Pierre-Olivier *nemunaire* Mercier institute: EPITA -date: Jeudi 2 novembre 2017 +date: Mercredi 7 novembre 2018 ... Le but de cette seconde partie sur les mécanismes internes du noyau va nous diff --git a/tutorial/3/mount.md b/tutorial/4/mount.md similarity index 98% rename from tutorial/3/mount.md rename to tutorial/4/mount.md index 2712780..c47c352 100644 --- a/tutorial/3/mount.md +++ b/tutorial/4/mount.md @@ -124,12 +124,12 @@ sein d'un système de fichiers attaché à plusieurs endroits. ### partagé -- *shared mount* -Dans une montage partagé, une nouvelle accroche sera propagée parmi tous les +Dans un montage partagé, une nouvelle accroche sera propagée parmi tous les systèmes de fichiers de ce partage (on parle de *peer group*).
```shell - # Création de nos répertoires de travail + # Création de notre répertoire de travail mkdir /mnt/test-shared # On s'assure que le dossier que l'on va utiliser pour nos tests utilise bien la politique shared diff --git a/tutorial/4/namespaces.md b/tutorial/4/namespaces.md index 9eba000..8f58b78 100644 --- a/tutorial/4/namespaces.md +++ b/tutorial/4/namespaces.md @@ -19,7 +19,7 @@ ne sont pas encore *containerisables* : [le document fondateur](https://www.kernel.org/doc/ols/2006/ols2006v1-pages-101-112.pdf) parle ainsi d'isoler les périphériques, ou encore l'horloge. Pour ce dernier, -[un patch a même déjà été proposé](https://lwn.net/Articles/179825/). +[un patch a même déjà été proposé](https://lwn.net/Articles/766089/). ### L'espace de noms `mount` {#mount-ns} @@ -194,17 +194,17 @@ similaire à :
```c -#include + #include -#define STACKSIZE (1024*1024) -static char child_stack[STACKSIZE]; + #define STACKSIZE (1024*1024) + static char child_stack[STACKSIZE]; -int clone_flags = CLONE_CGROUP | CLONE_NEWNET | SIGCHLD; + int clone_flags = CLONE_CGROUP | CLONE_NEWNET | SIGCHLD; -pid_t pid = clone(do_execvp, - child_stack + STACKSIZE, - clone_flags, - &args); + pid_t pid = clone(do_execvp, + child_stack + STACKSIZE, + clone_flags, + &args); ```
@@ -220,33 +220,33 @@ auquel on passe le *file descriptor* d'un des liens du dossier
```c -#define _GNU_SOURCE -#include -#include -#include + #define _GNU_SOURCE + #include + #include + #include -// ./a.out /proc/PID/ns/FILE cmd args... + // ./a.out /proc/PID/ns/FILE cmd args... -int main(int argc, char *argv[]) -{ - int fd = open(argv[1], O_RDONLY); - if (fd == -1) - { - perror("open"); + int main(int argc, char *argv[]) + { + int fd = open(argv[1], O_RDONLY); + if (fd == -1) + { + perror("open"); + return EXIT_FAILURE; + } + + if (setns(fd, 0) == -1) + { + perror("setns"); + return EXIT_FAILURE; + } + + execvp(argv[2], &argv[2]); + + perror("execve"); return EXIT_FAILURE; - } - - if (setns(fd, 0) == -1) - { - perror("setns"); - return EXIT_FAILURE; - } - - execvp(argv[2], &argv[2]); - - perror("execve"); - return EXIT_FAILURE; -} + } ```
@@ -254,7 +254,7 @@ Dans un shell, on utilisera la commande `nsenter(1)` :
```shell -42sh# nsenter --uts=/proc/42/ns/uts /bin/bash + 42sh# nsenter --uts=/proc/42/ns/uts /bin/bash ```
@@ -276,8 +276,8 @@ persister après le dernier processus), on peut utiliser un `mount bind` :
```shell -42sh# touch /tmp/ns/myrefns -42sh# mount --bind /proc//ns/mount /tmp/ns/myrefns + 42sh# touch /tmp/ns/myrefns + 42sh# mount --bind /proc//ns/mount /tmp/ns/myrefns ```
diff --git a/tutorial/4/networkns.md b/tutorial/4/networkns.md index 2ae874f..56b107d 100644 --- a/tutorial/4/networkns.md +++ b/tutorial/4/networkns.md @@ -14,9 +14,9 @@ environnement qui n'a plus qu'une interface de *loopback* :
```shell -42sh# unshare -n ip a -1: lo: mtu 65536 qdisc noop state DOWN group default qlen 1 - link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + 42sh# unshare -n ip a + 1: lo: mtu 65536 qdisc noop state DOWN group default qlen 1 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 ```
@@ -153,7 +153,7 @@ gourmande. ### VLAN -Il est possible d'attribuer juste une interface de VLAN, si l'on a switch +Il est possible d'attribuer juste une interface de VLAN, si l'on a un switch supportant la technologie [802.1q](https://fr.wikipedia.org/wiki/IEEE_802.1Q).
diff --git a/tutorial/4/pidns.md b/tutorial/4/pidns.md index dc63209..b7d7515 100644 --- a/tutorial/4/pidns.md +++ b/tutorial/4/pidns.md @@ -11,11 +11,11 @@ comme l'`init`. Contrairement aux autres *namespaces* où l'on peut demander à se séparer du *namespace* en question à n'importe quel moment de l'exécution du processus, -via `unshare(2)` ou `setns(2)` par exemple, ici, le changement n'est valable +via `unshare(2)` ou `setns(2)` par exemple, ici, le changement ne sera valable qu'après le prochain `fork(2)` (ou similaire). -L'espace de noms PID du processus courant n'est pas changé, afin que le -processus ne change pas de PID en cours de route (puisque fonction du -*namespace* dans lequel il se trouve). +En effet, l'espace de noms n'est pas changé, afin que le processus ne change +pas de PID en cours de route, puisqu'il dépend du *namespace* dans lequel il se +trouve. ## Isolons ! @@ -65,12 +65,12 @@ Cette fois, `top` et `ps` nous rapportent bien que l'on est seul dans notre ## Arborescence à l'extérieur du *namespace* Lors de notre première tentative de `top`, lorsque `/proc` était encore monté -sur le `procfs` de l'espace de noms initial : votre processus (au PID 1 dans +sur le `procfs` de l'espace de noms initial : notre processus (au PID 1 dans son nouveau *namespace*) était présent dans l'arborescence de l'espace initial avec un PID dans la continuité des autres processus, étonnant ! En fait, l'isolation consiste en une virtualisation des numéros du processus : -la plupart des processus du système intial ne sont pas accessibles, et ceux qui +la plupart des processus du système initial ne sont pas accessibles, et ceux qui font partie de l'espace de noms créé disposent d'une nouvelle numérotation. Et c'est cette nouvelle numérotation qui est montrée au processus. diff --git a/tutorial/4/rendu.md b/tutorial/4/rendu.md index fa6b4ae..8fb9891 100644 --- a/tutorial/4/rendu.md +++ b/tutorial/4/rendu.md @@ -26,9 +26,6 @@ sera pas pris en compte. Par ailleurs, n'oubliez pas de répondre à [l'évaluation du cours](https://www.epitaf.fr/moodle/mod/quiz/view.php?id=42). -Afin de m'aider à améliorer ce cours, je vous invite à remplir -[ce sondage anonyme](https://www.epitaf.fr/moodle/mod/quiz/view.php?id=44). - Tarball ------- @@ -40,8 +37,8 @@ Voici une arborescence type :
``` -login_x-TP4/cmpns.sh -login_x-TP4/mydocker_exec.sh -login_x-TP4/myswitch_root.sh + login_x-TP4/cmpns.sh + login_x-TP4/mydocker_exec.sh + login_x-TP4/myswitch_root.sh ```
diff --git a/tutorial/4/setup.md b/tutorial/4/setup.md index c4f0e8a..16f5fb2 100644 --- a/tutorial/4/setup.md +++ b/tutorial/4/setup.md @@ -63,7 +63,7 @@ Nous allons utiliser des programmes issus des [`procps-ng`](https://gitlab.com/procps-ng/procps) ainsi que ceux de la [`libcap`](http://www.friedhoff.org/posixfilecaps.html). -Sous Debian et ses dérivés, ses paquets sont respectivement : +Sous Debian et ses dérivés, ces paquets sont respectivement : * `util-linux` * `procps` diff --git a/tutorial/4/tutorial.md b/tutorial/4/tutorial.md index b45ea35..392e69d 100644 --- a/tutorial/4/tutorial.md +++ b/tutorial/4/tutorial.md @@ -3,7 +3,7 @@ title: Virtualisation légère -- TP n^o^ 4 subtitle: Linux Internals partie 2 author: Pierre-Olivier *nemunaire* Mercier institute: EPITA -date: Jeudi 2 novembre 2017 +date: Mercredi 7 novembre 2018 ... Le but de ce second TP sur les mécanismes internes du noyau va nous permettre @@ -11,7 +11,7 @@ d'utiliser les commandes et les appels systèmes relatifs aux *namespaces* ainsi que d'appréhender la complexité des systèmes de fichiers. Tous les exercices de ce TP sont à rendre à au plus tard le -jeudi 9 novembre 2017 à 8 h 42. +mercredi 14 novembre 2017 à 12 h 42. En tant que personnes sensibilisées à la sécurité des échanges électroniques, vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à diff --git a/tutorial/4/userns.md b/tutorial/4/userns.md index 0075795..b97776f 100644 --- a/tutorial/4/userns.md +++ b/tutorial/4/userns.md @@ -34,13 +34,16 @@ garder dans le nouvel espace, que les utilisateurs et les groupes utiles au processus, en les renumérotant au passage si besoin. -### L'utilisateur -1 : *nobody* +### L'utilisateur -2 : *nobody* Lorsque l'on arrive dans un nouvel espace, aucun utilisateur ni groupe n'est défini. Dans cette situation, tous les identifiants d'utilisateur et de groupe, -renvoyés par le noyau sont à -1 ; valeur qui correspond en toute circonstance à +renvoyés par le noyau sont à -2 ; valeur qui correspond par convention à l'utilisateur *nobody* et au groupe *nogroup*. +-1 étant réservé pour indiqué une erreur dans le retour d'une commande, ou la +non-modification d'un paramètres passé en argument d'une fonction. + ### `uid_map` et `gid_map` @@ -56,7 +59,7 @@ Sur chaque ligne, on doit indiquer : en question. - L'identifiant marquant le début de la plage d'utilisateurs, pour le processus affichant le fichier. -- La taille de la page. +- La taille de la plage. Par exemple, le *namespace* `user` initial défini la correspondance suivante :