tuto4: done
This commit is contained in:
parent
886197bfe8
commit
a476cd8b6d
14 changed files with 643 additions and 331 deletions
|
|
@ -1,21 +1,21 @@
|
|||
\newpage
|
||||
|
||||
Le *namespace* `PID`
|
||||
Le *namespace* `PID` {#pid-ns}
|
||||
=====================
|
||||
|
||||
## Introduction
|
||||
## Introduction {#pid-ns-intro}
|
||||
|
||||
Le *namespace* `PID` est celui qui va nous permettre d'isoler un sous-arbre de
|
||||
processus en créant un nouvel arbre, qui aura son propre processus considéré
|
||||
L'espace de noms `PID` est celui qui va nous permettre d'isoler un sous-arbre
|
||||
de processus en créant un nouvel arbre, qui aura son propre processus considéré
|
||||
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, dans le cas du *namespace* PID, le
|
||||
changement n'est valable qu'après le prochain `fork(2)` (ou similaire). Le
|
||||
*namespace* PID du processus courant n'est pas changé, afin que le processus ne
|
||||
change pas de PID en cours de route (en fonction du *namespace* dans lequel il
|
||||
se trouve).
|
||||
via `unshare(2)` ou `setns(2)` par exemple, ici, le changement n'est 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).
|
||||
|
||||
|
||||
## Isolons !
|
||||
|
|
@ -24,12 +24,12 @@ Première étape s'isoler :
|
|||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
unshare --pid --fork /bin/bash
|
||||
42sh# unshare --pid --fork /bin/bash
|
||||
```
|
||||
</div>
|
||||
|
||||
Nous utilisons ici l'option `-f`, pour que le passage dans le nouvel espace de
|
||||
noms des PID soit effectif (cf. Introduction).
|
||||
noms des PID soit effectif (cf. [Introduction](#pid-ns-intro)).
|
||||
|
||||
Un coup d'œil à `top` ou `ps aux` devrait nous montrer que l'on est maintenant
|
||||
seul processus ... pourtant, il n'en est rien, ces deux commandes continuent
|
||||
|
|
@ -39,10 +39,10 @@ Cela est dû au fait que ces deux programmes, sous Linux, se basent sur le
|
|||
contenu de `/proc`. D'ailleurs, si l'on affiche le PID du processus courant
|
||||
`echo $$`, on obtient bien 1.
|
||||
|
||||
En l'état, beaucoup d'information fuitent. Mais il n'est pas possible de monter
|
||||
le bon `/proc` car il serait également monté pour les processus de notre
|
||||
système initial. Pour s'en sortir, il est nécessaire de s'isoler du *namespace*
|
||||
`mount`.
|
||||
En l'état, beaucoup d'informations sont divulguées. Mais il n'est pas possible
|
||||
de monter le bon `/proc` car il serait également monté pour les processus de
|
||||
notre système initial. Pour s'en sortir, il est nécessaire de s'isoler du
|
||||
*namespace* `mount`.
|
||||
|
||||
|
||||
### Double isolation : ajout du *namespace* `mount`
|
||||
|
|
@ -51,7 +51,7 @@ Voici la nouvelle ligne de commande que l'on va utiliser :
|
|||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
unshare --pid --mount --fork --mount-proc /bin/bash
|
||||
42sh# unshare --pid --mount --fork --mount-proc /bin/bash
|
||||
```
|
||||
</div>
|
||||
|
||||
|
|
@ -64,16 +64,15 @@ Cette fois, `top` et `ps` nous rapportent bien que l'on est seul dans notre
|
|||
|
||||
## Arborescence à l'extérieur du *namespace*
|
||||
|
||||
Vous l'avez sans doute remarqué lors de votre première tentative de `top`,
|
||||
lorsque le `/proc` était encore monté sur le procfs de l'espace initial : votre
|
||||
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 !
|
||||
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
|
||||
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
|
||||
font parti de l'espace de noms créé disposent d'une nouvelle numérotation. Et
|
||||
c'est cette nouvelle numérotation qui est montré au processus.
|
||||
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.
|
||||
|
||||
Si l'on veut interagir avec ce processus depuis un de ses espaces de noms
|
||||
parent, il faut le faire avec son identifiant de processus du même *namespace*
|
||||
|
|
@ -89,13 +88,13 @@ Si un processus est orphelin, il est donc affiché comme étant fils du PID 1
|
|||
dans son *namespace* ; il n'est pas sorti de l'espace de nom.
|
||||
|
||||
Lorsque l'on lance un processus via `nsenter(1)` ou `setns(2)`, cela crée un
|
||||
processus qui n'est sans doute pas un fils direct du processus d'init de notre
|
||||
conteneur. Malgré tout, même s'il est affiché comme n'étant pas un fils à
|
||||
l'extérieur du conteneur, les propriétés d'init sont biens appliquées à
|
||||
processus qui n'est sans doute pas un fils direct du processus d'`init` de
|
||||
notre conteneur. Malgré tout, même s'il est affiché comme n'étant pas un fils à
|
||||
l'extérieur du conteneur, les propriétés d'`init` sont biens appliquées à
|
||||
l'intérieur pour conserver un comportement cohérent.
|
||||
|
||||
|
||||
## Aller plus loin
|
||||
|
||||
N'hésitez pas à jeter un œil à la page de manuel consacré à ce *namespace* :
|
||||
`pid_namespaces(7)`.
|
||||
N'hésitez pas à jeter un œil à la page de manuel consacré à cet espace de
|
||||
noms : `pid_namespaces(7)`.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue