Menambahkan direktori host bersama ke LXC / LXD Container

19

Saya telah bereksperimen dengan LXC / LXD di Ubuntu 14.04 dan semuanya bekerja dengan baik. Saya hanya perlu mencari cara untuk mendapatkan direktori bersama yang bekerja antara mesin host saya dan sebuah wadah sehingga saya bisa membuang Virtualbox sekali dan untuk semua.

Saya telah melihat halaman ini: https://wiki.gentoo.org/wiki/LXD

Yang memberikan instruksi, tapi saya tetap mendapatkan kesalahan.

Adakah yang tahu tentang instruksi sederhana dan jelas agar ini berfungsi? Setiap bantuan sangat dihargai.

pengguna47227
sumber
2
Saya sudah berhasil me-mount direktori host dengan menggunakan: lxc config device add confexample sharedtmp disk path=/tmp source=/tmp/shared. Tetapi melihat direktori pada wadah pemilik dan grup untuk file-file di sana diatur ke 'tidak ada' dan 'nogroup' dan mount hanya dibaca.
user47227
Bisakah Anda menambahkan sedikit lebih detail? Apa sebenarnya yang Anda lakukan, apa yang ingin Anda capai dan apa yang terjadi? Apakah Anda menemukan pesan peringatan atau kesalahan? Silakan mereproduksi mereka secara keseluruhan dalam pertanyaan Anda. Anda dapat memilih, menyalin dan menempel konten terminal dan sebagian besar pesan dialog di Ubuntu. (lihat Bagaimana saya mengajukan pertanyaan yang bagus? )
David Foerster
Dengan asumsi Anda menggunakan wadah yang tidak terjangkau dan pemetaan UID / GID adalah masalahnya, lihatlah bagian artikel ini tentang pemetaan pengguna dengan LXD. Namun, ini mungkin ditambahkan ke dalam cara LXD setelah Anda mengajukan pertanyaan.
0xC0000022L
Saya tidak tahu versi mana yang menambahkan ini (saya di 2.18) tetapi jika memungkinkan, Anda juga dapat menggunakan lxc fileuntuk mentransfer file antara host dan wadah, menggunakan pushdan pull.
code_dredd

Jawaban:

21

Petunjuk di https://wiki.gentoo.org/wiki/LXD yang Anda sebutkan benar tetapi mungkin perlu sedikit penjelasan lebih lanjut.

Pada host Anda pertama kali memeriksa kepemilikan direktori di mana data kontainer disimpan. Lari

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

dan periksa pemilik wadah yang ingin Anda bagikan direktori. Dalam kasus saya uiddan gidkeduanya adalah 100.000.

Selanjutnya, gunakan ini untuk mengubah kepemilikan direktori yang ingin Anda bagikan:

sudo chown 100000:100000 /tmp/share_on_host

Bagikan direktori dengan wadah seperti yang Anda tunjukkan dalam komentar Anda:

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

Sekarang, dalam wadah, Anda akan melihat bahwa direktori /tmp/share_on_guest(saya tidak akan menyarankan untuk me-mount direktori Anda /tmpkarena itu digunakan oleh sistem untuk hal-hal lain dan memiliki izin khusus) dimiliki oleh root. Dari sini, Anda dapat menggunakan chowndalam wadah untuk mengubah kepemilikan ke yang sesuai uiddan giduntuk pengguna Anda di dalam wadah.

Sebagai catatan, setelah mengubah kepemilikan dalam wadah menjadi eg pengguna dengan uid33 Anda akan melihat pada host bahwa uidsekarang ada 100033, yang masuk akal.

ph0t0nix
sumber
Tidak yakin apakah ini hanya pengaturan saya, tetapi dengan LXD v3.0.3 LTS (Ubuntu 18.04 LTS) saya menemukan apa pun selain tautan simbolis di dalam /var/lib/lxd/containersyang ditunjukkan ke /var/lib/lxd/storage-pools/lxd/containers(dalam hal ini lxdbit terakhir adalah nama kumpulan penyimpanan ZFS saya). Semua kontainer di sana tampaknya memiliki 165536 uid / gid yang sama saat dijalankan dan dimiliki root:rootsaat off.
deoren
1
Saya menyadari ini adalah pertanyaan + jawaban lama, tetapi di Ubuntu 18.04, saya tidak perlu mengacaukan izin apa pun. Cukup tambahkan folder dengan lxc configdan itu berfungsi seperti pesona!
Apache
4

Ini jawaban terbaru untuk pertanyaan ini.

Pasang folder host /var/wwwseperti /var/testdalam wadah.

lxc config device add mycontainer vartest disk source=/var/www path=/var/test
Tamu8354542556745
sumber
Selamat Datang di Tanya Ubuntu! Saya sarankan untuk mengedit jawaban ini untuk meluaskannya dengan detail spesifik tentang bagaimana melakukan ini. (Lihat juga Bagaimana cara saya menulis jawaban yang baik? Untuk saran umum tentang jenis jawaban apa yang dianggap paling berharga di AskUbuntu.)
David Foerster
3

Anda dapat menetapkan perangkat tambahan ke wadah, dan ini bisa menjadi folder yang dapat diakses oleh host.

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

Perhatikan bahwa <device>itu hanyalah nama arbitrer yang Anda tetapkan, yang akan digunakan sebagai ID untuk manajemen perangkat selanjutnya.

