एक की स्थापना से पहले एक माउंट नेमस्पेस दर्ज करना chroot
, आपको अतिरिक्त नाम के साथ मेजबान नामस्थान को अव्यवस्थित करने से बचने की सुविधा देता है, उदाहरण के लिए /proc
। आप chroot
एक अच्छे और सरल हैक के रूप में माउंट नेमस्पेस के अंदर उपयोग कर सकते हैं ।
मुझे लगता है कि समझने के फायदे हैं pivot_root
, लेकिन इसमें सीखने की अवस्था थोड़ी है। प्रलेखन काफी सब कुछ नहीं समझाता है ... हालांकि man 8 pivot_root
(शेल कमांड के लिए) में एक उपयोग उदाहरण है । man 2 pivot_root
(सिस्टम कॉल के लिए) स्पष्ट हो सकता है यदि उसने ऐसा ही किया हो, और एक उदाहरण C प्रोग्राम शामिल किया हो।
Pivot_root का उपयोग कैसे करें
माउंट नेमस्पेस में प्रवेश करने के तुरंत बाद, आपको आवश्यकता भी है mount --make-rslave /
या समकक्ष। अन्यथा, आपके सभी माउंट परिवर्तन मूल नामस्थान में mounts तक प्रचार करते हैं, जिनमें शामिल हैं pivot_root
। आप ऐसा नहीं चाहते हैं :)।
यदि आपने unshare --mount
कमांड का उपयोग किया है , तो ध्यान दें कि यह mount --make-rprivate
डिफ़ॉल्ट रूप से लागू करने के लिए प्रलेखित है । AFAICS यह एक खराब डिफ़ॉल्ट है और आप इसे उत्पादन कोड में नहीं चाहते हैं। इस बिंदु पर, यह eject
मेजबान नामस्थान में एक घुड़सवार डीवीडी या यूएसबी पर काम करने से रोक देगा । डीवीडी या USB निजी माउंट ट्री के अंदर रखा जाएगा, और कर्नेल आपको डीवीडी से बाहर नहीं निकलने देगा।
एक बार जब आप ऐसा कर लेते हैं, तो आप उस /proc
निर्देशिका को माउंट कर सकते हैं जिसका उपयोग आप कर रहे हैं। उसी तरह जो आप करेंगे chroot
।
जब आप उपयोग करते हैं chroot
, तो इसके विपरीत pivot_root
यह आवश्यक है कि आपका नया रूट फाइल सिस्टम एक आरोह बिंदु हो। यदि यह पहले से ही एक नहीं है, तो आप इसे केवल बाइंड माउंट लागू करके संतुष्ट कर सकते हैं mount --rbind new_root new_root
:।
का उपयोग करें pivot_root
- और फिर umount
पुराने रूट फाइलसिस्टम -l
/ MNT_DETACH
विकल्प के साथ। ( आपको ज़रूरत नहीं है umount -R
, जो अधिक समय ले सकता है। )
तकनीकी रूप से, pivot_root
आम तौर पर उपयोग करने की आवश्यकता होती है chroot
; यह "या तो-या" नहीं है।
प्रति के रूप में man 2 pivot_root
, इसे केवल माउंट नेमस्पेस की रूट स्वैपिंग के रूप में परिभाषित किया गया है। यह निर्धारित करने के लिए परिभाषित नहीं किया गया है कि कौन सी भौतिक निर्देशिका प्रक्रिया रूट इंगित कर रही है। या वर्तमान कार्य निर्देशिका ( /proc/self/cwd
)। ऐसा होता है कि यह ऐसा करता है, लेकिन कर्नेल थ्रेड को संभालने के लिए यह एक हैक है। मैनपेज कहता है कि भविष्य में बदल सकता है।
आमतौर पर आप यह क्रम चाहते हैं:
chdir(new_root); // cd new_root
pivot_root(".", put_old); // pivot_root . put_old
chroot("."); // chroot .
chroot
इस क्रम में पोस्टिंग एक और सूक्ष्म विवरण है । हालाँकि pivot_root
, इसका नाम माउंट नेमस्पेस को पुनर्व्यवस्थित करने के लिए है, कर्नेल कोड को रूट-फाइल सिस्टम को खोजने के लिए लगता है कि प्रति-प्रोसेस रूट को देखकर, जो कि chroot
सेट है।
Pivot_root का उपयोग क्यों करें
सिद्धांत रूप में, यह pivot_root
सुरक्षा और अलगाव के लिए उपयोग करने के लिए समझ में आता है । मुझे क्षमता-आधारित सुरक्षा के सिद्धांत के बारे में सोचना पसंद है । आप आवश्यक विशिष्ट संसाधनों की एक सूची में पास करते हैं, और यह प्रक्रिया अन्य संसाधनों तक नहीं पहुंच सकती है। इस मामले में हम माउंट नेमस्पेस में पारित फाइल सिस्टम के बारे में बात कर रहे हैं। यह विचार आम तौर पर लिनक्स "नेमस्पेस" सुविधा पर लागू होता है, हालांकि मैं शायद इसे बहुत अच्छी तरह से व्यक्त नहीं कर रहा हूं।
chroot
केवल प्रक्रिया रूट सेट करता है, लेकिन प्रक्रिया अभी भी पूर्ण माउंट नामस्थान को संदर्भित करती है। यदि कोई प्रक्रिया प्रदर्शन करने के लिए विशेषाधिकार बरकरार रखती है chroot
, तो यह फाइलसिस्टम नामस्थान का बैक अप ले सकता है। जैसा कि विस्तृत है man 2 chroot
, "सुपरयुजर एक ... चेरोट जेल 'से बच सकता है ..."।
पूर्ववत करने का एक और सोचा-समझा तरीका chroot
है nsenter --mount=/proc/self/ns/mnt
। यह शायद सिद्धांत का एक मजबूत तर्क है। nsenter
/ setns()
आवश्यक रूप से माउंट नेमस्पेस के रूट से प्रक्रिया रूट को फिर से लोड करता है ... हालांकि यह तथ्य कि जब यह काम करता है जब दोनों अलग-अलग भौतिक निर्देशिकाओं को संदर्भित करते हैं, तो इसे कर्नेल बग माना जा सकता है। (तकनीकी नोट: रूट पर एक दूसरे के ऊपर कई फाइल सिस्टम लगाए जा सकते हैं; setns()
शीर्ष का उपयोग करता है, सबसे हाल ही में एक घुड़सवार)।
यह "पीआईडी नाम स्थान" के साथ माउंट नेमस्पेस के संयोजन के एक लाभ को दर्शाता है। एक पीआईडी नामस्थान के अंदर होने से आप एक अपरिभाषित प्रक्रिया के माउंट नामस्थान में प्रवेश करने से रोकेंगे। यह आपको एक अपरिभाषित प्रक्रिया ( /proc/$PID/root
) की जड़ में प्रवेश करने से भी रोकता है । और निश्चित रूप से एक पीआईडी नाम स्थान भी आपको किसी भी प्रक्रिया को मारने से रोकता है जो इसके बाहर है :-)।
pivot_root
औरchroot
मैंने डॉकर स्रोतों पर एक नज़र डाली और पाया कि अगर यह निष्पादित करने में विफल रहता हैpivot_root
, तो यह वापस गिर जाता हैchroot
, अर्थात ये तंत्र कम से कम कंटेनरीकरण प्रयोजनों के लिए कार्यक्षमता में समान माना जाता है।