Jak udostępnić katalog między kontenerem LXC a hostem?


15

Jak mogę udostępnić folder między systemem hosta (ubuntu 14.04) a kontenerem ubuntu lxc?

Próbowałem zamontować folder na hoście:

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

ale nie widzę żadnych plików.

To samo dotyczy:

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

Czy muszę zmienić uprawnienia do folderu udostępniania?

Odpowiedzi:


13

Zgodnie z dokumentacją LXC można to zrobić za pomocą uprzywilejowanego kontenera:

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

Zauważ, że jest to dokumentacja LXD, a nie LXC. Jeśli nie zainstalowałeś LXD, to komenda lxc nie będzie działać.
Sam Bull

@SamBull cóż, jest to efekt narzucony przez zespół LXC / LXD. LXC może być używany w odniesieniu do liblxc (biblioteka bazowa) lub do klienta LXD (o nazwie lxd), jak zastosowano w tej odpowiedzi, lub do LXC (oprogramowanie i „stary” zestaw narzędzi z narzędziami o lxc-*nazwach) lub do projektu (gdzie LXC jest skrótem od LinuX Containers). To jest powód, dla którego zadałem to pytanie w meta Unix.SE.
0xC0000022L

12

Znalazłem artykuł na wiki openSUSE: https://en.opensuse.org/User:Tsu2/LXC_mount_shared_directory

Postępowałem zgodnie z instrukcjami i teraz działa.

Utwórz katalog hosta:

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

Utwórz katalog w kontenerze lxc:

mkdir /share

Edytuj plik konfiguracyjny lxc na hoście:

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

Czy istnieje powód, aby zdefiniować ten wpis montowania jako „tylko do odczytu”? Czy to dobra praktyka bezpieczeństwa, aby unikać kontenera, który mógłby zapisywać dane we współdzielonym systemie plików ?.
jgomo3

1
Pracował dla mnie. Zauważ, że ścieżka względna zastosowana sharew lxc.mount.entryjest krytyczna.
HRJ,

1
Nie musisz tworzyć punktu montowania, jeśli dodasz „, create = dir” po „bind”. Usunąłem również część „ro” i wydaje się, że działa dobrze.
Sam Bull

4

Poniżej zrobiłem, aby zamontować jeden z moich katalogów hosta w kontenerze. To trudniejsze niż się wydaje, ponieważ chcielibyśmy to osiągnąć

  • Wewnątrz kontenera powinniśmy mieć możliwość zapisu do katalogu.
  • Poza kontenerem powinniśmy móc zapisywać do plików i katalogów utworzonych w kontenerze.

Po przeczytaniu różnych artykułów online (najbardziej pomocny jest ten problem z githubem ), oto jak to rozwiązać. Sztuczka polega na mapowaniu identyfikatora UID i GID użytkownika hosta na identyfikator UID i GID użytkownika wewnątrz kontenera.

Załóżmy, że zamierzam zamontować /home/breakds/projectsdokładnie w tym samym miejscu w kontenerze. Katalog zewnętrzny jest własnością użytkownika breakds, którego identyfikator UID i GID to 1000.

Następnie utworzyłem użytkownika w kontenerze o nazwie debian, którego identyfikator użytkownika i identyfikator gid również się zdarzyło 1000(ponieważ jest to pierwszy użytkownik inny niż root). Następnie utworzę (lxc) profie na hoście przez

lxc profile edit breakds

A poniżej jest treść profilu (uważam, że jest w formacie 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

Następnie zastosuj ten profil do tego kontenera na stałe:

$ lxc profile apply <my container> breakds

To powinno załatwić sprawę.

UWAGA : Należy pamiętać, że przed przejściem do tego profilu upewnij się, że wszystkie katalogi lub pliki, których właścicielem / grupą jest debian, powinny zostać usunięte (i prawdopodobnie ponownie utworzone po zmianie). Wynika to z faktu, że po mapowaniu UID i GID ich własność stanie się nieważna. Początkowo myślałem, ponieważ po prostu mapuję 1000 na 1000 wszystko powinno być w porządku, ale myślę, że coś tu przegapiłem i byłoby wspaniale, gdyby ktoś mógł doradzić, jak rozwiązać ten problem bez włamania.


Ale zawsze możesz chownz hosta.
iBug

1

Możesz to również zrobić bez LXD, bezpośrednio edytując plik konfiguracyjny LXC:

# 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

Musisz również upewnić się, że konto użytkownika kontenera ma pozwolenie na mapowanie do identyfikatora UID / GID 1000 na hoście poprzez edycję / etc / subuid i / etc / subgid:

containeruser:165536:65536
containeruser:1000:1

jaki system przetwarza / utworzył / etc / subuid? Openwrt tego nie ma.
mcr
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.