CGroup नेमस्पेस एक लिनक्स कर्नेल सुविधा है जो नेमस्पेस के भीतर चल रहे प्रक्रियाओं के लिए cgroup हाइरार्की का अलगाव प्रदान करती है। Cgroups, कंट्रोल ग्रुप्स के लिए संक्षेप में हैं, एक कर्नेल सुविधा है जो प्रक्रियाओं को व्यवस्थित करने और सिस्टम संसाधनों पर सीमाएँ लागू करने की अनुमति देती है जैसे CPU, मेमोरी, और I/O।
हालांकि cgroup नेमस्पेस पहले चर्चा की गई अन्य नेमस्पेस प्रकार की तरह अलग नहीं हैं (PID, माउंट, नेटवर्क, आदि), वे नेमस्पेस अलगाव के अवधारणा से संबंधित हैं। Cgroup नेमस्पेस cgroup हाइरार्की का दृश्यकलीनीकरण करते हैं, इसका मतलब है कि cgroup नेमस्पेस में चल रही प्रक्रियाएं इस हाइरार्की का एक विभाजन ही देखेंगी, जो निर्माण प्रक्रिया के cgroup पर आधारित है।
काम कैसे करता है:
जब एक नया cgroup नेमस्पेस बनाया जाता है, यह निर्माण करने वाली प्रक्रिया के cgroup के आधार पर cgroup हाइरार्की का दृश्य शुरू होता है। इसका मतलब है कि नए cgroup नेमस्पेस में चल रही प्रक्रियाएं केवल पूरे cgroup हाइरार्की का एक उपसेट देखेंगी, जो निर्माण करने वाली प्रक्रिया के cgroup के उपवृक्ष पर आधारित है।
Cgroup नेमस्पेस के भीतर की प्रक्रियाएं अपने खुद के cgroup को हाइरार्की का मूल मानेंगी। इसका मतलब है कि, नेमस्पेस के अंदर से, उनका खुद का cgroup मूल के रूप में प्रकट होता है, और वे अपने उपवृक्ष के बाहर के cgroup को नहीं देख सकते या पहुंच सकते।
Cgroup नेमस्पेस सीधे संसाधनों का अलगाव प्रदान नहीं करते; वे केवल cgroup हाइरार्की के दृश्य का अलगाव प्रदान करते हैं। संसाधन नियंत्रण और अलगाव अब भी cgroup उप-प्रणालियों (जैसे cpu, मेमोरी, आदि) द्वारा प्रवर्तित किए जाते हैं।
यदि आप --mount-proc पैरामीटर का उपयोग करते हैं और /proc फ़ाइल सिस्टम का एक नया इंस्टेंस माउंट करते हैं, तो आप सुनिश्चित करते हैं कि नया माउंट नेमस्पेस के पास उस नेमस्पेस के लिए विशिष्ट प्रक्रिया सूचना का सटीक और अलग दृश्य है।
त्रुटि: bash: fork: कोई स्मृति समर्पित नहीं कर सकता
जब unshare को -f विकल्प के बिना निष्पादित किया जाता है, तो एक त्रुटि का सामना किया जाता है क्योंकि लिनक्स नए पीआईडी (प्रक्रिया आईडी) नेमस्पेस को कैसे संभालता है। मुख्य विवरण और समाधान नीचे दिए गए हैं:
समस्या का स्पष्टीकरण:
लिनक्स कर्नेल एक प्रक्रिया को unshare सिस्टम कॉल का उपयोग करके नए नेमस्पेस बनाने की अनुमति देता है। हालांकि, नया पीआईडी नेमस्पेस का निर्माण प्रारंभ करने वाली प्रक्रिया (जिसे "अनशेयर" प्रक्रिया कहा जाता है) नए नेमस्पेस में प्रवेश नहीं करती; केवल इसके बच्चे प्रक्रियाएँ करती हैं।
%unshare -p /bin/bash% चलाने से /bin/bash को unshare के साथ ही प्रक्रिया में शुरू किया जाता है। इस परिणामस्वरूप, /bin/bash और इसके बच्चे प्रक्रियाएँ मूल पीआईडी नेमस्पेस में होती हैं।
नए नेमस्पेस में /bin/bash की पहली बच्ची प्रक्रिया पीआईडी 1 बन जाती है। जब यह प्रक्रिया बाहर निकलती है, तो यदि कोई अन्य प्रक्रियाएँ नहीं हैं, तो यह नेमस्पेस की सफाई को ट्रिगर करती है, क्योंकि पीआईडी 1 के पास अनाथ प्रक्रियाओं को अपनाने की विशेष भूमिका होती है। इसके बाद लिनक्स कर्नेल उस नेमस्पेस में पीआईडी का आवंटन अक्षम कर देगा।
परिणाम:
नए नेमस्पेस में पीआईडी 1 का बाहर निकलना PIDNS_HASH_ADDING ध्वज की सफाई का कारण बनता है। इससे alloc_pid फ़ंक्शन एक नई प्रक्रिया बनाते समय नया पीआईडी आवंटित करने में विफल हो जाता है, "कोई स्मृति समर्पित नहीं कर सकता" त्रुटि उत्पन्न करते हैं।
समाधान:
समस्या को -f विकल्प के साथ unshare का उपयोग करके हल किया जा सकता है। यह विकल्प unshare को नए पीआईडी नेमस्पेस बनाने के बाद एक नई प्रक्रिया को फोर्क करता है।
%unshare -fp /bin/bash% निष्पादित करने से सुनिश्चित होता है कि unshare कमांड खुद ही नए नेमस्पेस में पीआईडी 1 बन जाता है। इस नए नेमस्पेस में /bin/bash और इसके बच्चे प्रक्रियाएँ सुरक्षित रूप से समाहित होती हैं, जिससे पीआईडी 1 का पहले से बाहर निकलना रोका जाता है और सामान्य पीआईडी आवंटन की अनुमति दी जाती है।
unshare को -f ध्वज के साथ चलाने से नया पीआईडी नेमस्पेस सही रूप से बनाए रखा जाता है, जिससे /bin/bash और इसके उप-प्रक्रियाएँ स्मृति समर्पण त्रुटि का सामना न करें।
sudofind/proc-maxdepth3-typel-namecgroup-execreadlink{} \; 2>/dev/null|sort-u# Find the processes with an specific namespacesudofind/proc-maxdepth3-typel-namecgroup-execls-l{} \; 2>/dev/null|grep<ns-number>
एक सीग्रुप नेमस्पेस के अंदर जाएं
nsenter-CTARGET_PID--pid/bin/bash
आप केवल रूट यदि आप अन्य प्रक्रिया नेमस्पेस में प्रवेश कर सकते हैं। और आप उसके बिना अन्य नेमस्पेस में प्रवेश नहीं कर सकते हैं जिसका संकेतक इसे पॉइंट कर रहा हो (जैसे /proc/self/ns/cgroup)।