Merge clone part into namespaces one

This commit is contained in:
nemunaire 2016-10-20 03:17:42 +02:00
parent e1cc72532c
commit e0ce860853
3 changed files with 58 additions and 30 deletions

View File

@ -1,4 +1,4 @@
SOURCES = tutorial.md mount.md namespaces.md networkns.md pidns.md mountns.md userns.md clone.md project.md
SOURCES = tutorial.md mount.md namespaces.md networkns.md pidns.md mountns.md userns.md project.md
PANDOCOPTS = --latex-engine=xelatex \
--standalone \
--normalize \

View File

@ -1,19 +0,0 @@
\newpage
Plus bas !
==========
## `clone(2)`
* `CLONE_NEWNS`
* `CLONE_NEWUTS`
* `CLONE_NEWIPC`
* `CLONE_NEWPID`
* `CLONE_NEWNET`
* `CLONE_NEWUSER`
* `CLONE_NEWCGROUP`
## Aller plus loin
* [](http://crosbymichael.com/creating-containers-part-1.html)

View File

@ -5,9 +5,9 @@ Les *namespaces*
## Introduction
Les espaces de noms du noyau, *namespaces*, permettent de dupliquer certaines
structures du noyau, dans le but de les isoler d'un groupe de processus à un
autre.
Les espaces de noms du noyau, les *namespaces*, permettent de dupliquer
certaines structures du noyau, dans le but de les isoler d'un groupe de
processus à un autre.
On en dénombre 7 depuis Linux 4.6 : `CGroup`, `IPC`, `network`, `mount`, `PID`,
`user` et `UTS`.
@ -19,10 +19,11 @@ Depuis Linux 2.4.19.
Isole la liste des points de montage.
Chaque processus d'un namespace différent peut monter, démonter et réorganiser
à sa guise les points de montage. Une partition ne sera donc pas nécessairement
démonté après un appel à `umount(2)`, elle le sera lorsqu'elle aura
effectivement été démontée de chaque *namespace* dans lequel elle était montée.
Chaque processus d'un *namespace* différent peut monter, démonter et
réorganiser à sa guise les points de montage. Une partition ne sera donc pas
nécessairement démonté après un appel à `umount(2)`, elle le sera lorsqu'elle
aura effectivement été démontée de chaque *namespace* dans lequel elle était
montée.
### `UTS` *namespaces*
@ -105,8 +106,9 @@ plus d'importance car le processus ne voit que son groupe.
## S'isoler dans un nouveau *namespace*
## Partir dans un nouveau *namespace*
### Avec son coquillage
De la même manière que l'on peut utiliser l'appel système `chroot(2)` depuis un
shell via la commande `chroot(1)`, la commande `unshare(1)` permet de faire le
@ -141,6 +143,47 @@ effets produits : par exemple, comparons un `ip address` à l'extérieur et à
l'intérieur d'un `unshare -n`.
### Les appels systèmes
L'appel système par excellence pour contrôler l'isolation d'un nouveau
processus est `clone(2)`.
L'isolement ou non du processus est faite en fonction des `flags` qui sont
passés à la fonction :
* `CLONE_NEWNS`,
* `CLONE_NEWUTS`,
* `CLONE_NEWIPC`,
* `CLONE_NEWPID`,
* `CLONE_NEWNET`,
* `CLONE_NEWUSER`,
* `CLONE_NEWCGROUP`.
On peut bien entendu cumuler un ou plusieurs de ces `flags`, et les combiner
avec d'autres `flags` attendu par la fonction.
Les mêmes `flags` sont utilisés lors des appels à `unshare(2)` ou `setns(2)`.
Pour créer un nouveau processus qui sera à la fois dans un nouvel *namespace*
réseau et dans un nouveau *namespace* CGroup, on écrirait un code similaire à :
```c
#include <sched.h>
#define STACKSIZE (1024*1024)
static char child_stack[STACKSIZE];
int clone_flags = CLONE_CGROUP | CLONE_NEWNET | SIGCHLD;
pid_t pid = clone(do_execvp,
child_stack + STACKSIZE,
clone_flags,
&args);
```
Le premier argument est un pointeur sur fonction. Il s'agit de la fonction qui
sera appelée par le nouveau processus.
## Comparaison de *namespace*
Les *namespaces* d'un programme sont exposés sous forme de liens symboliques
@ -241,8 +284,9 @@ Dans un shell, on utilisera la commande `nsenter(1)` :
Si vous avez bien suivi jusque là, vous avez dû comprendre qu'un `docker exec`,
n'était donc rien de plus qu'un `nsenter(1)`.
Réécrivons, en quelques lignes de shell, la commande `docker exec` ! Pour
savoir si vous avez réussi, comparez les sorties des commandes :
Réécrivons, en quelques lignes, la commande `docker exec` !
Pour savoir si vous avez réussi, comparez les sorties des commandes :
- `ip address` ;
- `hostname` ;
@ -295,3 +339,6 @@ Pour tout connaître en détails, [la série d'articles de Michael Kerrisk sur
les *namespaces*](https://lwn.net/Articles/531114/) est excellente ! Auquel il
faut ajouter [le petit dernier sur le CGroup
*namespace*](https://lwn.net/Articles/621006/).
Cet article
[de Michael Crosby montrant l'utilisation de clone(2)](http://crosbymichael.com/creating-containers-part-1.html).