Ce que j'ai fait ici est de vérifier si la racine du init
processus (PID 1) est identique à la racine du processus actuel. Bien que ce /proc/1/root
soit toujours un lien vers /
(à moins que init
lui-même ne soit chrooté, mais ce n’est pas un cas qui m’intéresse), cela conduit au répertoire racine «maître». Cette technique est utilisée dans quelques scripts de maintenance dans Debian, par exemple pour sauter le démarrage de udev après l’installation dans un chroot.
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
echo "We are chrooted!"
else
echo "Business as usual"
fi
(À propos, ceci est un autre exemple de la raison chroot
pour laquelle la sécurité est inutile si le processus chrooté a un accès root. Les processus non root ne peuvent pas lire /proc/1/root
, mais ils peuvent suivre /proc/1234/root
si un processus en cours d'exécution avec le PID 1234 s'exécute de la même manière. utilisateur.)
Si vous ne disposez pas des autorisations root, vous pouvez consulter /proc/1/mountinfo
et /proc/$$/mountinfo
(brièvement documenté dans la documentation filesystems/proc.txt
du noyau Linux ). Ce fichier est lisible par tout le monde et contient de nombreuses informations sur chaque point de montage dans la vue du processus du système de fichiers par le processus. Les chemins dans ce fichier sont limités par le chroot affectant le processus de lecture, le cas échéant. Si la lecture du processus /proc/1/mountinfo
est chrootée dans un système de fichiers différent de la racine globale (en supposant que la racine de pid 1 est la racine globale), aucune entrée pour /
s'affiche dans /proc/1/mountinfo
. Si la lecture du processus /proc/1/mountinfo
est chrootée dans un répertoire du système de fichiers racine global, une entrée pour, /
apparaît dans /proc/1/mountinfo
, mais avec un ID de montage différent. Incidemment, le champ racine ($4
) indique où se trouve le chroot dans son système de fichiers maître.
[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
Ceci est une solution purement Linux. Il peut être généralisable à d’autres variantes Unix avec une valeur suffisamment similaire /proc
(Solaris a une valeur similaire /proc/1/root
, je pense, mais pas mountinfo
).