Quello che ho fatto qui è di verificare se la radice del init
processo (PID 1) è la stessa della radice del processo corrente. Sebbene /proc/1/root
sia sempre un collegamento /
(a meno che non init
sia esso stesso chroot, ma non è un caso a cui tengo), seguirlo porta alla directory principale "master". Questa tecnica è usata in alcuni script di manutenzione in Debian, ad esempio per saltare l'avvio di udev dopo l'installazione in 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
(A proposito, questo è ancora un altro esempio del perché chroot
è inutile per la sicurezza se il processo chroot ha accesso root. I processi non root non possono leggere /proc/1/root
, ma possono seguire /proc/1234/root
se c'è un processo in esecuzione con PID 1234 in esecuzione come lo stesso utente.)
Se non si dispone dei permessi di root, è possibile consultare /proc/1/mountinfo
e /proc/$$/mountinfo
(brevemente documentato nella documentazione filesystems/proc.txt
del kernel Linux ). Questo file è leggibile in tutto il mondo e contiene molte informazioni su ciascun punto di montaggio nella vista del processo del filesystem. I percorsi in quel file sono limitati dal chroot che influenza il processo di lettura, se presente. Se la lettura del processo /proc/1/mountinfo
viene eseguita il chroot in un filesystem diverso dalla radice globale (supponendo che la radice di pid 1 sia la radice globale), allora non /
appare alcuna voce per /proc/1/mountinfo
. In caso la lettura processo /proc/1/mountinfo
è chroot in una directory sul filesystem di root globale, allora una voce per /
appare in /proc/1/mountinfo
, ma con un diverso montaggio id. Per inciso, il campo radice ($4
) indica dove si trova il chroot nel suo filesystem principale.
[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
Questa è una pura soluzione Linux. Potrebbe essere generalizzabile ad altre varianti di Unix con una sufficientemente simile /proc
(Solaris ha una simile /proc/1/root
, penso, ma non mountinfo
).