लिनक्स नेमस्पेस के साथ चेरोट कैसे प्रदर्शन करें?


14

लिनक्स नेमस्पेस के बारे में पढ़ने के बाद मैं इस धारणा के तहत था कि वे बहुत सारी अन्य सुविधाओं के बीच हैं, जो कि क्रॉट का एक विकल्प है। उदाहरण के लिए, इस लेख में :

[नामस्थान] के अन्य उपयोगों में शामिल हैं [...] चेरोट () - एकल निर्देशिका पदानुक्रम के एक हिस्से के लिए एक प्रक्रिया का स्टाइल अलगाव।

हालाँकि, जब मैं माउंट नेमस्पेस को क्लोन करता हूं, उदाहरण के लिए निम्नलिखित कमांड के साथ, मैं अभी भी पूरे मूल रूट ट्री को देखता हूं।

unshare --mount -- /bin/bash

मैं समझता हूं कि अब मैं नए नेमस्पेस में अतिरिक्त माउंट करने में सक्षम हूं जो मूल नाम स्थान के साथ साझा नहीं किए जाते हैं और इस प्रकार यह अलगाव प्रदान करता है, लेकिन यह अभी भी एक ही मूल है, उदाहरण के /etcलिए दोनों नामों के लिए अभी भी समान है। क्या मुझे अभी भी chrootरूट बदलने की आवश्यकता है या कोई विकल्प है?

मैं उम्मीद कर रहा था कि यह प्रश्न एक उत्तर प्रदान करेगा, लेकिन उत्तर केवल उपयोग करता है chroot, फिर से।

EDIT # 1

अब एक हटाई गई टिप्पणी थी जिसका उल्लेख किया गया था pivot_root। चूंकि यह वास्तव में इसका हिस्सा है linux/fs/namespace.c, यह वास्तव में नामस्थान कार्यान्वयन का हिस्सा है। इससे पता चलता है कि केवल रूट डायरेक्टरी को बदलना संभव नहीं है unshareऔर mountसंभव नहीं है, लेकिन नेमस्पेस एक और अधिक चतुर संस्करण प्रदान करता है chroot। फिर भी मुझे इस दृष्टिकोण का मुख्य विचार नहीं मिलता है जो इसे chrootस्रोत कोड को पढ़ने के बाद भी मौलिक रूप से अलग बनाता है (उदाहरण के लिए सुरक्षा या बेहतर अलगाव के अर्थ में)।

EDIT # 2

यह इस प्रश्न की नकल नहीं है । उत्तर से सभी आदेशों को निष्पादित करने के बाद मेरे पास अलग /tmp/tmp.vyM9IwnKuY (या समान) है, लेकिन रूट निर्देशिका अभी भी वही है!


के बीच के अंतर के बारे में : pivot_rootऔर chrootमैंने डॉकर स्रोतों पर एक नज़र डाली और पाया कि अगर यह निष्पादित करने में विफल रहता है pivot_root, तो यह वापस गिर जाता है chroot, अर्थात ये तंत्र कम से कम कंटेनरीकरण प्रयोजनों के लिए कार्यक्षमता में समान माना जाता है।
दानिला किवर

जवाबों:


13

एक की स्थापना से पहले एक माउंट नेमस्पेस दर्ज करना 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) की जड़ में प्रवेश करने से भी रोकता है । और निश्चित रूप से एक पीआईडी ​​नाम स्थान भी आपको किसी भी प्रक्रिया को मारने से रोकता है जो इसके बाहर है :-)।


यह पहले से ही बहुत मदद करता है। फिर भी, मैं अनिश्चित हूं कि आप "नामस्थान के शीर्ष पर माउंट" से क्या मतलब है। और क्या इसे बदलने का कोई तरीका है?
कोलो जूल

1
@ कोको संपादित करें :-)। ps मुझे नहीं पता कि आपको "मेक-आरएसलेव" / "मेक-रिपील" के लिए फस्टब की आवश्यकता क्यों होगी। systemd का switch-root.c सिर्फ करता हैmount(NULL, "/", NULL, MS_REC|MS_PRIVATE, NULL)
sourcejedi

1
@ कोको और तब लिनक्स कर्नेल डेवलपर्स ने "रूटफ़्स" का इस्तेमाल किया जब उन्होंने एक चौथी चीज़ का नाम दिया :-P। unix.stackexchange.com/questions/152029/…
sourcejedi

1
यह उत्तर और अन्य @sourcejedi द्वारा असाधारण रूप से मददगार रहे हैं, मैंने पूछा होगा "pivot_root: व्यस्त नहीं हो सकता है" क्योंकि वह पहले से ही व्यस्त था ", लेकिन जवाब यहाँ पहले से ही था, जब तक काम नहीं चलेगा आलसी होumount -l ./oldroot
इयरकैम

1
हाल ही में कई स्पष्टीकरण के साथ pivot_root (2) मैन पेज पर एक अपडेट था , और इसमें अब एक उदाहरण कार्यक्रम शामिल है। आप इसे दर्शाने के लिए अपने उत्तर को अपडेट करना चाहते हैं? मैन पेज अब अच्छी pivot_root(".", ".")चाल भी बताता है , जो वास्तव pivot_rootमें अधिकांश परिस्थितियों ( chrootआवश्यक नहीं ) में उपयोग करने का सबसे आसान तरीका है ।
फिलिप वेन्डलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.