Tuto 4 ready
This commit is contained in:
parent
fb994050db
commit
c960136430
18 changed files with 536 additions and 340 deletions
67
tutorial/4/setns.md
Normal file
67
tutorial/4/setns.md
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
\newpage
|
||||
|
||||
### Rejoindre un *namespace*
|
||||
|
||||
Rejoindre un espace de noms se fait en utilisant l'appel système `setns(2)`, ou
|
||||
la commande `nsenter(1)`. Il est nécessaire de donner en argument
|
||||
respectivement un *file descriptor* ou le chemin vers le fichier, lien
|
||||
symbolique, représentant l'espace de nom.
|
||||
|
||||
|
||||
#### Voir les *namespace*s d'un processus\
|
||||
|
||||
Chaque processus lancé est rattaché à une liste d'espaces de nom, y compris
|
||||
s'il est issu du système de base (« l'hôte »).
|
||||
|
||||
Nous pouvons dès lors consulter le dossier `/proc/<PID>/ns/` de chaque
|
||||
processus, pour consulter les différents espaces de nom de nos processus.
|
||||
|
||||
Tous les processus auront la même liste de fichiers, car ils sont liés à un
|
||||
espace de noms par *namespace* utilisable avec le noyau. D'une machine à
|
||||
l'autre, d'une version du noyau à l'autre, il est normal d'avoir une liste de
|
||||
*namespace*s différents, mais d'un processus à l'autre sur le même noyau, nous
|
||||
aurons les mêmes.
|
||||
|
||||
Ces fichiers sont en fait des liens symboliques un peu particuliers, car ils ne
|
||||
pointent pas vers une destination valide :
|
||||
|
||||
<div lang="en-US">
|
||||
```bash
|
||||
42sh$ ls -l /proc/self/ns
|
||||
lrwxrwxrwx 1 nemunaire 0 1 oct. 23:42 cgroup -> 'cgroup:[4026531835]'
|
||||
lrwxrwxrwx 1 nemunaire 0 1 oct. 23:42 ipc -> 'ipc:[4026531839]'
|
||||
lrwxrwxrwx 1 nemunaire 0 1 oct. 23:42 mnt -> 'mnt:[4026531840]'
|
||||
lrwxrwxrwx 1 nemunaire 0 1 oct. 23:42 net -> 'net:[4026532008]'
|
||||
lrwxrwxrwx 1 nemunaire 0 1 oct. 23:42 pid -> 'pid:[4026531836]'
|
||||
lrwxrwxrwx 1 nemunaire 0 1 oct. 23:42 pid_for_children -> 'pid:[4026531836]'
|
||||
lrwxrwxrwx 1 nemunaire 0 1 oct. 23:42 time -> 'time:[4026531834]'
|
||||
lrwxrwxrwx 1 nemunaire 0 1 oct. 23:42 time_for_children -> 'time:[4026531834]'
|
||||
lrwxrwxrwx 1 nemunaire 0 1 oct. 23:42 user -> 'user:[4026531837]'
|
||||
lrwxrwxrwx 1 nemunaire 0 1 oct. 23:42 uts -> 'uts:[4026531838]'
|
||||
|
||||
```
|
||||
</div>
|
||||
|
||||
Les liens référencent une structure du noyau résidant en mémoire. Les numéros
|
||||
entre crochets seront les mêmes pour deux processus qui partagent le même
|
||||
espace de noms. La structure pointée sera différente si l'espace de nom est
|
||||
différent, donc le numéro sera différent.
|
||||
|
||||
On ne peut pas afficher tel quel les structures, mais on peut l'ouvrir avec
|
||||
`open(2)` pour obtenir un *file descriptor* que l'on pourra passer à
|
||||
`setns(2)`.
|
||||
|
||||
Pour les commandes *shell*, il convient de donner en argument le chemin vers le
|
||||
lien symbolique : la commande se chargera d'`open(2)` le fichier.
|
||||
|
||||
|
||||
#### `*_for_children`\
|
||||
|
||||
Vous avez peut-être remarqué des fichiers `*_for_children` dans le dossier `ns`
|
||||
de vos processus. Nous verrons par la suite que les espaces de noms *PID* et
|
||||
*Time*, une fois créés, ne s'appliquent pas directement au processus en cours
|
||||
d'exécution, la dissociation de *namespace* ne peut se faire que pour les
|
||||
processus/threads fils.
|
||||
|
||||
`pid_for_children` et `time_for_children` représentent donc les *namespace*s
|
||||
qui seront attribués aux fils lancés après un `unshare(2)` réussi.
|
||||
Loading…
Add table
Add a link
Reference in a new issue