unshare – Exécuter un programme dans de nouveaux
espaces de noms
unshare [options] [programme
[arguments]]
La commande unshare crée de nouveaux espaces de noms
(comme précisé par les options de ligne de commande
décrites ci-après) puis exécute le programme
indiqué. Si programme n’est pas fourni, alors
${SHELL} est exécuté (par défaut :
/bin/sh).
Par défaut, un nouvel espace de noms subsiste aussi
longtemps qu’il possède des processus membres. Un nouvel
espace de noms peut être rendu persistant, même s’il ne
possède pas de membres, par montage lié (bind) des fichiers
/proc/pid/ns/type vers un chemin de système de fichiers. Un
espace de noms qui a été rendu persistant de cette
façon peut ensuite être entré avec nsenter(1)
même après que le programme soit terminé
(excepté les espaces de noms PID où l’exécution
permanente de processus init est nécessaire). Une fois qu’un
espace de noms n’est plus nécessaire, il peut être
rendu temporaire avec umount(8) pour supprimer le montage lié.
Consulter la section EXEMPLES pour plus de détails.
unshare depuis la version 2.36 d’util-linux
utilise les fichiers /proc/[pid]/ns/pid_for_children et
/proc/[pid]/ns/time_for_children pour des espace de noms persistants
PID et temps. Cette modification nécessite un noyau Linux
version 4.17 ou plus récent.
Les types d’espace de noms suivants peuvent être
créés avec unshare :
- espace de noms de
montage
- Le montage et démontage de systèmes de fichiers n'affectera
pas le reste du système, sauf pour les systèmes de fichiers
explicitement marqués comme partagés (avec mount
--make-shared, consultez /proc/self/mountinfo ou findmnt
-o+PROPAGATION pour les drapeaux shared). Pour de plus amples
détails, consulter mount_namespaces(7) et
l’explication du drapeau CLONE_NEWNS dans
clone(2).
- unshare, depuis util-linux version 2.27, règle
automatiquement la propagation à private dans un nouvel
espace de noms montage pour assurer que celui-ci soit vraiment
isolé. Il est possible de désactiver cette
caractéristique avec l’option --propagation
unchanged. Remarquez que private est le comportement par
défaut du noyau.
- espace de noms
UTS
- La configuration du nom d'hôte ou du nom de domaine n'affectera pas
le reste du système. Pour de plus amples détails, consulter
namespaces(7).
- espace de noms
IPC
- Le processus aura un nom d'espace indépendant pour les files de
messages POSIX ainsi que pour les files de messages de System V,
les ensembles de sémaphores et les segments de mémoire
partagée. Pour de plus amples détails, consulter
ipc_namespaces(7).
- espace de noms
réseau
- Le processus aura des piles IPv4 et IPv6, des tables de routage IP, des
règles de pare-feu, les arborescences de répertoires
/proc/net et /sys/class/net, des sockets, etc.,
indépendantes. Pour de plus amples détails, consulter
namespaces(7).
- espace de noms
PID
- Les enfants auront un ensemble distinct de mises en correspondance de PID
à traiter de celui de leur parent. Pour de plus amples
détails, consulter pid_namespaces(7).
- espace de noms de
groupe de contrôle
- Le processus aura une vue virtualisée de /proc/self/cgroup,
et les nouveaux montages de groupe de contrôle auront pour racine
celle du groupe de contrôle d’espace de noms. Pour de plus
amples détails, consulter cgroup_namespaces(7).
- espace de noms
utilisateur
- Le processus aura un ensemble propre d’UID, de GID et de
capacités. Pour de plus amples détails, consulter
user_namespaces(7).
- espace de noms
temps
- Le processus peut avoir une vue distincte de CLOCK_MONOTONIC ou
CLOCK_BOOTTIME qui peut être modifiée avec
/proc/self/timens_offsets. Pour de plus amples détails,
consulter, see time_namespaces(7).
- -i,
--ipc[=fichier]
- Isoler l’espace de noms IPC. Si fichier est indiqué,
alors un espace de noms persistant est créé par un montage
lié.
- -m,
--mount[=fichier]
- Isoler l’espace de noms montage. Si fichier est
indiqué, alors un espace de noms persistant est créé
par un montage lié. Remarquez que fichier doit être
situé sur le système de fichiers avec le drapeau de
propagation n’est pas shared (ou une erreur survient).
Utilisez la commande findmnt -o+PROPAGATION si vous
n’êtes pas sûr du réglage en cours. Consulter
les exemples ci-dessous.
- -n,
--net[=fichier]
- Isoler l’espace de noms réseau. Si fichier est
indiqué, alors un espace de noms persistant est créé
par un montage lié.
- -p,
--pid[=fichier]
- Isoler l'espace de noms PID. Si fichier est indiqué, alors
un espace de noms persistant est créé par un montage
lié. (La création d’un espace de noms PID persistant
échouera si l’option --fork n’est pas aussi
précisée.)
- Consulter aussi les options --fork et --mount-proc.
- -u,
--uts[=fichier]
- Isoler l’espace de noms UTS. Si fichier est indiqué,
alors un espace de noms persistant est créé par un montage
lié.
- -U,
--user[=fichier]
- Isoler l’espace de noms utilisateur. Si fichier est
indiqué, alors un espace de noms persistant est créé
par un montage lié.
- -C,
--cgroup[=fichier]
- Isoler l’espace de noms groupe de contrôle. Si
fichier est indiqué, alors un espace de noms persistant est
créé par un montage lié.
- -T,
--time[=fichier]
- Isoler l'espace de noms temps. Si fichier est indiqué, alors
un espace de noms persistant est créé par un montage
lié. Les options --monotonic et --boottime peuvent
être utilisées pour les décalages correspondants dans
l’espace de noms temps.
- -f, --fork
- Fourcher le programme indiqué comme processus enfant de
unshare plutôt que de l’exécuter directement.
Cela est utile lors de la création d’un nouvel espace de
noms PID. Il est à remarquer que quand unshare est en
attente d’un processus enfant, alors il ignore SIGINT et
SIGTERM et ne transmet aucun signal à l’enfant. Cela
est nécessaire pour envoyer des signaux au processus enfant.
- --keep-caps
- Quand l’option --user est fournie, garantir que les
capacités octroyées dans l’espace de noms utilisateur
soient conservées dans le processus enfant.
- --kill-child[=nom_de_signal]
- À la fin de unshare, envoyer un nom_signal au
processus enfant forké. Combiné avec --pid, cela
permet une extinction aisée et fiable de l’arbre entier de
processus sous unshare. S’il n’est pas donné,
nom_signal est par défaut SIGKILL. Cela suppose
--fork.
- --mount-proc[=point_de_montage]
- Juste avant d’exécuter le programme, monter le
système de fichiers proc sur point_de_montage (/proc
par défaut). C’est utile lors de la création
d’un nouvel espace de noms PID. Cela implique aussi la
création d’un nouvel espace de noms montage, sinon le
montage de /proc perturberait les programmes existants sur le
système. Le nouveau système de fichiers proc est
explicitement monté comme privé (par
MS_PRIVATE|MS_REC).
- --map-user=uid|nom
- Exécuter le programme seulement après que les ID effectifs
des utilisateurs actuels soient mappés à uid. Si
cette option est indiquée plusieurs fois, la dernière
occurrence prévaudra. Cette option implique --user.
- --map-group=gid|nom
- Exécuter le programme seulement après que les ID effectifs
des groupes actuels soient mappés à gid. Si cette
option est indiquée plusieurs fois, la dernière occurrence
prévaudra. Cette option suppose --setgroups=deny et
--user.
- -r,
--map-root-user
- Exécuter le programme seulement après que les identifiants
d’utilisateur et de groupe effectifs ont été mis en
correspondance avec les UID et GID du superutilisateur dans
l’espace de noms utilisateur nouvellement créé. Cela
permet d’obtenir facilement les capacités nécessaires
pour gérer divers aspects des espaces de noms nouvellement
créés (comme la configuration d’interfaces dans
l’espace de noms réseau ou le montage des systèmes de
fichiers dans l’espace de noms montage) même lors
d’une exécution ordinaire. En tant que fonctionnalité
surtout pratique, elle ne permet pas des cas d’utilisation plus
sophistiqués comme la mise en correspondance de plusieurs
intervalles d’UID et GID. Cette option implique
--setgroups=deny et --user. Cette option est
équivalente à --map-user=0 --map-group=0.
- -c,
--map-current-user
- Exécuter le programme seulement après que les ID effectifs
des utilisateurs et des groupes actuels sont mappés aux
mêmes UID et GID dans l’espace de noms nouvellement
créé. Cette option suppose --setgroups=deny et
--user. Cette option est équivalente à
--map-user=$(id -ru) --map-group=$(id -rg).
- --propagation
private|shared|slave|unchanged
- De manière récursive, régler le drapeau de
propagation de montage dans le nouvel espace de noms montage. Le
comportement par défaut est de régler la propagation
à private. Il est possible de désactiver cette
caractéristique avec l’argument unchanged. Cette
option est ignorée silencieusement quand l’espace de noms
montage (--mount) n’est pas nécessaire.
- --setgroups
allow|deny
- Permettre ou interdire l’appel système setgroups(2)
dans les espaces de noms utilisateur.
Pour pouvoir appeler setgroups(2), le processus
appelant doit au moins avoir CAP_SETGID. Mais depuis Linux 3.19,
une restriction supplémentaire est appliquée : le
noyau accorde la permission à l’appel setgroups(2)
seulement après que le mappage de GID
(/proc/pid/gid_map) a été
réglé. La carte de correspondances de GID peut être
écrite par le superutilisateur quand setgroups(2) est
activé (c'est-à-dire, allow, le comportement par
défaut), et la carte de GID peut être écrite par
des processus normaux quand setgroups(2) est
désactivé de façon permanente (avec
deny).
- -R,
--root=répertoire
- Exécuter la commande avec le répertoire racine défini
à répertoire.
- -w,
--wd=répertoire
- Changer le répertoire de travail à
répertoire.
- -S, --setuid
UID
- Définir l’identifiant d’utilisateur qui sera
utilisé dans l’espace de noms saisi.
- -G, --setgid
GID
- Définir l’identifiant de groupe qui sera utilisé dans
l’espace de noms saisi et abandonner les autres groupes.
- --monotonic
décalage
- Régler le décalage de CLOCK_MONOTONIC qui sera
utilisé dans l’espace de noms temps saisi. Cette option
nécessite de ne plus partager un espace de noms temps avec
--time.
- --boottime
décalage
- Régler le décalage de CLOCK_BOOTTIME qui sera
utilisé dans l’espace de noms temps saisi. Cette option
nécessite de ne plus partager un espace de noms temps avec
--time.
- -V, --version
- Afficher le nom et la version du logiciel et quitter.
- -h, --help
- Afficher l’aide-mémoire puis quitter.
Les systèmes de fichiers proc et sysfs montés comme
racine dans un espace de noms utilisateur doivent être restreints de
façon qu’un utilisateur moins privilégié ne
puisse avoir davantage d’accès aux fichiers sensibles
qu’un utilisateur plus privilégié aurait rendus
indisponibles. En bref, la règle pour proc et sysfs est aussi
près que possible d’un montage lié.
La commande suivante crée un espace de noms PID, en
utilisant --fork pour garantir que l’exécution de la
commande est réalisée dans un processus enfant qui
(étant le premier processus dans l’espace de noms) a le
PID 1. L’option --mount-proc assure que le nouvel
espace de noms montage est aussi créé simultanément et
qu’un nouveau système de fichiers proc(5) est
monté contenant une information correspondant au nouvel espace de
noms PID. Quand la commande readlink se termine, les nouveaux espaces
de noms sont automatiquement détruits.
# unshare --fork --pid --mount-proc readlink /proc/self
1
En tant qu’utilisateur ordinaire, créer un nouvel
espace de noms où les accréditations sont mappées
à l’ID racine à l’intérieur de
l’espace de noms :
$ id -u; id -g
1000
1000
$ unshare --user --map-root-user \
sh -c 'whoami; cat /proc/self/uid_map /proc/self/gid_map'
root
0 1000 1
0 1000 1
La première des commandes suivantes crée un nouvel
espace de noms UTS persistant et modifie le nom d’hôte tel que
vu dans cet espace de noms. L’espace de noms est alors saisi avec
nsenter(1) dans le but d’afficher le nom d’hôte
modifié. Cette étape montre que l’espace de noms UTS
continue d’exister même si l’espace de noms n’a
pas de processus membre après que la commande unshare ait
terminé. L’espace de noms est alors détruit en retirant
le montage lié.
# touch /root/uts-ns
# unshare --uts=/root/uts-ns hostname TOTO
# nsenter --uts=/root/uts-ns hostname
TOTO
# umount /root/uts-ns
Les commandes suivantes établissent un espace de noms
montage permanent référencé par le montage lié
/root/namespaces/mnt. Dans le but d’assurer que la
création de ce montage lié soit une réussite, le
répertoire parent (/root/namespaces) est transformé en
montage lié dont le type de propagation n’est pas
shared.
# mount --bind /root/namespaces /root/namespaces
# mount --make-private /root/namespaces
# touch /root/namespaces/mnt
# unshare --mount=/root/namespaces/mnt
Les commandes suivantes montrent l’utilisation de
l’option --kill-child lors de la création
d’espace de noms PID, dans le but d’assurer que lorsque
unshare est tué, tous les autres processus dans
l’espace de noms PID soient tués.
# set +m # Ne pas imprimer les messages d’état de travaux
# unshare --pid --fork --mount-proc --kill-child -- \
bash --norc -c '(sleep 555 &) && (ps a &) && sleep 999' &
[1] 53456
# PID TTY STAT TIME COMMAND
1 pts/3 S+ 0:00 sleep 999
3 pts/3 S+ 0:00 sleep 555
5 pts/3 R+ 0:00 ps a
# ps h -o 'comm' $! # Montrer que le dorsal de travail est unshare(1)
unshare
# kill $! # Tuer unshare(1)
# pidof sleep
La commande pidof n’affiche rien car le processus
sleep a été tué. Plus précisément,
quand le processus sleep ayant le PID 1 dans l’espace
de noms (c'est-à-dire, le processus init de l’espace de noms)
a été tué, cela a entrainé que tous les autres
processus soient tués. En revanche, une série de commandes
similaires où l’option --kill-child n’est pas
utilisée montre que quand unshare se termine, les processus
dans l’espace de noms PID ne sont pas tués :
# unshare --pid --fork --mount-proc -- \
bash --norc -c '(sleep 555 &) && (ps a &) && sleep 999' &
[1] 53479
# PID TTY STAT TIME COMMAND
1 pts/3 S+ 0:00 sleep 999
3 pts/3 S+ 0:00 sleep 555
5 pts/3 R+ 0:00 ps a
# kill $!
# pidof sleep
53482 53480
L’exemple suivant montre la création d’un
espace de noms temps où l’horloge
« boottime » est réglée à
un point plusieurs années en arrière :
# uptime -p # Afficher le temps de fonctionnement
# dans l’espace de noms temps initial
up 21 hours, 30 minutes
# unshare --time --fork --boottime 300000000 uptime -p
up 9 years, 28 weeks, 1 day, 2 hours, 50 minutes
La commande unshare fait partie du paquet util-linux, elle
est disponible sur
<https://www.kernel.org/pub/linux/utils/util-linux/>.
La traduction française de cette page de manuel a
été créée par Christophe Blaess
<ccb@club-internet.fr>, Michel Quercia <quercia AT cal DOT enst DOT
fr>, Thierry Vignaud <tvignaud@mandriva.com>,
Frédéric Delanoy <delanoy_f@yahoo.com>, Thierry Vignaud
<tvignaud@mandriva.com>, Christophe Sauthier
<christophe@sauthier.com>, Sébastien Blanchet,
Jérôme Perzyna <jperzyna@yahoo.fr>, Aymeric Nys
<aymeric AT nnx POINT com>, Alain Portal
<aportal@univ-montp2.fr>, Thomas Huriaux
<thomas.huriaux@gmail.com>, Yves Rütschlé
<l10n@rutschle.net>, Jean-Luc Coulon (f5ibh)
<jean-luc.coulon@wanadoo.fr>, Julien Cristau
<jcristau@debian.org>, Philippe Piette
<foudre-blanche@skynet.be>, Jean-Baka Domelevo-Entfellner
<domelevo@gmail.com>, Nicolas Haller <nicolas@boiteameuh.org>,
Sylvain Archenault <sylvain.archenault@laposte.net>, Valéry
Perrin <valery.perrin.debian@free.fr>, Jade Alglave
<jade.alglave@ens-lyon.org>, Nicolas François
<nicolas.francois@centraliens.net>, Alexandre Kuoch
<alex.kuoch@gmail.com>, Lyes Zemmouche <iliaas@hotmail.fr>,
Florentin Duneau <fduneau@gmail.com>, Alexandre Normand
<aj.normand@free.fr> et David Prévot
<david@tilapin.org>
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 à
debian-l10n-french@lists.debian.org.