एक LXC / LXD कंटेनर में एक साझा होस्ट निर्देशिका जोड़ना


19

मैं Ubuntu 14.04 पर LXC / LXD के साथ प्रयोग कर रहा हूं और यह सभी बहुत अच्छा काम कर रहा है। मुझे बस यह पता लगाने की आवश्यकता है कि मेरे मेजबान मशीन और एक कंटेनर के बीच काम करने वाले साझा निर्देशिकाओं को कैसे प्राप्त किया जाए ताकि मैं एक बार और सभी के लिए वर्चुअलबॉक्स को खोद सकूं।

मैंने यह पृष्ठ देखा है: https://wiki.gentoo.org/wiki/LXD

जो निर्देश प्रदान करता है, लेकिन मुझे सिर्फ त्रुटियाँ मिलती रहती हैं।

क्या किसी को भी किसी भी सरल, स्पष्ट निर्देशों का पता है कि यह काम कर रहा है? किसी भी मदद की बहुत सराहना की।


2
मैं का उपयोग कर एक मेजबान निर्देशिका माउंट करने के लिए प्रबंधित किया है: lxc config device add confexample sharedtmp disk path=/tmp source=/tmp/shared। लेकिन कंटेनर के डायरेक्टरी को देखते हुए वहां मौजूद फाइलों के मालिक और समूह को 'कोई नहीं' और 'नोग्रुप' पर सेट किया जाता है और माउंट को केवल पढ़ा जाता है।
user47227

क्या आप कृपया थोड़ा और विवरण जोड़ सकते हैं? क्या वास्तव में आप क्या किया, क्या हासिल करना चाहते हैं की थी और क्या बजाय क्या हुआ? क्या आपको कोई चेतावनी या त्रुटि संदेश मिला है? कृपया अपने प्रश्न में उन्हें उनकी संपूर्णता में पुन: प्रस्तुत करें। आप उबंटू में टर्मिनल सामग्री और अधिकांश संवाद संदेशों का चयन, कॉपी और पेस्ट कर सकते हैं। (देखें कि मैं एक अच्छा सवाल कैसे पूछ सकता हूँ? )
डेविड फ़ॉस्टर

मान लें कि आप एक अनपेक्षित कंटेनर का उपयोग कर रहे हैं और UID / GID मैपिंग समस्या है, तो LXD के साथ उपयोगकर्ता मैपिंग के बारे में लेख के इस भाग पर एक नज़र डालें । हालाँकि, यह संभवतः LXD तरीके से जोड़ा गया था जब आपने अपना प्रश्न पूछा था।
0xC0000022L

मुझे नहीं पता कि किस संस्करण ने इसे जोड़ा है (मैं 2.18 पर हूं) लेकिन यदि संभव हो तो, आप lxc fileहोस्ट और कंटेनर के बीच फ़ाइलों को स्थानांतरित करने के लिए भी उपयोग कर सकते हैं , pushऔर pull
code_dredd

जवाबों:


21

Https://wiki.gentoo.org/wiki/LXD पर आपके द्वारा उल्लेखित निर्देश सही हैं, लेकिन थोड़ा और स्पष्टीकरण की आवश्यकता हो सकती है।

मेजबान पर आप पहले उस निर्देशिका के स्वामित्व की जांच करते हैं जिसमें कंटेनर डेटा संग्रहीत है। Daud

sudo ls -l /var/lib/lxd/containers

और उस कंटेनर के स्वामी की जांच करें जिसे आप निर्देशिका के साथ साझा करना चाहते हैं। मेरे मामले में uidऔर gidदोनों 100000 थे।

इसके बाद, जिस निर्देशिका को आप साझा करना चाहते हैं उसका स्वामित्व बदलने के लिए इनका उपयोग करें:

sudo chown 100000:100000 /tmp/share_on_host

अपनी टिप्पणी में आपके द्वारा बताए गए तरीके से कंटेनर के साथ निर्देशिका साझा करें:

lxc config device add mycontainer sharedtmp disk \
                  path=/tmp/share_on_guest source=/tmp/share_on_host

अब, कंटेनर में, आप देखेंगे कि निर्देशिका /tmp/share_on_guest(मैं आपकी निर्देशिका को माउंट करने की सलाह नहीं दूंगा /tmpक्योंकि इसका उपयोग सिस्टम द्वारा अन्य सामान के लिए किया जाता है और विशेष अनुमतियाँ होती हैं) रूट के स्वामित्व में हैं। यहाँ से आप उपयोग कर सकते हैं पर chownकंटेनर में उचित करने के लिए स्वामित्व बदलने के uidऔर gidकंटेनर में अपने उपयोगकर्ता के लिए।

