virli/tutorial/4/setns.md

2.9 KiB

\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 namespaces 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 namespaces 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 :

```bash 42sh$ ls -l /proc/self/ns lrwxrwxrwx 1 nemunaire 1 oct. 23:42 cgroup -> 'cgroup:[4026531835]' lrwxrwxrwx 1 nemunaire 1 oct. 23:42 ipc -> 'ipc:[4026531839]' lrwxrwxrwx 1 nemunaire 1 oct. 23:42 mnt -> 'mnt:[4026531840]' lrwxrwxrwx 1 nemunaire 1 oct. 23:42 net -> 'net:[4026532008]' lrwxrwxrwx 1 nemunaire 1 oct. 23:42 pid -> 'pid:[4026531836]' lrwxrwxrwx 1 nemunaire 1 oct. 23:42 pid_for_children -> 'pid:[4026531836]' lrwxrwxrwx 1 nemunaire 1 oct. 23:42 time -> 'time:[4026531834]' lrwxrwxrwx 1 nemunaire 1 oct. 23:42 time_for_children -> 'time:[4026531834]' lrwxrwxrwx 1 nemunaire 1 oct. 23:42 user -> 'user:[4026531837]' lrwxrwxrwx 1 nemunaire 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.


::::: {.question}

##### `*_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.

:::::