pivot_root()
déplace la racine du système de fichiers pour le processus appelant
vers le répertoire
put_old
et fait de
new_root
la nouvelle racine du système de fichiers pour le processus appelant.
L'utilisation typique de
pivot_root()
est pendant le démarrage, lorsque le système
monte un système de fichiers temporaire (par exemple, un
initrd)
puis monte le véritable système de fichier,
et le transforme en racine pour tous les processus et threads concernés.
pivot_root()
peut changer ou non le répertoire de travail en cours de tous
les processus et threads qui utilisaient l'ancien répertoire racine.
L'appelant de
pivot_root()
doit s'assurer que les processus ayant pour racine ou répertoire
de travail l'ancien répertoire se comportent correctement.
Le meilleur moyen est de modifier leur répertoire de travail
et répertoire racine avant d'invoquer
pivot_root().
Le paragraphe ci-dessus est intentionellement flou,
car l'implémentation de
pivot_root()
peut changer dans le futur.
Actuellement,
pivot_root()
modifie la racine et le répertoire de travail de tous les
processus ou threads en
new_root
s'ils pointent sur l'ancien répertoire.
Ceci est nécessaire pour éviter que des threads du noyau ne conservent
l'ancien répertoire occupé, même s'ils accèdent au nouveau
système de fichiers.
Dans le futur, il y aura peut-être un mécanisme pour les threads
du noyau pour renoncer explicitement à tout accès au système de fichiers,
ce qui évitera ce mécanisme un peu invasif.
Notez que ceci s'applique aussi au processus appelant :
pivot_root()
peut changer ou non son répertoire de travail.
Il vaut mieux donc appeler
chdir(/)
immédiatement après
pivot_root().
Les restrictions suivantes s'appliquent à
new_root
et
put_old :
- -
-
Ils doivent être des répertoires,
- -
-
new_root
et
put_old
ne doivent pas être sur le même système de fichiers
que la racine actuelle.
- -
-
put_old
doit être un descendant de
new_root :
ajouter un nombre non nul de
/..
à la chaîne
put_old
doit ramener au même répertoire que
new_root.
- -
-
Aucun système de fichiers ne doit être monté sur
put_old.
Voir
pivot_root(8)
pour des exemples d'utilisation supplémentaires.
Si la racine en cours n'est pas un point de montage (après un
chroot(2)
ou un
pivot_root(),
voir plus bas), ce n'est pas l'ancien répertoire,
mais le point de montage du système de fichiers qui est monté dans
put_old.
new_root
n'a pas besoin d'être un point de montage.
Dans ce cas,
/proc/mounts
montrera le point de montage concernant
new_root
comme racine
(/).