एक साइड नोट के रूप में, uid33 के साथ एक उपयोगकर्ता के लिए कंटेनर में स्वामित्व बदलने के बाद, आप होस्ट पर देखेंगे कि uidअब 100033 है, जो कुल समझ में आता है।


नहीं यकीन है कि अगर यह सिर्फ मेरी सेटअप है, लेकिन LXD v3.0.3 LTS (उबंटू 18.04 LTS) के साथ मैं अंदर कुछ भी नहीं लेकिन सांकेतिक लिंक पाया /var/lib/lxd/containersहै कि उठाई से अधिक /var/lib/lxd/storage-pools/lxd/containers(इस मामले में पिछले lxdसा मेरी ZFS भंडारण पूल का नाम है)। वहाँ सभी कंटेनरों को 165536 यूआईडी / गिद लगता था जब चल रहा था और root:rootजब बंद था।
deoren

1
मुझे लगता है कि यह एक पुराना प्रश्न + उत्तर है, लेकिन उबंटू 18.04 में, मुझे किसी भी अनुमति के साथ गड़बड़ नहीं करना था। बस के साथ फ़ोल्डर जोड़ें lxc configऔर यह एक आकर्षण की तरह काम किया!
अपाचे

4

यहाँ इस सवाल का एक अद्यतन जवाब है।

कंटेनर में होस्ट फ़ोल्डर /var/wwwको माउंट करें /var/test

lxc config device add mycontainer vartest disk source=/var/www path=/var/test

उबंटू पूछने के लिए आपका स्वागत है! मैं सलाह देता हूं कि इस उत्तर को संपादित करने के लिए इसे विशिष्ट विवरण के साथ विस्तारित करें कि यह कैसे करना है। (यह भी देखें कि मैं एक अच्छा उत्तर कैसे लिख सकता हूँ? सामान्य सलाह के लिए किस तरह के उत्तर आस्कुबंटु पर सबसे अधिक मूल्यवान माने जाते हैं।)
डेविड फ़ॉस्टर

3

आप कंटेनर में अतिरिक्त डिवाइस असाइन कर सकते हैं , और ये होस्ट-सुलभ फ़ोल्डर हो सकते हैं।

$ lxc config ## display help
...
lxc config device add [<remote>:]<container> <device> <type> [key=value...]
    Add a device to a container.
...

ध्यान दें कि <device>आपके द्वारा निर्दिष्ट केवल एक मनमाना नाम है, जिसे बाद के डिवाइस प्रबंधन के लिए एक आईडी के रूप में उपयोग किया जाएगा।

उदाहरण के लिए, कंटेनर में होस्ट फ़ोल्डर "./host" को "/ mnt / होस्ट" के रूप में माउंट करने के लिए ...

lxc config device add mycontainer vartest disk source=$(pwd)/host path=/mnt/host

एक समस्या बनी हुई है - यदि आप चाहते हैं कि यह फ़ोल्डर होस्ट और कंटेनर दोनों के द्वारा लिखने योग्य हो, तो स्वामित्व और अनुमतियों को तदनुसार कॉन्फ़िगर करने की आवश्यकता है। यह LXD के डिफ़ॉल्ट मोड से जटिल है जो उपयोगकर्ता और समूह idमूल्यों के लिए संख्यात्मक सीमाओं को वर्चुअलाइज करता है। एक आसान उपाय है, हालांकि : इस वर्चुअलाइजेशन को होस्ट-समकक्ष विशेषाधिकारों के साथ चलाने के लिए कंटेनर को कॉन्फ़िगर करके बाईपास करें ...

lxc config set <container> security.privileged true

इस दृष्टिकोण के पूर्ण मेजबान-सुरक्षा निहितार्थ मेरे लिए इस समय अस्पष्ट हैं, लेकिन वर्चुअलाइजेशन द्वारा कुछ हद तक "निहित" प्रतीत होगा। व्यावहारिक जोखिम इस बात पर निर्भर करता है कि आप कंटेनर का उपयोग कैसे और क्यों करेंगे। Https://insights.ubuntu.com/2017/06/15/custom-user-mappings-in-lxd-containers पर तकनीकी नोट देखें

आगे ध्यान दें कि यह दृष्टिकोण शायद सबसे अच्छा काम करता है यदि आप सामान्य रूप से कंटेनर में एक गैर-रूट उपयोगकर्ता के रूप में काम करते हैं, जैसे कि आप के साथ संलग्न करते हैं ...

lxc exec zesty -- su --login ubuntu

गैर-रूट लॉगिन के साथ एक समस्या है: envविशेष रूप से अलग है http_proxy। एक उदाहरण वर्कअराउंड sudo http_proxy=http://[fe80::1%eth0]:13128 apt-get update:।
नौ

