Apa yang saya lakukan di sini adalah untuk menguji apakah root dari initproses (PID 1) sama dengan root dari proses saat ini. Meskipun /proc/1/rootselalu merupakan tautan ke /(kecuali initdirinya chroot, tapi itu bukan masalah yang saya pedulikan), setelah itu mengarah ke direktori root "master". Teknik ini digunakan dalam beberapa skrip pemeliharaan di Debian, misalnya untuk melewatkan memulai udev setelah instalasi di chroot.
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
echo "We are chrooted!"
else
echo "Business as usual"
fi
(Omong-omong, ini adalah contoh lain mengapa chroottidak berguna untuk keamanan jika proses chroot memiliki akses root. Proses non-root tidak dapat membaca /proc/1/root, tetapi mereka dapat mengikuti /proc/1234/rootjika ada proses yang berjalan dengan PID 1234 berjalan sebagai sama pengguna.)
Jika Anda tidak memiliki izin root, Anda dapat melihat /proc/1/mountinfodan /proc/$$/mountinfo(secara singkat didokumentasikan dalam filesystems/proc.txtdokumentasi kernel Linux ). File ini dapat dibaca dunia dan berisi banyak informasi tentang setiap titik pemasangan dalam pandangan proses sistem file. Jalur dalam file tersebut dibatasi oleh chroot yang memengaruhi proses pembaca, jika ada. Jika proses membaca /proc/1/mountinfochroot ke sistem file yang berbeda dari root global (dengan asumsi root pid 1 adalah root global), maka tidak ada entri untuk /muncul di /proc/1/mountinfo. Jika pembacaan proses /proc/1/mountinfodilakukan chroot ke direktori pada sistem file root global, maka entri untuk /muncul /proc/1/mountinfo, tetapi dengan id mount berbeda. Kebetulan, bidang root ($4) menunjukkan di mana chroot berada di sistem file induknya.
[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
Ini adalah solusi Linux murni. Ini dapat digeneralisasikan untuk varian Unix lain dengan cukup mirip /proc(Solaris memiliki yang serupa /proc/1/root, saya pikir, tetapi tidak mountinfo).