การเพิ่มไดเรกทอรีโฮสต์ที่แชร์ไปยังคอนเทนเนอร์ LXC / LXD


19

ฉันได้ทดลองกับ LXC / LXD บน Ubuntu 14.04 และมันก็ใช้ได้ดีมาก ฉันแค่ต้องคิดหาวิธีที่จะทำให้ไดเรกทอรีที่ใช้ร่วมกันทำงานระหว่างเครื่องโฮสต์และคอนเทนเนอร์ของฉันดังนั้นฉันจึงสามารถทิ้ง Virtualbox ไปได้ทุกที่

ฉันเห็นหน้านี้แล้ว: https://wiki.gentoo.org/wiki/LXD

ซึ่งให้คำแนะนำ แต่ฉันเพิ่งได้รับข้อผิดพลาด

ไม่มีใครรู้คำแนะนำง่ายๆและชัดเจนในการทำงานนี้หรือไม่ ความช่วยเหลือใด ๆ ที่ชื่นชมมาก


2
ฉันจัดการติดตั้งไดเรกทอรีโฮสต์โดยใช้: lxc config device add confexample sharedtmp disk path=/tmp source=/tmp/shared. แต่การดูที่ไดเรกทอรีบนคอนเทนเนอร์เจ้าของและกลุ่มของไฟล์ที่อยู่ในนั้นจะถูกตั้งค่าเป็น 'none' และ 'nogroup' และการเมาท์จะอ่านได้อย่างเดียว
user47227

คุณช่วยเพิ่มรายละเอียดหน่อยได้ไหม? คุณทำอะไรอยู่อย่างแน่นอนคุณต้องการทำอะไรและเกิดอะไรขึ้นแทน? คุณพบคำเตือนหรือข้อความแสดงข้อผิดพลาดหรือไม่? โปรดทำซ้ำทั้งหมดในคำถามของคุณ คุณสามารถเลือกคัดลอกและวางเนื้อหาของเทอร์มินัลและข้อความการสนทนาส่วนใหญ่ใน Ubuntu (ดูฉันจะถามคำถามที่ดีได้อย่างไร )
David Foerster

สมมติว่าคุณกำลังใช้คอนเทนเนอร์ที่ไม่มีสิทธิพิเศษและการแมป UID / GID เป็นปัญหาให้ดูที่ส่วนของบทความเกี่ยวกับการแมปผู้ใช้กับ LXD อย่างไรก็ตามนี่อาจจะถูกเพิ่มเข้าไปในวิธี LXD หลังจากที่คุณถามคำถามของคุณ
0xC0000022L

ผมไม่ทราบว่ารุ่นนี้เพิ่ม (ฉัน 2.18) แต่ถ้าเป็นไปได้คุณยังสามารถใช้lxc fileในการถ่ายโอนไฟล์ระหว่างโฮสต์และภาชนะที่ใช้และpush pull
code_dredd

คำตอบ:


21

คำแนะนำเกี่ยวกับhttps://wiki.gentoo.org/wiki/LXDที่คุณพูดถึงนั้นถูกต้อง แต่อาจต้องการคำอธิบายเพิ่มเติมอีกเล็กน้อย

บนโฮสต์ก่อนอื่นให้คุณตรวจสอบความเป็นเจ้าของของไดเรกทอรีที่เก็บข้อมูลคอนเทนเนอร์ วิ่ง

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

และตรวจสอบเจ้าของคอนเทนเนอร์ที่คุณต้องการแชร์ไดเรกทอรีด้วย ในกรณีของฉันuidและgidทั้งคู่เป็น 100,000

จากนั้นใช้สิ่งเหล่านี้เพื่อเปลี่ยนความเป็นเจ้าของของไดเรกทอรีที่คุณต้องการแชร์:

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เพราะมันถูกใช้โดยระบบสำหรับสิ่งอื่น ๆ และมีสิทธิ์พิเศษ) เป็นเจ้าของโดย root จากที่นี่คุณสามารถใช้chownในคอนเทนเนอร์เพื่อเปลี่ยนความเป็นเจ้าของให้เหมาะสมuidและgidสำหรับผู้ใช้ของคุณในคอนเทนเนอร์

