สิ่งที่ฉันทำที่นี่คือการทดสอบว่ารากของinitกระบวนการ (PID 1) เหมือนกับรากของกระบวนการปัจจุบันหรือไม่ แม้ว่า/proc/1/rootจะเป็นลิงก์ไปยัง/(เว้นแต่initตัวเองจะถูก chrooted แต่ไม่ใช่กรณีที่ฉันสนใจ) หลังจากนั้นมันจะนำไปสู่ไดเรกทอรีราก "หลัก" เทคนิคนี้ใช้ในสคริปต์บำรุงรักษาสองสามตัวใน Debian เช่นข้ามการเริ่มต้น udev หลังจากติดตั้งใน chroot
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
echo "We are chrooted!"
else
echo "Business as usual"
fi
(โดยวิธีนี้เป็นอีกตัวอย่างหนึ่งของเหตุผลที่อื่นchrootเป็นประโยชน์สำหรับการรักษาความปลอดภัยถ้ากระบวนการ chrooted มีการเข้าถึงราก. กระบวนการที่ไม่ใช่รากไม่สามารถอ่าน/proc/1/rootแต่พวกเขาสามารถทำตาม/proc/1234/rootถ้ามีกระบวนการทำงานด้วย PID 1234 ทำงานตามที่เดียวกัน ผู้ใช้.)
หากคุณไม่มีสิทธิ์รูทคุณสามารถดู/proc/1/mountinfoและ/proc/$$/mountinfo(จัดทำเอกสารสั้น ๆ ในfilesystems/proc.txtเอกสารประกอบเคอร์เนล Linux ) ไฟล์นี้สามารถอ่านได้ทั่วโลกและมีข้อมูลจำนวนมากเกี่ยวกับจุดเชื่อมต่อแต่ละจุดในมุมมองของกระบวนการของระบบไฟล์ พา ธ ในไฟล์นั้นถูก จำกัด โดย chroot ที่มีผลต่อกระบวนการของผู้อ่านหากมี ถ้าอ่านกระบวนการ/proc/1/mountinfoเป็น chrooted เข้าสู่ระบบแฟ้มที่แตกต่างจากรากทั่วโลก (สมมติว่าราก pid 1 เป็นรากที่ทั่วโลก) แล้วเข้าไม่ปรากฏใน/ /proc/1/mountinfoหากการอ่านกระบวนการ/proc/1/mountinfoถูก chrooted ไปยังไดเร็กทอรีบนระบบไฟล์โกลบอลรูทแล้วรายการสำหรับ/จะปรากฏขึ้น/proc/1/mountinfoแต่มีเมาต์ id ต่างกัน อนึ่งฟิลด์รูต ($4) ระบุตำแหน่งที่ chroot อยู่ในระบบไฟล์หลัก
[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
นี่เป็นโซลูชัน Linux ที่แท้จริง มันอาจจะเป็น generalizable สำหรับตัวแปร Unix อื่น ๆ ที่มีความคล้ายคลึงกันพอสมควร/proc(Solaris มีความคล้ายคลึงกัน/proc/1/rootฉันคิดว่า แต่ไม่ใช่mountinfo)