Misalnya, untuk memasang folder host "./host" sebagai "/ mnt / host" di wadah ...

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

Masih ada satu masalah - jika Anda ingin folder ini dapat ditulis oleh tuan rumah dan wadah, kepemilikan dan izin harus dikonfigurasi sesuai. Ini rumit oleh mode default LXD yang memvirtualisasi rentang numerik untuk nilai pengguna dan grup id. Namun, ada solusi mudah : bypass virtualisasi ini dengan mengonfigurasi wadah untuk dijalankan dengan hak istimewa yang setara dengan host ...

lxc config set <container> security.privileged true

Implikasi host-security penuh dari pendekatan ini tidak jelas bagi saya saat ini, tetapi tampaknya agak "terkandung" oleh virtualisasi. Risiko praktis tergantung pada bagaimana dan mengapa Anda akan menggunakan wadah. Lihat catatan teknis di https://insights.ubuntu.com/2017/06/15/custom-user-mappings-in-lxd-containers

Perhatikan lebih lanjut bahwa pendekatan ini mungkin paling berhasil jika Anda biasanya beroperasi dalam wadah sebagai pengguna non-root, seperti jika Anda melampirkan ...

lxc exec zesty -- su --login ubuntu
bangsawan
sumber
Ada masalah dengan login non-root: envKhususnya berbeda http_proxy. Contoh atasi: sudo http_proxy=http://[fe80::1%eth0]:13128 apt-get update.
nobar
Mengenai http_proxy, saya pikir solusi yang lebih mudah mungkin untuk mengaktifkan IPV4 seperti yang dibahas di sini .
nobar
... diikuti oleh sudo dhclientdalam wadah - atau perubahan manualke dhcpdalam 50-cloud-init.cfg. Petunjuk bagus di sini: github.com/lxc/lxd/issues/1298
nobar
1
Ini ide yang sangat buruk . Merekomendasikan untuk beralih ke wadah istimewa merongrong salah satu kemajuan yang dibawa LXD. Sementara LXC 1.x juga menawarkan kemungkinan untuk menggunakan kontainer yang tidak terjangkau (dan ya, bahkan sebagai root), itu sedikit lebih rumit untuk memilah detail. Dengan LXD ini sekarang menjadi masa lalu. Selain itu, apa yang begitu rumit tentang pengaturan ACL pada beberapa folder untuk memungkinkan UID sisi host akses yang diperlukan atau untuk menggunakan metode yang diuraikan di sini ? Ya pemetaan UID / GID bukan satu-satunya cara!
0xC0000022L
1

Berdasarkan jawaban ph0t0nix yang sangat bagus , saya mengusulkan pendekatan langkah demi langkah berikut untuk server Ubuntu 18.04 saya:

  1. Di host, tentukan UID pemilik rootfs:

    sudo ls -l /var/lib/lxd/storage-pools/lxd/containers/webserver/rootfs  
    id -u root    100000
  2. Dalam wadah tentukan UID dari ubuntu (yaitu pengguna dalam wadah):

    id -u ubuntu    1000
  3. Buat folder bersama di host dan tambahkan ke wadah:

    lxc config device add webserver mydevicename disk path=/home/share_on_guest source=/home/share_on_host
  4. Sesuaikan host UID dari folder bersama (UID = host UID + tamu UID):

    sudo chown 101000:101000 /home/share_on_host
  5. Tamu (pengguna ubuntu) sekarang memiliki akses ke folder bersama dan dapat menyesuaikan dalam akses wadah ke folder bersama menggunakan chmod.

joerg
sumber
0

Saya sekarang memiliki solusi yang berfungsi dan aman untuk masalah ini, menggunakan profil LXD untuk menangani pemetaan antara UID dan GID dalam wadah dan pada host.

Inti yang sangat berguna dapat ditemukan di sini:

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

pengguna47227
sumber
5
Perhatikan bahwa membuat hal-hal yang dapat ditulis oleh dunia biasanya merupakan ide yang buruk dari sudut pandang keamanan. Anda mungkin harus melihat ke dalam menggunakan POSIX ACL di jalur host, memberikan akses ke pengguna wadah dengan menambahkan ACL khusus untuk uid itu, dan kemudian untuk setiap pengguna host lain yang juga membutuhkan akses tulis.
stgraber
1
@stgraber sementara saya setuju dengan apa yang Anda katakan, saya tidak tahu bagaimana mengaturnya. Beberapa tautan akan sangat membantu.
s3v3n
Tolong jangan rekomendasikan 0777izin alias "tolong-retas-sistem-dan-hancurkan-data-saya" tanpa alasan yang jelas! Hampir tidak pernah ada alasan untuk itu karena dapat dihindari dengan modifikasi yang lebih masuk akal seperti mengubah kepemilikan (grup). -1
David Foerster
Saya mengerti maksud Anda, tetapi saya hanya menggunakannya sebagai solusi sementara pada mesin pengembangan pengguna tunggal, dengan tidak adanya cara lain untuk membuatnya bekerja. Sejak itu saya menemukan bahwa menggunakan profil adalah cara untuk menangani hal ini, lihat jawaban saya yang diedit di atas!
user47227
1
Apa yang sulit tentang menggunakan ACL atau metode yang diuraikan di sini ?
0xC0000022L