Bir dizini LXC kapsayıcısı ile anasistem arasında nasıl paylaşabilirim?


15

Ana bilgisayar sistemi (ubuntu 14.04) ile ubuntu lxc taşıyıcısı arasında nasıl klasör paylaşabilirim?

Klasörü ana bilgisayara monte etmeyi denedim:

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

ama dosya göremiyorum.

Aynısı - için de geçerli:

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

Paylaşım klasörü izinlerini değiştirmem gerekir mi?

Yanıtlar:


13

LXC belgelerine göre bunu ayrıcalıklı bir kapsayıcı aracılığıyla yapabilirsiniz:

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

Bunun LXC değil LXD belgeleri olduğunu unutmayın. LXD'yi yüklemediyseniz, lxc komutu çalışmaz.
Sam Bull

@SamBull iyi, bu LXC / LXD ekibi tarafından kendi kendine yapılır. LXC, bu cevapta kullanılan liblxc (temel kütüphane) veya LXD istemcisine (adlandırılmış lxd) veya lxc-*LXC'ye (isimlendirilmiş araçlarla yazılım ve "eski" araç seti ) veya projeye (LXC'nin) atıfta bulunmak için kullanılabilir LinuX Konteynerlerinin kısaltmasıdır). Bu soruyu Unix.SE metasında sordum .
0xC0000022L

12

OpenSUSE wiki'sinde bir makale buldum: https://en.opensuse.org/User:Tsu2/LXC_mount_shared_directory

Adımları takip ettim ve şimdi çalışıyor.

Ana bilgisayar dizini oluştur:

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

Lxc kapsayıcısında dizin oluşturun:

mkdir /share

Ana bilgisayarda lxc yapılandırma dosyasını düzenleyin:

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

Bu montaj girişini salt okunur olarak tanımlamanın arkasında bir neden var mı? Bir kabın paylaşılan bir dosya sistemine veri yazmasını önlemek iyi bir güvenlik uygulaması mıdır?
Ocak

1
Benim için çalıştı. Göreli yol için kullanılan Not shareiçinde lxc.mount.entrykritiktir.
HRJ

1
Bağlama noktası oluşturmanıza gerek yoktur; 'bind' ifadesinden sonra ', create = dir' eklerseniz. Ayrıca 'ro' bölümünü de kaldırdım ve gayet iyi çalışıyor gibi görünüyor.
Sam Bull

4

Aşağıda, ana bilgisayar dizinimden birini kaba bağlamak için ne yaptım. Bu göründüğünden daha zor çünkü başarmak istiyoruz

  • Kabın içinde dizine yazabilmeliyiz.
  • Kapsayıcı dışında, kap içinde oluşturulan dosyalara ve dizinlere yazabilmeliyiz.

Çeşitli makaleleri çevrimiçi okuduktan sonra (en faydalı olanı bu github sorunu ), bunu nasıl çözdüğüm . İşin püf noktası, ana kullanıcının uid ve gid'ini, kabın içindeki kullanıcının uid ve gidine eşlemektir.

Diyelim ki /home/breakds/projectskapta tam olarak aynı yere monte edeceğim . Dış dizinin sahibi breakdsuid ve gid olan kullanıcıdır 1000.

Daha sonra debianuid ve gid de oldu 1000(ilk kök olmayan kullanıcı olduğu için) adlı kapsayıcıda bir kullanıcı oluşturdum . Daha sonra ana bilgisayarda bir (lxc) profie oluşturacağım

lxc profile edit breakds

Ve aşağıda profil içeriği (yaml formatında olduğuna inanıyorum):

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

Ardından, bu profili bu kapsayıcıya kalıcı olarak uygulayın:

$ lxc profile apply <my container> breakds

Bu hile yapmalı.

NOT : Bu profile geçmeden önce, sahibi / grubu debian olan tüm dizinlerin veya dosyaların silineceğini (ve muhtemelen anahtardan sonra yeniden oluşturulduğunu) unutmayın. Bunun nedeni, uid ve gid eşlemesinden sonra sahipliklerinin geçersiz hale gelmesidir. Başlangıçta sadece 1000 ila 1000 eşleme yaptığımdan beri her şeyin iyi olması gerektiğini düşündüm, ancak burada bir şeyleri kaçırdım ve bazıları hack olmadan bunu nasıl çözeceğine dair tavsiyelerde bulunabilseydim harika olurdu.


Ama her zaman chownev sahibi olabilirsiniz.
iBug

1

Bunu, LXC yapılandırma dosyasını doğrudan düzenleyerek LXD olmadan da yapabilirsiniz:

# 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

Ayrıca, / etc / subuid ve / etc / subgid'i düzenleyerek kabın kullanıcı hesabına ana bilgisayardaki uid / gid 1000 ile eşleme izni verildiğinden emin olmanız gerekir:

containeruser:165536:65536
containeruser:1000:1

hangi sistem işlemleri / oluşturulan / etc / subuid? Openwrt buna sahip değil.
mcr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.