ฉันจะแชร์ไดเรกทอรีระหว่างคอนเทนเนอร์ LXC และโฮสต์ได้อย่างไร


15

ฉันจะแชร์โฟลเดอร์ระหว่างระบบโฮสต์ (ubuntu 14.04) และ ubuntu lxc container ได้อย่างไร?

ฉันพยายามติดตั้งโฟลเดอร์บนโฮสต์:

sudo mount --bind /media/data/share /media/data/container/name/rootfs/share

แต่ฉันไม่เห็นไฟล์ใด ๆ

เช่นเดียวกับ:

sudo ln -s /media/data/share /media/data/container/name/rootfs/share

ฉันต้องเปลี่ยนการอนุญาตสำหรับโฟลเดอร์แชร์หรือไม่?

คำตอบ:


13

ตามเอกสารของ LXCคุณสามารถทำได้ผ่านคอนเทนเนอร์ที่มีสิทธิพิเศษ:

lxc launch ubuntu priv -c security.privileged=true
lxc config device add priv homedir disk source=/home/$USER path=/home/ubuntu

โปรดทราบว่านั่นคือเอกสาร LXD ไม่ใช่ LXC หากคุณยังไม่ได้ติดตั้ง LXD คำสั่ง lxc จะไม่ทำงาน
แซมบูล

@ SamBull เป็นอย่างดีนี่เป็นความขัดแย้งของทีม LXC / LXD LXC สามารถใช้เพื่ออ้างถึง liblxc (ไลบรารีพื้นฐาน) หรือไคลเอ็นต์ LXD (ชื่อlxd) ที่ใช้ในคำตอบนี้หรือ LXC (ซอฟต์แวร์และชุดเครื่องมือ "เก่า" ด้วยlxc-*เครื่องมือชื่อ) หรือโครงการ (โดยที่ LXC สั้นสำหรับภาชนะบรรจุ LinuX) มันเป็นเหตุผลที่ฉันถามคำถามนี้ในเมตาของ Unix.SE
0xC0000022L

12

ฉันพบบทความในวิกิ openSUSE: https://en.opensuse.org/User:Tsu2/LXC_mount_shared_directory

ฉันทำตามขั้นตอนและใช้งานได้ในขณะนี้

สร้างไดเรกทอรีโฮสต์:

mkdir /media/data/share && chmod 7777 /media/data/share

สร้างไดเรกทอรีในคอนเทนเนอร์ lxc:

mkdir /share

แก้ไขไฟล์ lxc config บนโฮสต์:

nano /var/lib/lxc/containername/config
lxc.mount.entry = /media/data/share share none ro,bind 0.0

มีเหตุผลเบื้องหลังการกำหนดรายการเมานต์ว่าอ่านอย่างเดียวหรือ นั่นเป็นวิธีปฏิบัติด้านความปลอดภัยที่ดีที่จะหลีกเลี่ยงคอนเทนเนอร์เพื่อเขียนข้อมูลกลับไปยังระบบไฟล์ที่ใช้ร่วมกันหรือไม่?
jgomo3

1
ทำงานให้ฉัน โปรดทราบว่าเส้นทางสัมพัทธ์ที่ใช้shareในการlxc.mount.entryเป็นสิ่งสำคัญ
HRJ

1
คุณไม่จำเป็นต้องสร้างจุดเชื่อมต่อหากคุณเพิ่ม ', สร้าง = dir' หลังจาก 'ผูก' ฉันได้ลบส่วน 'ro' ด้วยและดูเหมือนว่าจะใช้งานได้ดี
Sam Bull

4

ด้านล่างเป็นสิ่งที่ฉันได้ทำเพื่อติดตั้งหนึ่งในไดเรกทอรีโฮสต์ของฉันกับภาชนะ นี่มันยากกว่าที่คิดเพราะเราต้องการบรรลุ

  • ภายในคอนเทนเนอร์เราควรจะสามารถเขียนไปยังไดเรกทอรี
  • นอกคอนเทนเนอร์เราควรสามารถเขียนไฟล์และไดเรกทอรีที่สร้างขึ้นภายในคอนเทนเนอร์

