अगर लिनक्स कंटेनर (LXC कंटेनर) को "अनप्रिविल्ड" कहा जाता है तो इसका क्या मतलब है?
अगर लिनक्स कंटेनर (LXC कंटेनर) को "अनप्रिविल्ड" कहा जाता है तो इसका क्या मतलब है?
जवाबों:
गैर विशेषाधिकार LXC कंटेनर का इस्तेमाल कर रही हैं उपयोगकर्ता नामस्थान ( userns )। यानी एक कर्नेल फीचर जो मेजबान पर यूआईडी की एक श्रृंखला को एक नेमस्पेस में मैप करने की अनुमति देता है जिसके अंदर यूआईडी 0 वाला उपयोगकर्ता फिर से मौजूद हो सकता है।
कुछ समय के लिए अनपेक्षित एलएक्ससी कंटेनरों की मेरी प्रारंभिक धारणा के विपरीत, इसका मतलब यह नहीं है कि कंटेनर को एक अप्रकाशित होस्ट उपयोगकर्ता के स्वामित्व में होना चाहिए। वह केवल एक संभावना है।
प्रासंगिक है:
usermod [-v|-w|--add-sub-uids|--add-sub-gids]
) के लिए अधीनस्थ यूआईडी और जीआईडी की एक सीमा परिभाषित की गई हैlxc.id_map = ...
)यहां तक कि root
अप्रकाशित कंटेनरों के मालिक भी हो सकते हैं, क्योंकि मेजबान पर कंटेनर प्रक्रियाओं के प्रभावी यूआईडी मैपिंग द्वारा परिभाषित सीमा के अंदर समाप्त हो जाएंगे।
हालाँकि, इसके लिए root
आपको पहले अधीनस्थ आईडी को परिभाषित करना होगा। विपरीत उन के माध्यम से बनाया adduser
, root
डिफ़ॉल्ट रूप से परिभाषित अधीनस्थ आईडी की एक सीमा नहीं होगी।
यह भी ध्यान रखें कि आपके द्वारा दी गई पूरी सीमा आपके निपटान में है, इसलिए आपके पास निम्नलिखित कॉन्फ़िगरेशन लाइनों के साथ 3 कंटेनर हो सकते हैं (केवल यूआईडी मानचित्रण दिखाया गया है):
lxc.id_map = u 0 100000 100000
lxc.id_map = u 0 200000 100000
lxc.id_map = u 0 300000 100000
यह मानते हुए कि root
100000 और 400000 के बीच अधीनस्थ यूआईडी का मालिक है। मैंने पाया कि सभी दस्तावेज प्रति कंटेनर 65536 अधीनस्थ आईडी का उपयोग करने का सुझाव देते हैं, कुछ इसे अधिक मानव-पठनीय बनाने के लिए 100000 का उपयोग करते हैं, हालांकि।
दूसरे शब्दों में: आपको प्रत्येक कंटेनर में एक ही रेंज असाइन करने की आवश्यकता नहीं है।
4 बिलियन से अधिक (~ 2^32
) संभव अधीनस्थ आईडी का मतलब है कि आप अपने मेजबान उपयोगकर्ताओं के अधीनस्थ श्रेणियों से निपटने के दौरान उदार हो सकते हैं।
फिर से रगड़ने के लिए। एक अप्रकाशित LXC अतिथि को मेजबान पर एक अप्रकाशित उपयोगकर्ता द्वारा चलाने की आवश्यकता नहीं है।
इस तरह से एक अधीनस्थ यूआईडी / जीआईडी मैपिंग के साथ अपने कंटेनर को कॉन्फ़िगर करना:
lxc.id_map = u 0 100000 100000
lxc.id_map = g 0 100000 100000
जहां root
होस्ट पर मौजूद उपयोगकर्ता उस दिए गए अधीनस्थ ID श्रेणी का मालिक है, आपको मेहमानों को और भी बेहतर बनाने की अनुमति देगा।
हालांकि, ऐसे परिदृश्य में एक महत्वपूर्ण अतिरिक्त लाभ है (और हाँ, मैंने सत्यापित किया है कि यह काम करता है): आप सिस्टम स्टार्टअप पर अपना कंटेनर ऑटो-स्टार्ट कर सकते हैं।
आमतौर पर जब LXC के बारे में जानकारी के लिए वेब पर दस्तखत किया जाता है, तो आपको बताया जाएगा कि यह एक unprivileged LXC अतिथि को ऑटोस्टार्ट करना संभव नहीं है। हालाँकि, यह केवल उन कंटेनरों के लिए डिफ़ॉल्ट रूप से सही है जो कंटेनर के लिए सिस्टम-वाइड स्टोरेज में नहीं हैं (आमतौर पर ऐसा कुछ /var/lib/lxc
)। यदि वे हैं (जो आमतौर पर इसका मतलब है कि वे जड़ द्वारा बनाए गए थे और जड़ द्वारा शुरू किए गए हैं), तो यह पूरी तरह से अलग कहानी है।
lxc.start.auto = 1
एक बार जब आप इसे अपने कंटेनर कॉन्फ़िगर में रख देंगे, तो यह काम काफी अच्छे से होगा।
मैंने अपने आप से थोड़ा संघर्ष किया, इसलिए मैं यहां एक खंड जोड़ रहा हूं।
कॉन्फ़िगरेशन स्निपेट के अलावा lxc.include
जिसके माध्यम से आमतौर पर नाम /usr/share/lxc/config/$distro.common.conf
(जहां $distro
एक डिस्ट्रो का नाम है) जाता है, आपको यह देखना चाहिए कि क्या /usr/share/lxc/config/$distro.userns.conf
आपके सिस्टम पर भी है और इसमें भी शामिल है। उदाहरण के लिए:
lxc.include = /usr/share/lxc/config/ubuntu.common.conf
lxc.include = /usr/share/lxc/config/ubuntu.userns.conf
इसके अलावा अधीनस्थ आईडी मैपिंग जोड़ें:
lxc.id_map = u 0 100000 65535
lxc.id_map = g 0 100000 65535
जिसका अर्थ है कि होस्ट UID 100000 LXC अतिथि के उपयोगकर्ता नामस्थान के root
अंदर है।
अब सुनिश्चित करें कि अनुमतियाँ सही हैं। यदि आपके अतिथि का नाम उस पर्यावरण चर में संग्रहित किया जाएगा जिसे $lxcguest
आप निम्नलिखित में से किसी एक में चलाएंगे:
# Directory for the container
chown root:root $(lxc-config lxc.lxcpath)/$lxcguest
chmod ug=rwX,o=rX $(lxc-config lxc.lxcpath)/$lxcguest
# Container config
chown root:root $(lxc-config lxc.lxcpath)/$lxcguest/config
chmod u=rw,go=r $(lxc-config lxc.lxcpath)/$lxcguest/config
# Container rootfs
chown 100000:100000 $(lxc-config lxc.lxcpath)/$lxcguest/rootfs
chmod u=rwX,go=rX $(lxc-config lxc.lxcpath)/$lxcguest/rootfs
आपको अपने पहले प्रयास के बाद कुछ अनुमति-संबंधी त्रुटियां होने के बाद कंटेनर चलाने की अनुमति देनी चाहिए।
chroot
मदद कर सकता है, लेकिन एलएक्ससी पूरे सिस्टम को कंटेनरीकृत करने के लिए विभिन्न नाम रिक्त स्थान (यूटीएस, माउंट आदि ...) को जोड़ती है।
unshare
पहले से ही यह किसी भी / सभी विभिन्न नामस्थानों के लिए admirably करता है - और यहां तक कि आपको /proc
एक एकल क्ली-स्विच के साथ एक अलग, निजी माउंट भी मिलेगा । यदि आपका एकल आवेदन है init
और आपका chroot
है initramfs
तो आपको सेकंड फ्लैट में एक पूरा कंटेनर मिलता है।
0xC0000022L पर फॉलोअप करने के लिए, जिसके समाधान ने मेरे लिए ठीक काम किया, मैंने आवश्यक स्वामित्व परिवर्तनों को स्वचालित करने के लिए वृद्धि -uid-gid.pl पर्ल स्क्रिप्ट लिखी ताकि LXC कंटेनरों के भीतर फाइलें ठीक से मैप की जा सकें।
इसके बिना, इस प्रस्तावित सेटअप के साथ, LXC कंटेनर रूटफ़ के भीतर एक फ़ाइल मुख्य होस्ट पर 0 / रूट से संबंधित होगी, LXC कंटेनर के भीतर, 65534 / कोई भी मैप नहीं किया जाएगा। LXC कंटेनर के भीतर 0 / रूट पर मैप किए जाने के लिए, उन्हें होस्ट पर 100000 होना चाहिए।
यह यहां वर्णित है https://yeupou.wordpress.com/2017/06/23/setting-up-lxc-containers-with-mapped-giduid/ और स्क्रिप्ट सीधे gitlab https://gitlab.com पर प्राप्त की जा सकती है /yeupou/stalag13/blob/master/usr/local/bin/increase-uid-gid.pl
lxc
इस तरह की चीज की जरूरत नहीं है। आपutil-linux
टूल का उपयोग करके किसी भी प्रकार का नाम स्थान कंटेनर बना सकते हैंunshare
। आपutil-linux
उपकरण का उपयोग करके उक्त कंटेनर में प्रवेश कर सकते हैंnsenter
। बाद वाला टूल आपको इसके बिना पहले से निर्मित कंटेनर में चल रही प्रक्रियाओं को जोड़ने की अनुमति देता है। नामस्थान समर्थन को-कर्नेल में लागू किया गया है।