Update 2018

This commit is contained in:
nemunaire 2018-11-06 14:44:59 +01:00
commit 5b03f090fe
10 changed files with 64 additions and 64 deletions

View file

@ -1,5 +1,5 @@
SOURCES_TUTO = tutorial.md setup.md cmpns.md docker-exec.md mountns.md rendu.md 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 \ PANDOCOPTS = --latex-engine=xelatex \
--standalone \ --standalone \

View file

@ -3,7 +3,7 @@ title: Virtualisation légère -- Linux Internals partie 2
subtitle: Support de cours subtitle: Support de cours
author: Pierre-Olivier *nemunaire* Mercier author: Pierre-Olivier *nemunaire* Mercier
institute: EPITA 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 Le but de cette seconde partie sur les mécanismes internes du noyau va nous

View file

@ -124,12 +124,12 @@ sein d'un système de fichiers attaché à plusieurs endroits.
### partagé -- *shared mount* ### 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*). systèmes de fichiers de ce partage (on parle de *peer group*).
<div lang="en-US"> <div lang="en-US">
```shell ```shell
# Création de nos répertoires de travail # Création de notre répertoire de travail
mkdir /mnt/test-shared mkdir /mnt/test-shared
# On s'assure que le dossier que l'on va utiliser pour nos tests utilise bien la politique shared # On s'assure que le dossier que l'on va utiliser pour nos tests utilise bien la politique shared

View file

@ -19,7 +19,7 @@ ne sont pas encore *containerisables* :
[le document fondateur](https://www.kernel.org/doc/ols/2006/ols2006v1-pages-101-112.pdf) [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 parle ainsi d'isoler les périphériques, ou encore l'horloge. Pour ce
dernier, 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} ### L'espace de noms `mount` {#mount-ns}
@ -194,17 +194,17 @@ similaire à :
<div lang="en-US"> <div lang="en-US">
```c ```c
#include <sched.h> #include <sched.h>
#define STACKSIZE (1024*1024) #define STACKSIZE (1024*1024)
static char child_stack[STACKSIZE]; 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, pid_t pid = clone(do_execvp,
child_stack + STACKSIZE, child_stack + STACKSIZE,
clone_flags, clone_flags,
&args); &args);
``` ```
</div> </div>
@ -220,33 +220,33 @@ auquel on passe le *file descriptor* d'un des liens du dossier
<div lang="en-US"> <div lang="en-US">
```c ```c
#define _GNU_SOURCE #define _GNU_SOURCE
#include <fcntl.h> #include <fcntl.h>
#include <sched.h> #include <sched.h>
#include <stdlib.h> #include <stdlib.h>
// ./a.out /proc/PID/ns/FILE cmd args... // ./a.out /proc/PID/ns/FILE cmd args...
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int fd = open(argv[1], O_RDONLY); int fd = open(argv[1], O_RDONLY);
if (fd == -1) if (fd == -1)
{ {
perror("open"); 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; return EXIT_FAILURE;
} }
if (setns(fd, 0) == -1)
{
perror("setns");
return EXIT_FAILURE;
}
execvp(argv[2], &argv[2]);
perror("execve");
return EXIT_FAILURE;
}
``` ```
</div> </div>
@ -254,7 +254,7 @@ Dans un shell, on utilisera la commande `nsenter(1)` :
<div lang="en-US"> <div lang="en-US">
```shell ```shell
42sh# nsenter --uts=/proc/42/ns/uts /bin/bash 42sh# nsenter --uts=/proc/42/ns/uts /bin/bash
``` ```
</div> </div>
@ -276,8 +276,8 @@ persister après le dernier processus), on peut utiliser un `mount bind` :
<div lang="en-US"> <div lang="en-US">
```shell ```shell
42sh# touch /tmp/ns/myrefns 42sh# touch /tmp/ns/myrefns
42sh# mount --bind /proc/<PID>/ns/mount /tmp/ns/myrefns 42sh# mount --bind /proc/<PID>/ns/mount /tmp/ns/myrefns
``` ```
</div> </div>