के बारे में http_proxy, मुझे लगता है कि आईपीवी 4 को सक्षम करने के लिए आसान समाधान संभव है जैसा कि यहां चर्चा की गई है
नोबार

... के बाद sudo dhclientपरिवर्तन या - कंटेनर में manualकरने के लिए dhcpमें 50-cloud-init.cfg। यहाँ अच्छे सुराग: github.com/lxc/lxd/issues/1298
nobar

1
यह एक पेटेंट खराब विचार है। LXD द्वारा लाए गए अग्रिमों में से एक को विशेषाधिकार प्राप्त कंटेनरों में बदलने की सिफारिश करना। जबकि LXC 1.x ने अप्रकाशित कंटेनरों (और हां, यहां तक ​​कि जड़ के रूप में) का उपयोग करने की संभावना की पेशकश की, यह विवरणों को छांटने के लिए थोड़ा अधिक जटिल था। एलएक्सडी के साथ यह अब अतीत की बात है। इसके अलावा, होस्ट-साइड यूआईडी को आवश्यक एक्सेस की अनुमति देने या यहां उल्लिखित विधि का उपयोग करने की अनुमति देने के लिए कुछ फ़ोल्डर पर एसीएल स्थापित करने के बारे में क्या जटिल है ? हाँ मैपिंग UIDs / GIDs एकमात्र तरीका नहीं है!
0xC0000022L

1

Ph0t0nix के उत्कृष्ट उत्तर के आधार पर , मैं अपने Ubuntu 18.04 सर्वर के लिए निम्न चरण-दर-चरण दृष्टिकोण का प्रस्ताव करता हूं:

  1. होस्ट में रूटफ़्स के मालिक का यूआईडी निर्धारित करें:

    sudo ls -l /var/lib/lxd/storage-pools/lxd/containers/webserver/rootfs  
    id -u root    100000
  2. कंटेनर में उबंटू का यूआईडी निर्धारित करें (यानी कंटेनर में उपयोगकर्ता):

    id -u ubuntu    1000
  3. होस्ट में साझा फ़ोल्डर बनाएँ और इसे कंटेनर में जोड़ें:

    lxc config device add webserver mydevicename disk path=/home/share_on_guest source=/home/share_on_host
  4. साझा फ़ोल्डर के UID होस्ट में समायोजित करें (UID = UID होस्ट + UID अतिथि):

    sudo chown 101000:101000 /home/share_on_host
  5. अतिथि (उपयोगकर्ता ubuntu) के पास अब साझा फ़ोल्डर तक पहुंच है और कंटेनर का उपयोग कर साझा फ़ोल्डर में समायोजित कर सकते हैं chmod


0

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

एक बहुत उपयोगी सार यहाँ पाया जा सकता है:

https://gist.github.com/bloodearnest/ebf044476e70c4baee59c5000a10f4c8


5
ध्यान दें कि चीजों को विश्व-योग्य बनाना आमतौर पर सुरक्षा के दृष्टिकोण से एक बुरा विचार है। आपको संभवतः होस्ट पथ पर POSIX ACLs का उपयोग करना चाहिए, उस uid के लिए एक विशिष्ट ACL जोड़कर कंटेनर के उपयोगकर्ता तक पहुंच प्रदान करना चाहिए, और फिर किसी अन्य होस्ट उपयोगकर्ता के लिए जिसे लिखने की आवश्यकता भी है।
अस्तबल

1
@stgraber जब मैं आपकी कही गई बातों से सहमत हूं, तो मुझे नहीं पता कि इसे कैसे सेट किया जाए। कुछ लिंक मददगार होंगे।
s3v3n

कृपया 0777बिना किसी स्पष्ट कारण के “कृपया-हैक-माय-सिस्टम-एंड-नष्ट-माय-डेटा” उर्फ की सिफारिश न करें ! इसका लगभग कोई कारण नहीं है क्योंकि इसे (समूह) स्वामित्व बदलने जैसे अधिक समझदार संशोधनों से बचा जा सकता है। -1
डेविड फ़ॉस्टर

मैं आपकी बात लेता हूं, लेकिन मैंने केवल एक ही यूजर डेवलपमेंट मशीन पर अस्थायी वर्कअराउंड के रूप में काम करने के लिए किसी अन्य तरीके की अनुपस्थिति में उपयोग किया है। तब से मुझे पता चला है कि प्रोफाइल का उपयोग करना इसे संभालने का तरीका है, ऊपर मेरा संपादित उत्तर देखें!
user47227

1
एसीएल या यहाँ उल्लिखित विधि का उपयोग करने में क्या मुश्किल है ?
0xC0000022L
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.