5.1 KiB
Explorons les namespaces
Maintenant que nous avons quelques notions de base sur les espaces de nom, voyons quelles surprises nous réserve notre système...
Voir les namespaces de notre système
La première commande que l'on va utiliser est lsns(8)
, afin d'afficher tous
les namespaces actuels de notre machine.
Cette commande nous dévoile déjà de nombreuses choses :
-
Chaque processus se trouve dans un namespace de chaque type : le noyau n'a pas de notion de « processus hôte » (sans namespace) et « processus contenerisé » (dans un namespace). Le processus initial de la machine se retrouve donc dans des espaces de nom, tout comme les processus d'un conteneur.
-
On aperçoit un genre de hiérarchie dans certain cas.
-
La première colonne nous renseigne sur l'identifiant du namespace.
-
kdevtmpfs
: un thread du noyau, s'exécute dans un espace de nommnt
dédié.
Vous verrez surement davantage de processus si vous exécutez cette commande sur une machine que vous utilisez : chaque conteneur y sera bien entendu listé, quelque soit la technologie sous-jacente (Docker, podman, CRI-O, snapd, ...), mais chose plus étonnante, Chrome et Firefox tirent également parti des espaces de nom pour de la défense en profondeur.
Voir les namespaces d'un processus
Chaque processus lancé est donc 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 ont la même liste de fichiers. Ils sont tous liés à un espace de noms par namespace utilisable avec la version noyau dont on dispose. D'une machine à l'autre, d'une version du noyau à l'autre, il est normal d'avoir une liste de namespaces différente, mais d'un processus à l'autre sur un même noyau, nous aurons les mêmes espaces de nom disponibles, donc les mêmes fichiers.
Ces fichiers sont en fait des liens symboliques un peu particuliers, car ils ne pointent pas vers une destination "valide" :
Les liens référencent une structure du noyau résidant en mémoire. Les numéros
entre crochets sont les inodes du système de fichiers nsfs
, que l'on a pu
voir dans la première colonne de lsns(8)
. Ce sont les identifiants des
espaces de nom.
Ces inodes seront les mêmes pour deux processus qui partagent le même espace de noms : la structure pointée sera identique. Elle sera par contre différente si l'espace de nom est différent, l'inode sera donc différent.
::::: {.question}
*_for_children
{-}
Vous avez peut-être remarqué des fichiers *_for_children
dans le dossier ns
de vos processus. Les espaces de noms PID et Time, lorsqu'on les change
pour un processus, ne s'appliquent pas directement au processus en cours
d'exécution, la dissociation de namespace ne pourra se faire que pour les
processus/threads fils.
pid_for_children
et time_for_children
représentent donc les namespaces
qui seront attribués aux processus fils lancés par un clone(2)
ou un
fork(2)
.
En attendant notre processus courant conserve ses espaces de nom pid
et
time
.
:::::