namespaces
Table des matières
Retour à l'index
NOM
espaces de noms – Présentation des espaces de noms sous Linux
DESCRIPTION
Un espace de noms transforme une ressource globale du système en une
abstraction qui la présente aux processus dans cet espace de noms comme une
instance indépendante de la ressource globale. Seuls les processus qui
appartiennent à l'espace de noms peuvent voir les changements apportés à la
ressource globale. Les espaces de noms sont notamment utilisés mettre en
œuvre les conteneurs.
Cette page présente les différents espaces de noms, leurs fichiers /proc
respectifs, et récapitule les API qui permettent de travailler avec ces
espaces de noms.
Types d’espaces de noms
La table suivante présente les types d’espace de noms disponibles dans
Linux. La seconde colonne présente la valeur de l’indicateur utilisé pour
indiquer le type d’espace de noms dans les diverses API. La troisième
colonne indique la page de manuel qui fournit des détails sur le type
d’espace de noms. La dernière colonne est un résumé des ressources qui sont
isolées par le type d’espace de noms.
API des espaces de noms
En plus des divers fichiers /proc décrits plus bas, l'API des espaces de
noms comprend les appels systèmes suivants :
- clone(2)
-
L'appel système clone(2) crée un nouveau processus. Si lors de l'appel,
l'argument flags précise un ou plusieurs des indicateurs CLONE_NEW*
décrits ci-dessus, un nouvel espace de noms sera créé pour chaque indicateur
et le processus enfant sera membre de ces espaces de noms. Cet appel système
implémente également plusieurs fonctionnalités sans lien avec les espaces de
noms.
- setns(2)
-
L'appel système setns(2) permet à un processus appelant de rejoindre un
espace de noms existant. Cet espace de noms est précisé au moyen d'un
descripteur de fichier qui renvoie vers l'un des fichiers /proc/pid/ns
décrits ci-dessous.
- unshare(2)
-
L'appel système unshare(2) déplace le processus appelant dans un nouvel
espace de noms. Si lors de l'appel, son argument flags précise un ou
plusieurs des indicateurs CLONE_NEW* décrits ci-dessus, un nouvel espace
de noms sera créé pour chaque indicateur et le processus appelant sera
membre de ces espaces de noms. Cet appel système implémente également
plusieurs fonctionnalités sans lien avec les espaces de noms.
- ioctl(2)
-
Diverses opérations ioctl(2) peuvent être utilisées pour connaître des
informations à propos des espaces de noms. Ces opérations sont décrites dans
ioctl_nsfs(2).
Dans la plupart des cas, la création de nouveaux espaces de noms en
utilisant clone(2) ou unshare(2) nécessite de disposer de la capacité
CAP_SYS_ADMIN, puisque, dans le nouvel espace de noms, le créateur aura
le pouvoir de changer les ressources globales qui sont visibles aux autres
processus qui y sont créés ultérieurement ou de joindre l’espace de
noms. Les espaces de noms utilisateur forment une exception : à partir de
Linux 3.8, la création d'un espace de noms utilisateur ne nécessite pas de
privilège particulier.
Le répertoire /proc/pid/ns/
Chaque processus a un sous-répertoire /proc/pid/ns/ contenant une
entrée pour chaque espace de noms qui prend en charge sa manipulation par
setns(2) :
$ ls -l /proc/$$/ns | awk '{print $1, $9, $10, $11}'
total 0
lrwxrwxrwx. cgroup -> cgroup:[4026531835]
lrwxrwxrwx. ipc -> ipc:[4026531839]
lrwxrwxrwx. mnt -> mnt:[4026531840]
lrwxrwxrwx. net -> net:[4026531969]
lrwxrwxrwx. pid -> pid:[4026531836]
lrwxrwxrwx. pid_for_children -> pid:[4026531834]
lrwxrwxrwx. time -> time:[4026531834]
lrwxrwxrwx. time_for_children -> time:[4026531834]
lrwxrwxrwx. user -> user:[4026531837]
lrwxrwxrwx. uts -> uts:[4026531838]
Lier le montage (consulter mount(2)) d'un des fichiers de ce répertoire
dans un autre emplacement du système de fichiers maintient l'espace de noms
du processus désigné par pid en fonctionnement, même si tous les
processus de l'espace de noms sont terminés.
L'ouverture d'un des fichiers de ce répertoire (ou d'un fichier qui est un
montage bind de l'un de ces fichiers) renvoie un gestionnaire de fichier
pour l'espace de noms correspondant au processus désigné par pid. Tant
que ce descripteur de fichier est ouvert, l'espace de noms reste
opérationnel, même si tous les processus de l'espace de noms sont
terminés. Le descripteur de fichier peut être transmis au moyen de
setns(2).
Jusqu’à la version 3.7 de Linux (incluse), ces fichiers apparaissaient comme
des liens physiques. À partir de Linux 3.8, ils apparaissent comme des liens
symboliques. Si deux processus sont dans le même espace de noms, alors ils
auront les mêmes identifiants de périphérique et leurs numéros d’inœud pour
leurs liens symboliques /proc/pid/ns/xxx seront les mêmes. Une
application peut consulter cette information grâce aux champs stat.st_dev
et stat.st_ino renvoyés par stat(2). Le contenu de ce lien symbolique
est une chaîne de caractères contenant le type de l'espace de noms et le
numéro d'inœud, comme dans l'exemple suivant :
$ readlink /proc/$$/ns/uts
uts:[4026531838]
Les liens symboliques dans ce sous-répertoire sont les suivants :
- /proc/pid/ns/cgroup (depuis Linux 4.6)
-
Ce fichier est un descripteur pour l'espace de noms cgroup du processus.
- /proc/pid/ns/ipc (depuis Linux 3.0)
-
Ce fichier est un descripteur pour l'espace de noms IPC du processus.
- /proc/pid/ns/mnt (depuis Linux 3.8)
-
Ce fichier est un descripteur pour l'espace de noms montage du processus.
- /proc/pid/ns/net (depuis Linux 3.0)
-
Ce fichier est un descripteur pour l'espace de noms réseau du processus.
- /proc/pid/ns/pid (depuis Linux 3.8)
-
Ce fichier est un descripteur pour l'espace de noms PID du processus. Ce
descripteur est permanent pour toute la durée de vie du processus
(c’est-à-dire que l’appartenance de l’espace de noms PID ne change jamais).
- /proc/pid/ns/pid_for_children (depuis Linux 4.12)
-
Ce fichier est un descripteur pour l’espace de noms PID des processus enfant
créés par ce processus. Cela peut changer comme conséquence des appels à
unshare(2) et setns(2) (consultez pid_namespaces(7)), aussi le
fichier peut différer de /proc/pid/ns/pid. Le lien symbolique obtient
une valeur seulement après que le premier processus enfant soit créé dans
cet espace de noms. Auparavant, readlink(2) sur le lien symbolique
renvoyait un tampon vide.
- /proc/pid/ns/time (depuis Linux 5.6)
-
Ce fichier est un descripteur pour l'espace de noms temps du processus.
- /proc/pid/ns/time_for_children (depuis Linux 5.6)
-
Ce fichier est un descripteur pour l’espace de noms temps des processus
enfant créés par ce processus. Cela peut changer comme conséquence des
appels à unshare(2) et setns(2) (consultez time_namespaces(7)),
aussi le fichier peut différer de /proc/pid/ns/time.
- /proc/pid/ns/user (depuis Linux 3.8)
-
Ce fichier est un descripteur pour l'espace de noms utilisateur du
processus.
- /proc/pid/ns/uts (depuis Linux 3.0)
-
Ce fichier est un descripteur pour l'espace de noms UTS du processus.
La permission de déréférencer ou lire (readlink(2)) ces liens symboliques
est contrôlée par une vérification PTRACE_MODE_READ_FSCREDS du mode
d’accès ptrace. Consultez ptrace(2).
Répertoire /proc/sys/user
Les fichiers dans le répertoire /proc/sys/user (qui existe depuis
Linux 4.9) expose les limites du nombre d’espaces de noms des divers types
pouvant être créés. Ces fichiers sont les suivants :
- max_cgroup_namespaces
-
Cette valeur dans le fichier définit une limite par utilisateur du nombre
d’espaces de noms cgroup pouvant être créés dans l’espace de noms
utilisateur.
- max_ipc_namespaces
-
Cette valeur dans le fichier définit une limite par utilisateur du nombre
d’espaces de noms IPC pouvant être créés dans l’espace de noms utilisateur.
- max_mnt_namespaces
-
Cette valeur dans le fichier définit une limite par utilisateur du nombre
d’espaces de noms montage pouvant être créés dans l’espace de noms
utilisateur.
- max_net_namespaces
-
Cette valeur dans le fichier définit une limite par utilisateur du nombre
d’espaces de noms réseau pouvant être créés dans l’espace de noms
utilisateur.
- max_pid_namespaces
-
Cette valeur dans le fichier définit une limite par utilisateur du nombre
d’espaces de noms PID pouvant être créés dans l’espace de noms utilisateur.
- max_time_namespaces (depuis Linux 5.7)
-
Cette valeur dans le fichier définit une limite par utilisateur du nombre
d’espaces de noms temps pouvant être créés dans l’espace de noms
utilisateur.
- max_user_namespaces
-
Cette valeur dans le fichier définit une limite par utilisateur du nombre
d’espaces de noms utilisateur pouvant être créés dans l’espace de noms
utilisateur.
- max_uts_namespaces
-
Cette valeur dans le fichier définit une limite par utilisateur du nombre
d’espaces de noms UTS pouvant être créés dans l’espace de noms utilisateur.
Remarquez les points suivants concernant ces fichiers :
- -
-
Les valeurs dans ces fichiers sont modifiables par les processus
privilégiés.
- -
-
Les valeurs indiquées par ces fichiers sont les limites pour l’espace de
noms utilisateur dans lequel le processus ouvert réside.
- -
-
Les limites sont pour chaque utilisateur. Chaque utilisateur dans le même
espace de noms peut créer des espaces de noms jusqu’à la limite définie.
- -
-
Les limites s’appliquent à tous les utilisateurs, incluant l’UID 0.
- -
-
Ces limites s’appliquent en plus de n’importe quelles autres limites par
espace de noms (tels que les espaces de noms PID ou utilisateur) qui peuvent
être imposées.
- -
-
En cas de dépassement de ces limites, clone(2) et unshare(2) échouent
avec l’erreur ENOSPC.
- -
-
Pour l’espace de noms utilisateur de départ, la valeur par défaut dans
chacun de ces fichiers est la moitié de la limite du nombre de threads
pouvant être créés (/proc/sys/kernel/threads-max). Dans tous les espaces
de noms de la descendance, la valeur par défaut dans chaque fichier est
MAXINT.
- -
-
Quand un espace de noms est créé, l’objet est aussi comptabilisé dans les
espaces de noms ancêtre. Plus précisément :
-
- -
-
Chaque espace de noms utilisateur à un UID créateur.
- -
-
Quand un espace de noms est créé, il est comptabilisé dans les UID créateurs
dans chacun des espaces de noms ancêtre et le noyau assure que la limite de
l’espace de noms correspondant pour l’UID créateur dans l’espace de noms
ancêtre ne soit pas dépassée.
- -
-
Le point ci-dessus assure que la création d’un nouvel espace de noms
utilisateur ne peut pas être utilisée pour se soustraire aux limites en
vigueur dans l’espace de noms utilisateur actuel.
Durée de vie des espaces de noms
En l’absence d’autres facteurs, un espace de noms est automatiquement
détruit quand le dernier processus de l’espace de noms se termine ou le
quitte. Cependant, il existe un certain nombre d’autres facteurs qui peuvent
obliger l’existence de l’espace de noms même s’il n’a plus de processus
membre, dont les facteurs suivants :
- -
-
Un descripteur de fichier ouvert ou un montage bind existe pour le fichier
correspondant /proc/pid/ns/*.
- -
-
L’espace de noms est hiérarchique (c’est-à-dire un espace de noms PID ou
utilisateur) et possède un espace de noms enfant.
- -
-
C’est un espace de noms utilisateur qui possède un ou plusieurs espaces de
noms non utilisateur.
- -
-
C’est un espace de noms PID et il existe un processus qui se réfère à lui à
l’aide d’un lien symbolique /proc/pid/ns/pid_for_children.
- -
-
C’est un espace de noms temps et il existe un processus qui se réfère à lui
à l’aide d’un lien symbolique /proc/pid/ns/time_for_children.
- -
-
C’est un espace de noms IPC et un montage correspondant d’un système de
fichiers mqueue (file d'attente de message — consultez mq_overview(7))
se réfère à cet espace de noms.
- -
-
C’est un espace de noms PID et un montage correspondant d’un système de
fichiers proc(5) se réfère à cet espace de noms.
EXEMPLES
Consultez clone(2) et user_namespaces(7).
VOIR AUSSI
nsenter(1), readlink(1), unshare(1), clone(2), ioctl_nsfs(2),
setns(2), unshare(2), proc(5), capabilities(7),
cgroup_namespaces(7), cgroups(7), credentials(7),
ipc_namespaces(7), network_namespaces(7), pid_namespaces(7),
user_namespaces(7), uts_namespaces(7), lsns(8), switch_root(8)
TRADUCTION
La traduction française de cette page de manuel a été créée par
Christophe Blaess <https://www.blaess.fr/christophe/>,
Stéphan Rafin <stephan.rafin@laposte.net>,
Thierry Vignaud <tvignaud@mandriva.com>,
François Micaux,
Alain Portal <aportal@univ-montp2.fr>,
Jean-Philippe Guérard <fevrier@tigreraye.org>,
Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>,
Julien Cristau <jcristau@debian.org>,
Thomas Huriaux <thomas.huriaux@gmail.com>,
Nicolas François <nicolas.francois@centraliens.net>,
Florentin Duneau <fduneau@gmail.com>,
Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
Denis Barbier <barbier@debian.org>,
David Prévot <david@tilapin.org>,
Cédric Boutillier <cedric.boutillier@gmail.com>,
Frédéric Hantrais <fhantrais@gmail.com>
et
Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>
Cette traduction est une documentation libre ; veuillez vous reporter à la
GNU General Public License version 3
concernant les conditions de copie et
de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
Index
- NOM
-
- DESCRIPTION
-
- Types d’espaces de noms
-
- API des espaces de noms
-
- Le répertoire /proc/pid/ns/
-
- Répertoire /proc/sys/user
-
- Durée de vie des espaces de noms
-
- EXEMPLES
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:06:38 GMT, September 19, 2025