ในฐานะที่เป็นบันทึกด้านข้างหลังจากเปลี่ยนความเป็นเจ้าของในภาชนะเป็นเช่นผู้ใช้ที่มีuid33 คุณจะเห็นในโฮสต์ว่าuidตอนนี้มี 1,00033 ซึ่งทำให้รู้สึกรวม


ไม่แน่ใจว่าเป็นเพียงการตั้งค่าของฉัน แต่ด้วย LXD v3.0.3 LTS (Ubuntu 18.04 LTS) ฉันไม่พบอะไรเลยนอกจากลิงก์สัญลักษณ์ภายใน/var/lib/lxd/containersที่ชี้ไป/var/lib/lxd/storage-pools/lxd/containers(ในกรณีนี้lxdบิตสุดท้ายคือชื่อของพูลหน่วยเก็บข้อมูล ZFS ของฉัน) ภาชนะทั้งหมดดูเหมือนว่าจะมี 165536 uid / gid เดียวกันเมื่อทำงานและเป็นเจ้าของโดยroot:rootเมื่อปิด
deoren

1
ฉันรู้ว่านี่เป็นคำถามและคำตอบเก่า ๆ แต่ใน Ubuntu 18.04 ฉันไม่ต้องยุ่งกับการอนุญาตใด ๆ เพียงแค่เพิ่มโฟลเดอร์ด้วยlxc configและมันก็ทำงานได้อย่างมีเสน่ห์!
Apache

4

นี่คือคำตอบล่าสุดสำหรับคำถามนี้

เมานต์โฟลเดอร์โฮสต์/var/wwwเช่นเดียวกับ/var/testในภาชนะ

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

ยินดีต้อนรับสู่ถาม Ubuntu! ฉันขอแนะนำให้แก้ไขคำตอบนี้เพื่อขยายด้วยรายละเอียดเฉพาะเกี่ยวกับวิธีการทำเช่นนี้ (ดูเพิ่มเติมฉันจะเขียนคำตอบที่ดีได้อย่างไรสำหรับคำแนะนำทั่วไปเกี่ยวกับคำตอบประเภทใดที่ถือว่ามีค่ามากที่สุดใน AskUbuntu)
David Foerster

3

คุณสามารถกำหนดอุปกรณ์เพิ่มเติมให้กับคอนเทนเนอร์และอุปกรณ์เหล่านี้อาจเป็นโฟลเดอร์ที่เข้าถึงได้

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

โปรดทราบว่า<device>เป็นเพียงชื่อโดยพลการที่คุณกำหนดซึ่งจะใช้เป็น ID สำหรับการจัดการอุปกรณ์ที่ตามมา

ตัวอย่างเช่นหากต้องการเมานต์โฮสต์โฟลเดอร์ "./host" เป็น "/ mnt / host" ในคอนเทนเนอร์ ...

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

ยังคงมีปัญหาอยู่หนึ่งข้อ - หากคุณต้องการให้โฟลเดอร์นี้สามารถเขียนได้โดยทั้งโฮสต์และคอนเทนเนอร์จำเป็นต้องกำหนดค่าความเป็นเจ้าของและสิทธิ์ให้สอดคล้อง นี้มีความซับซ้อนโดยโหมดเริ่มต้นของ LXD ซึ่ง virtualizes ช่วงตัวเลขสำหรับผู้ใช้และกลุ่ม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
nobar

เกี่ยวกับhttp_proxyผมคิดว่าวิธีการแก้ปัญหาได้ง่ายขึ้นน่าจะเป็นการเปิดใช้งาน IPV4 ตามที่กล่าวไว้ที่นี่
สูงศักดิ์

... ตามมาด้วยsudo dhclientในภาชนะที่ - หรือการเปลี่ยนแปลงmanualไปในdhcp 50-cloud-init.cfgเบาะแสที่ดีที่นี่: github.com/lxc/lxd/issues/1298
nobar

