Update 2018
This commit is contained in:
parent
84f99be155
commit
5b03f090fe
10 changed files with 64 additions and 64 deletions
|
|
@ -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 \
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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`
|
||||||
|
|
|
||||||
|
|
@ -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 à
|
||||||
|
|
|
||||||
|
|
@ -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 :
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue