68 lines
2.9 KiB
Markdown
68 lines
2.9 KiB
Markdown
\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.
|