PID नाम स्थान बनाएँ
यहाँ उपयोग करने का सही आदेश है unshare
। ध्यान दें कि ऐसा करने के लिए आवश्यक विकल्प केवल से उपलब्ध हैं util-linux 2.23
। यह विचार है कि आप जिस प्रोग्राम को चला रहे हैं, उसके लिए एक नया पीआईडी नामस्थान बनाया जाए, इस नाम स्थान पर उसके सभी बच्चे भी बनाए गए हैं। आप बस एक नया PID नामस्थान में एक कमांड चला सकते हैं:
sudo unshare -fp some_command
एक शेल चलाने के लिए, बस कमांड को छोड़ दें। यह एक ऐसी प्रक्रिया बनाएगा, जिसमें अपने किसी भी बच्चे के साथ माता-पिता (सिस्टम) के नामस्थान के भीतर हमेशा की तरह एक पीआईडी होगा। हालांकि, नए नामस्थान के भीतर, 1
इस init
प्रक्रिया की कुछ विशेष विशेषताओं के साथ एक पीआईडी होगा । शायद एक निगरानी के दृष्टिकोण से सबसे अधिक प्रासंगिक विशेषता यह है कि यदि इसके किसी भी वंशज अनाथ हैं, तो वे वास्तविक init
प्रक्रिया के बजाय इस प्रक्रिया में फिर से सम्मिलित होंगे ।
ज्यादातर मामलों की निगरानी के लिए बस ऐसा करना काफी हो सकता है। जैसा कि पहले उल्लेख किया गया है, सभी नामस्थानों के भीतर की प्रक्रियाओं में मूल नाम स्थान के भीतर PID होते हैं, इसलिए उनकी गतिविधियों की निगरानी के लिए नियमित आदेशों का उपयोग किया जा सकता है। हमें यह भी आश्वासन दिया जाता है कि अगर नाम स्थान में कोई भी प्रक्रिया अनाथ हो जाती है, तो यह शीर्ष स्तर के कार्यक्रम के पीआईडी के नीचे प्रक्रिया पेड़ की शाखाओं से बाहर नहीं गिरेगी, जिसका अर्थ है कि इसे अभी भी आसानी से ट्रैक किया जा सकता है।
एक माउंट नेमस्पेस के साथ मिलाएं
हालाँकि, हम जो नहीं कर सकते हैं वह पीआईडी के संबंध में प्रक्रिया की निगरानी करता है जो यह सोचता है कि यह है। ऐसा करने के लिए, और विशेष रूप से ps
नए नामस्थान के भीतर कमांड का उपयोग करने में सक्षम होने के लिए , आपको नामस्थान के लिए एक अलग procfs
फाइल सिस्टम माउंट करने की आवश्यकता है । यह बदले में एक और समस्या की ओर जाता है क्योंकि एकमात्र स्थान जिसके लिए ps
स्वीकार करता procfs
है /proc
। एक समाधान यह होगा कि एक chroot
जेल बनाई जाए और procfs
वहां नया माउंट किया जाए । लेकिन यह एक बोझिल दृष्टिकोण है क्योंकि कम से कम हमें किसी भी बायनेरिज़ को कॉपी करने (या कम से कम हार्ड लिंक) की आवश्यकता होती है जिसे हम किसी भी पुस्तकालयों के साथ उपयोग करने का इरादा रखते हैं जो वे नई जड़ पर निर्भर करते हैं।
समाधान यह भी है कि एक नए माउंट नेमस्पेस का उपयोग किया जाए । इसके भीतर हम नए procfs
को सही तरीके से माउंट कर सकते हैं जो सही रूट /proc
निर्देशिका का उपयोग करता है , पीआईडी नाम स्थान के भीतर उपयोग करने योग्य हो सकता है और किसी और चीज के साथ हस्तक्षेप नहीं करता है। इस प्रक्रिया को बहुत सरल बनाने के लिए, unshare
कमांड --mount-proc
विकल्प देता है :
sudo unshare -fp --mount-proc some_command
अब ps
संयुक्त नामस्थानों के भीतर चलने पर केवल PID नामस्थान के साथ प्रक्रियाएँ दिखाई देंगी और यह PID होने के रूप में शीर्ष स्तर की प्रक्रिया दिखाएगी 1
।
किस बारे में nsenter
?
जैसा कि नाम से पता चलता है, nsenter
एक नामस्थान में प्रवेश करने के लिए इस्तेमाल किया जा सकता है जो पहले से बनाया गया है unshare
। यह उपयोगी है अगर हम नामपट के अंदर से जानकारी प्राप्त करना चाहते हैं अन्यथा असंबंधित लिपि से। सबसे आसान तरीका है कि नाम स्थान के भीतर चल रहे किसी भी कार्यक्रम के पीआईडी को एक्सेस करें। यह स्पष्ट करने के लिए कि नामस्थान के भीतर से लक्षित कार्यक्रम का पीआईडी होना चाहिए, जहां nsenter
से चलाया जा रहा है (क्योंकि नामस्थानों को नेस्ट किया जा सकता है, एक एकल प्रक्रिया के लिए कई पीआईडी होना संभव है)। लक्ष्य PID / माउंट नामस्थान में एक शेल चलाने के लिए, बस करें:
sudo nsenter -t $PID -m -p
यदि यह नामस्थान ऊपर की तरह सेट किया गया है, ps
तो अब उस नाम स्थान के भीतर केवल प्रक्रियाओं को सूचीबद्ध करेगा।