Bagaimana cara saya berbagi direktori antara kontainer LXC dan host?

15

Bagaimana saya bisa berbagi folder antara sistem host (ubuntu 14.04) dan wadah lxc ubuntu?

Saya mencoba memasang folder pada host:

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

tapi saya tidak bisa melihat file apa pun.

Hal yang sama berlaku untuk:

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

Apakah saya perlu mengubah izin untuk folder berbagi?

Maks
sumber

Jawaban:

13

Menurut dokumentasi LXC Anda dapat melakukan ini melalui wadah istimewa:

lxc launch ubuntu priv -c security.privileged=true
lxc config device add priv homedir disk source=/home/$USER path=/home/ubuntu
Jorge Castro
sumber
Perhatikan bahwa, itu adalah dokumentasi LXD, bukan LXC. Jika Anda belum menginstal LXD, maka perintah lxc tidak akan berfungsi.
Sam Bull
@SamBull yah, ini dilakukan sendiri oleh tim LXC / LXD. LXC dapat digunakan untuk merujuk ke liblxc (pustaka yang mendasarinya) atau ke klien LXD (bernama lxd) seperti yang digunakan dalam jawaban ini atau ke LXC (perangkat lunak dan toolset "lama" dengan lxc-*alat yang dinamai) atau ke proyek (di mana LXC kependekan dari LinuX Containers). Itulah alasan saya mengajukan pertanyaan ini pada meta Unix.SE.
0xC0000022L
12

Saya menemukan sebuah artikel di wiki openSUSE: https://en.opensuse.org/User:Tsu2/LXC_mount_shared_directory

Saya mengikuti langkah-langkahnya dan berhasil sekarang.

Buat direktori host:

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

Buat direktori dalam wadah lxc:

mkdir /share

Edit file konfigurasi lxc pada host:

nano /var/lib/lxc/containername/config
lxc.mount.entry = /media/data/share share none ro,bind 0.0
Maks
sumber
Apakah ada alasan di balik mendefinisikan entri mount sebagai hanya baca? Apakah itu praktik keamanan yang baik untuk menghindari wadah untuk menulis kembali data ke sistem file bersama ?.
jgomo3
1
Bekerja untukku. Perhatikan bahwa jalur relatif yang digunakan untuk sharedalam lxc.mount.entrysangat penting.
HRJ
1
Anda tidak perlu membuat titik mount, jika Anda menambahkan ', buat = dir' setelah 'bind'. Saya juga menghapus bagian 'ro', dan tampaknya berfungsi dengan baik.
Sam Bull
4

Di bawah ini adalah apa yang telah saya lakukan untuk me-mount salah satu direktori host saya ke wadah. Ini lebih sulit daripada kedengarannya karena kami ingin mencapainya

  • Di dalam wadah kita harus bisa menulis ke direktori.
  • Di luar wadah kita harus bisa menulis ke file dan direktori yang dibuat di dalam wadah.

Setelah membaca berbagai artikel online (yang paling bermanfaat adalah masalah github ini ), inilah cara saya menyelesaikannya. Caranya adalah dengan memetakan uid dan gid dari pengguna host ke uid dan gid dari pengguna di dalam wadah.

Misalkan saya akan me /home/breakds/projects- mount ke lokasi yang sama persis di wadah. Direktori luar dimiliki oleh pengguna breakds, yang memiliki uid dan gid 1000.

Saya kemudian membuat pengguna dalam wadah yang disebut debian, yang uid dan gid kebetulan 1000juga (karena itu adalah pengguna non root pertama). Saya kemudian akan membuat profie (lxc) di host oleh

lxc profile edit breakds

Dan di bawah ini adalah isi dari profil (saya percaya itu dalam format 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

Kemudian, terapkan profil ini ke wadah itu secara permanen:

$ lxc profile apply <my container> breakds

Ini harus melakukan trik.

CATATAN : Harap dicatat bahwa sebelum beralih ke profil ini, pastikan bahwa semua direcotries atau file yang pemilik / grupnya debian harus dihapus (dan mungkin dibuat kembali setelah beralih). Ini karena setelah pemetaan uid dan gid, kepemilikan mereka akan menjadi tidak valid. Saya awalnya berpikir karena saya hanya memetakan 1000 hingga 1000 semuanya harus baik-baik saja, tapi saya pikir saya melewatkan sesuatu di sini dan akan lebih bagus jika seseorang dapat memberi saran tentang bagaimana menyelesaikan ini tanpa hack.

BreakDS
sumber
Tetapi Anda selalu dapat chowndari host.
iBug
1

Anda juga dapat melakukan ini tanpa LXD dengan mengedit file konfigurasi LXC secara langsung:

# 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

Anda juga harus memastikan bahwa akun pengguna wadah itu diberikan izin untuk memetakan ke uid / gid 1000 di host dengan mengedit / etc / subuid dan / etc / subgid:

containeruser:165536:65536
containeruser:1000:1
apokluda
sumber
proses sistem apa yang dibuat / etc / subuid? Openwrt tidak memilikinya.
mcr