Merge clone part into namespaces one
This commit is contained in:
parent
e1cc72532c
commit
e0ce860853
@ -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 \
|
||||
|
@ -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)
|
@ -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).
|
||||
|
Loading…
Reference in New Issue
Block a user