मैंने यहां जो किया है वह परीक्षण करने के लिए है कि क्या init
प्रक्रिया की जड़ (पीआईडी 1) वर्तमान प्रक्रिया की जड़ के समान है। हालाँकि /proc/1/root
, हमेशा एक लिंक होता है /
(जब तक कि init
खुद को काट दिया नहीं जाता है, लेकिन यह एक ऐसा मामला नहीं है जिसकी मुझे परवाह है), इसके बाद यह "मास्टर" रूट डायरेक्टरी की ओर जाता है। इस तकनीक का उपयोग डेबियन में कुछ रखरखाव लिपियों में किया जाता है, उदाहरण के लिए चेरोट में स्थापना के बाद udev को छोड़ना।
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
echo "We are chrooted!"
else
echo "Business as usual"
fi
(वैसे, यह अभी तक एक और उदाहरण है कि chroot
सुरक्षा के लिए बेकार क्यों है अगर चिरोट की गई प्रक्रिया की जड़ तक पहुंच है। गैर-रूट प्रक्रियाएं नहीं पढ़ सकती हैं /proc/1/root
, लेकिन /proc/1234/root
पीआईडी 1234 के साथ चलने वाली प्रक्रिया के समान होने पर वे अनुसरण कर सकते हैं। उपयोगकर्ता।)
यदि आपके पास रूट अनुमतियां नहीं हैं, तो आप ( /proc/1/mountinfo
और लिनक्स कर्नेल प्रलेखन में/proc/$$/mountinfo
संक्षिप्त रूप से filesystems/proc.txt
प्रलेखित ) देख सकते हैं। यह फ़ाइल विश्व-पठनीय है और इसमें फाइल सिस्टम की प्रक्रिया के बारे में प्रत्येक आरोह बिंदु के बारे में बहुत सारी जानकारी है। उस फ़ाइल में पथ रीडर प्रक्रिया को प्रभावित करने वाले वर्ण द्वारा प्रतिबंधित हैं, यदि कोई हो। यदि पढ़ने की प्रक्रिया /proc/1/mountinfo
एक फाइलसिस्टम में काट दी गई है जो वैश्विक रूट (पीआईडी 1 की जड़ वैश्विक रूट है) से अलग है, तो इसमें कोई प्रविष्टि /
दिखाई नहीं देती है /proc/1/mountinfo
। यदि पढ़ने की प्रक्रिया /proc/1/mountinfo
को वैश्विक रूट फाइलसिस्टम पर निर्देशिका में ले जाया जाता है, तो इसके लिए एक प्रविष्टि /
दिखाई देती है /proc/1/mountinfo
, लेकिन एक अलग माउंट आईडी के साथ। संयोग से, जड़ क्षेत्र ($4
) इंगित करता है कि चुरोट अपने मास्टर फाइल सिस्टम में कहां है।
[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
यह एक शुद्ध लिनक्स समाधान है। यह पर्याप्त रूप से समान /proc
(सोलारिस के समान है /proc/1/root
, मुझे लगता है, लेकिन नहीं mountinfo
) के साथ अन्य यूनिक्स वेरिएंट के लिए सामान्य हो सकता है ।