หลังจากอ่านบทความต่าง ๆ ทางออนไลน์ (สิ่งที่มีประโยชน์ที่สุดคือปัญหา GitHub นี้ ) นี่คือวิธีที่ฉันจะแก้ปัญหานี้ เคล็ดลับคือการแม็พ uid และ gid ของโฮสต์ผู้ใช้กับ uid และ gid ของผู้ใช้ภายในคอนเทนเนอร์

สมมติว่าฉันกำลังจะเมานท์/home/breakds/projectsไปยังตำแหน่งเดียวกันแน่นอนในภาชนะ ไดเรกทอรีนอกเป็นเจ้าของโดยผู้ใช้breakdsที่มี UID และ GID 1000เป็น

จากนั้นฉันสร้างผู้ใช้ในคอนเทนเนอร์ที่เรียกว่าdebianมี uid และ gid เกิดขึ้น1000ด้วย (เนื่องจากเป็นผู้ใช้ที่ไม่ใช่รูทคนแรก) ฉันจะสร้าง profie (lxc) บนโฮสต์โดย

lxc profile edit breakds

และด้านล่างคือเนื้อหาของโปรไฟล์ (ฉันเชื่อว่ามันอยู่ในรูปแบบ yaml):

name: breakds
config:
    raw.lxc: |
        lxc.id_map =
        lxc.id_map = u 0 165536 999
        lxc.id_map = g 0 165536 999
        lxc.id_map = u 1000 1000 1
        lxc.id_map = g 1000 1000 1
        lxc.id_map = u 1001 166537 64535
        lxc.id_map = g 1001 166537 64535
    user.vendor-data: |
        packages:
            - bash
description: allow home dir mounting for breakds
devices:
eth0:
    name: eth0
    nictype: bridged
    parent: lxdbr0
    type: nic
projects:
    path: /home/breakds/projects
    source: /home/debian/projects
    type: disk

จากนั้นใช้โปรไฟล์นี้กับคอนเทนเนอร์นั้นอย่างถาวร:

$ lxc profile apply <my container> breakds

สิ่งนี้ควรทำเคล็ดลับ

หมายเหตุ : โปรดทราบว่าก่อนที่จะเปลี่ยนไปใช้โปรไฟล์นี้ตรวจสอบให้แน่ใจว่า direcotries หรือไฟล์ทั้งหมดที่มีเจ้าของ / กลุ่มเป็นเดเบียนควรถูกลบ (และอาจถูกสร้างขึ้นใหม่หลังจากสวิตช์) เนื่องจากหลังจากการแม็พ uid และ gid ความเป็นเจ้าของจะไม่ถูกต้อง ฉันคิดอย่างสร้างสรรค์ตั้งแต่ฉันทำแผนที่ 1,000 ถึง 1,000 ทุกอย่างน่าจะดี แต่ฉันคิดว่าฉันพลาดอะไรบางอย่างที่นี่และมันจะดีถ้ามีใครสามารถให้คำแนะนำในการแก้ไขปัญหานี้โดยไม่ต้องแฮ็ค


แต่คุณสามารถchownจากโฮสต์
iBug

1

คุณสามารถทำได้โดยไม่ต้อง LXD โดยแก้ไขไฟล์ LXC config โดยตรง:

# Container specific configuration
lxc.idmap = u 0 165536 1000
lxc.idmap = g 0 165536 1000
lxc.idmap = u 1000 1000 1
lxc.idmap = g 1000 1000 1
lxc.idmap = u 1001 166536 64535
lxc.idmap = g 1001 166536 64535

คุณต้องตรวจสอบให้แน่ใจว่าบัญชีผู้ใช้ของคอนเทนเนอร์ได้รับอนุญาตให้แม็พกับ uid / gid 1000 บนโฮสต์โดยแก้ไข / etc / subuid และ / etc / subgid:

containeruser:165536:65536
containeruser:1000:1

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