2021-10-31 19:51:17 +00:00
|
|
|
|
\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.
|
|
|
|
|
|
|
|
|
|
|
2022-04-09 00:50:14 +00:00
|
|
|
|
#### Voir les *namespace*s d'un processus
|
2021-10-31 19:51:17 +00:00
|
|
|
|
|
|
|
|
|
Chaque processus lancé est rattaché à une liste d'espaces de nom, y compris
|
2022-05-12 00:46:31 +00:00
|
|
|
|
s'il est issu du système de base (« l'hôte »).
|
2021-10-31 19:51:17 +00:00
|
|
|
|
|
|
|
|
|
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
|
2022-02-24 19:43:43 +00:00
|
|
|
|
pointent pas vers une destination valide :
|
2021-10-31 19:51:17 +00:00
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```bash
|
|
|
|
|
42sh$ ls -l /proc/self/ns
|
2022-05-04 09:18:16 +00:00
|
|
|
|
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]'
|
2021-10-31 19:51:17 +00:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
</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
|
2022-02-24 19:43:43 +00:00
|
|
|
|
lien symbolique : la commande se chargera d'`open(2)` le fichier.
|
2021-10-31 19:51:17 +00:00
|
|
|
|
|
|
|
|
|
|
2022-04-09 00:50:14 +00:00
|
|
|
|
::::: {.question}
|
|
|
|
|
|
|
|
|
|
##### `*_for_children` {-}
|
2021-10-31 19:51:17 +00:00
|
|
|
|
|
|
|
|
|
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.
|
2022-04-09 00:50:14 +00:00
|
|
|
|
|
|
|
|
|
:::::
|