Update 2018
This commit is contained in:
parent
84f99be155
commit
5b03f090fe
|
@ -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 \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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*).
|
||||
|
||||
<div lang="en-US">
|
||||
```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
|
|
@ -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 à :
|
|||
|
||||
<div lang="en-US">
|
||||
```c
|
||||
#include <sched.h>
|
||||
#include <sched.h>
|
||||
|
||||
#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);
|
||||
```
|
||||
</div>
|
||||
|
||||
|
@ -220,33 +220,33 @@ auquel on passe le *file descriptor* d'un des liens du dossier
|
|||
|
||||
<div lang="en-US">
|
||||
```c
|
||||
#define _GNU_SOURCE
|
||||
#include <fcntl.h>
|
||||
#include <sched.h>
|
||||
#include <stdlib.h>
|
||||
#define _GNU_SOURCE
|
||||
#include <fcntl.h>
|
||||
#include <sched.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 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;
|
||||
}
|
||||
}
|
||||
```
|
||||
</div>
|
||||
|
||||
|
@ -254,7 +254,7 @@ Dans un shell, on utilisera la commande `nsenter(1)` :
|
|||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
42sh# nsenter --uts=/proc/42/ns/uts /bin/bash
|
||||
42sh# nsenter --uts=/proc/42/ns/uts /bin/bash
|
||||
```
|
||||
</div>
|
||||
|
||||
|
@ -276,8 +276,8 @@ persister après le dernier processus), on peut utiliser un `mount bind` :
|
|||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
42sh# touch /tmp/ns/myrefns
|
||||
42sh# mount --bind /proc/<PID>/ns/mount /tmp/ns/myrefns
|
||||
42sh# touch /tmp/ns/myrefns
|
||||
42sh# mount --bind /proc/<PID>/ns/mount /tmp/ns/myrefns
|
||||
```
|
||||
</div>
|
||||
|
||||
|
|
|
@ -14,9 +14,9 @@ environnement qui n'a plus qu'une interface de *loopback* :
|
|||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
42sh# unshare -n ip a
|
||||
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
|
||||
42sh# unshare -n ip a
|
||||
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
|
||||
```
|
||||
</div>
|
||||
|
||||
|
@ -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).
|
||||
|
||||
<div lang="en-US">
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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 :
|
|||
|
||||
<div lang="en-US">
|
||||
```
|
||||
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
|
||||
```
|
||||
</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
|
||||
[`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`
|
||||
|
|
|
@ -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 à <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,
|
||||
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.
|
||||
|
||||
|
||||
### 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 :
|
||||
|
|
Loading…
Reference in New Issue
Block a user