1
นี่เป็นความคิดที่ไม่ดีอย่างชัดแจ้ง แนะนำให้เปลี่ยนไปใช้ภาชนะที่ได้รับการยกเว้นทำลายหนึ่งในความก้าวหน้าที่ LXD นำมา ในขณะที่ LXC 1.x ยังเสนอความเป็นไปได้ในการใช้คอนเทนเนอร์ที่ไม่มีสิทธิพิเศษ (และใช่แม้ในฐานะที่เป็น root) แต่ก็ซับซ้อนกว่าเล็กน้อยในการคัดแยกรายละเอียด ด้วย LXD สิ่งนี้กลายเป็นอดีตไปแล้ว นอกจากนี้อะไรที่ซับซ้อนมากเกี่ยวกับการตั้งค่า ACL ในบางโฟลเดอร์เพื่อให้ UID ฝั่งโฮสต์สามารถเข้าถึงได้ตามต้องการหรือใช้วิธีที่อธิบายไว้ที่นี่ ? ใช่การทำแผนที่ UIDs / GID ไม่ใช่วิธีเดียว!
0xC0000022L

1

จากคำตอบที่ยอดเยี่ยมของ ph0t0nixฉันขอเสนอวิธีการทีละขั้นตอนต่อไปนี้สำหรับเซิร์ฟเวอร์ Ubuntu 18.04 ของฉัน:

  1. ในโฮสต์พิจารณา UID ของเจ้าของ rootfs:

    sudo ls -l /var/lib/lxd/storage-pools/lxd/containers/webserver/rootfs  
    id -u root    100000
  2. ในคอนเทนเนอร์กำหนด UID ของ Ubuntu (เช่นผู้ใช้ในคอนเทนเนอร์):

    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. ผู้เยี่ยมชม (ผู้ใช้อูบุนตู) สามารถเข้าถึงโฟลเดอร์ที่แชร์และสามารถปรับเปลี่ยนการเข้าถึงคอนเทนเนอร์โดยใช้โฟลเดอร์แชร์chmodได้


0

ตอนนี้ฉันมีวิธีแก้ปัญหาการทำงานที่ปลอดภัยสำหรับปัญหานี้โดยใช้โปรไฟล์ LXD เพื่อจัดการการแมประหว่าง UID และ GID ในคอนเทนเนอร์และบนโฮสต์

ส่วนสำคัญที่มีประโยชน์มากอาจพบได้ที่นี่:

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


5
โปรดทราบว่าการทำสิ่งต่าง ๆ ที่เขียนได้ทั่วโลกมักเป็นแนวคิดที่ไม่ดีจากมุมมองด้านความปลอดภัย คุณควรตรวจสอบการใช้ POSIX ACL บนพา ธ โฮสต์การให้สิทธิ์การเข้าถึงแก่ผู้ใช้คอนเทนเนอร์โดยการเพิ่ม ACL เฉพาะสำหรับ uid นั้นจากนั้นสำหรับผู้ใช้โฮสต์อื่นที่ต้องการเข้าถึงการเขียน
stgraber

1
@stgraber ในขณะที่ฉันเห็นด้วยกับสิ่งที่คุณพูดฉันไม่มีความคิดในการตั้งค่า ลิงก์บางลิงค์อาจมีประโยชน์
s3v3n

กรุณาอย่าแนะนำ0777aka“ โปรดแฮ็ค - ระบบ - และ - ทำลาย - ข้อมูลของฉัน” ด้วยเหตุผลที่ชัดเจน! แทบไม่มีเหตุผลที่จะทำเช่นนั้นเพราะสามารถหลีกเลี่ยงได้ด้วยการแก้ไขที่สมเหตุสมผลเช่นการเปลี่ยนเจ้าของ (กลุ่ม) -1
David Foerster

ฉันใช้จุดของคุณ แต่ฉันใช้เพียงว่าเป็นวิธีการชั่วคราวในเครื่องพัฒนาผู้ใช้คนเดียวในกรณีที่ไม่มีวิธีอื่นเพื่อให้มันทำงาน ตั้งแต่นั้นมาฉันได้ค้นพบว่าการใช้โปรไฟล์เป็นวิธีจัดการกับสิ่งนี้ดูคำตอบที่แก้ไขแล้วของฉันข้างต้น!
user47227

1
อะไรอย่างหนักเกี่ยวกับการใช้ ACL ของทั้งสองหรือวิธีการแสดงไว้ที่นี่ ?
0xC0000022L
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.