View file

@ -14,9 +14,9 @@ environnement qui n'a plus qu'une interface de *loopback* :
<div lang="en-US"> <div lang="en-US">
```shell ```shell
42sh# unshare -n ip a 42sh# unshare -n ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1 1: lo: <LOOPBACK> 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 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
``` ```
</div> </div>
@ -153,7 +153,7 @@ gourmande.
### VLAN ### 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). supportant la technologie [802.1q](https://fr.wikipedia.org/wiki/IEEE_802.1Q).
<div lang="en-US"> <div lang="en-US">

View file

@ -11,11 +11,11 @@ comme l'`init`.
Contrairement aux autres *namespaces* où l'on peut demander à se séparer du 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, *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). qu'après le prochain `fork(2)` (ou similaire).
L'espace de noms PID du processus courant n'est pas changé, afin que le En effet, l'espace de noms n'est pas changé, afin que le processus ne change
processus ne change pas de PID en cours de route (puisque fonction du pas de PID en cours de route, puisqu'il dépend du *namespace* dans lequel il se
*namespace* dans lequel il se trouve). trouve.
## Isolons ! ## 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* ## Arborescence à l'extérieur du *namespace*
Lors de notre première tentative de `top`, lorsque `/proc` était encore monté 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 son nouveau *namespace*) était présent dans l'arborescence de l'espace initial
avec un PID dans la continuité des autres processus, étonnant ! avec un PID dans la continuité des autres processus, étonnant !
En fait, l'isolation consiste en une virtualisation des numéros du processus : 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 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. c'est cette nouvelle numérotation qui est montrée au processus.

View file

@ -26,9 +26,6 @@ sera pas pris en compte.
Par ailleurs, n'oubliez pas de répondre à Par ailleurs, n'oubliez pas de répondre à
[l'évaluation du cours](https://www.epitaf.fr/moodle/mod/quiz/view.php?id=42). [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 Tarball
------- -------
@ -40,8 +37,8 @@ Voici une arborescence type :
<div lang="en-US"> <div lang="en-US">
``` ```
login_x-TP4/cmpns.sh login_x-TP4/cmpns.sh
login_x-TP4/mydocker_exec.sh login_x-TP4/mydocker_exec.sh
login_x-TP4/myswitch_root.sh login_x-TP4/myswitch_root.sh
``` ```
</div> </div>

View file

@ -63,7 +63,7 @@ Nous allons utiliser des programmes issus des
[`procps-ng`](https://gitlab.com/procps-ng/procps) ainsi que ceux de la [`procps-ng`](https://gitlab.com/procps-ng/procps) ainsi que ceux de la
[`libcap`](http://www.friedhoff.org/posixfilecaps.html). [`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` * `util-linux`
* `procps` * `procps`

View file

@ -3,7 +3,7 @@ title: Virtualisation légère -- TP n^o^ 4
subtitle: Linux Internals partie 2 subtitle: Linux Internals partie 2
author: Pierre-Olivier *nemunaire* Mercier author: Pierre-Olivier *nemunaire* Mercier
institute: EPITA 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 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. que d'appréhender la complexité des systèmes de fichiers.
Tous les exercices de ce TP sont à rendre à <virli@nemunai.re> au plus tard le Tous les exercices de ce TP sont à rendre à <virli@nemunai.re> 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, 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 à vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à

View file

@ -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. 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 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, 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*. 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` ### `uid_map` et `gid_map`
@ -56,7 +59,7 @@ Sur chaque ligne, on doit indiquer :
en question. en question.
- L'identifiant marquant le début de la plage d'utilisateurs, pour le processus - L'identifiant marquant le début de la plage d'utilisateurs, pour le processus
affichant le fichier. affichant le fichier.
- La taille de la page. - La taille de la plage.
Par exemple, le *namespace* `user` initial défini la correspondance suivante : Par exemple, le *namespace* `user` initial défini la correspondance suivante :