Dodanie współdzielonego katalogu hosta do kontenera LXC / LXD


19

Eksperymentowałem z LXC / LXD na Ubuntu 14.04 i wszystko działa świetnie. Muszę tylko dowiedzieć się, jak udostępnić katalogi współdzielone między moją maszyną hosta a kontenerem, aby móc raz na zawsze porzucić Virtualbox.

Widziałem tę stronę: https://wiki.gentoo.org/wiki/LXD

Które zawiera instrukcje, ale wciąż otrzymuję błędy.

Czy ktoś zna jakieś proste, jasne instrukcje, aby to zadziałało? Każda pomoc bardzo doceniana.


2
Udało mi się zamontować katalog hosta przy użyciu: lxc config device add confexample sharedtmp disk path=/tmp source=/tmp/shared. Ale patrząc na katalog w kontenerze, właściciel i grupa plików w nim są ustawione na „nobody” i „nogroup”, a mount jest tylko do odczytu.
user47227,

Czy możesz dodać trochę więcej szczegółów? Co dokładnie zrobiłeś, co chciałeś osiągnąć, a co zamiast tego? Czy napotkałeś jakieś ostrzeżenia lub komunikaty o błędach? Powtórz je w całości w swoim pytaniu. Możesz wybierać, kopiować i wklejać zawartość terminala oraz większość komunikatów dialogowych w Ubuntu. (patrz Jak zadać dobre pytanie? )
David Foerster,

Zakładając, że używasz nieuprzywilejowanego kontenera, a problem stanowi mapowanie UID / GID, zapoznaj się z tą sekcją artykułu o mapowaniach userns w LXD. Prawdopodobnie zostało to jednak dodane do LXD po zadaniu pytania.
0xC0000022L,

Nie wiem, która wersja to dodała (korzystam z wersji 2.18), ale jeśli to możliwe, możesz również użyć lxc filedo przeniesienia plików między hostem a kontenerem, używając pushi pull.
code_dredd

Odpowiedzi:


21

Wymienione instrukcje na https://wiki.gentoo.org/wiki/LXD są poprawne, ale mogą wymagać nieco więcej wyjaśnień.

Na hoście najpierw sprawdź własność katalogu, w którym przechowywane są dane kontenera. Biegać

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

i sprawdź właściciela kontenera, któremu chcesz udostępnić katalog. W moim przypadku uidi gidoba były 100000.

Następnie użyj tych, aby zmienić własność katalogu, który chcesz udostępnić:

sudo chown 100000:100000 /tmp/share_on_host

Udostępnij katalog kontenerowi w sposób wskazany w komentarzu:

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

Teraz w kontenerze zobaczysz, że katalog /tmp/share_on_guest(nie radziłbym montować twojego katalogu, /tmpponieważ jest używany przez system do innych rzeczy i ma specjalne uprawnienia) jest własnością root. Odtąd możesz używać chownw kontenerze, aby zmienić własność na odpowiednią uidi giddla swojego użytkownika w kontenerze.

Na marginesie, po zmianie właściciela w kontenerze na np. Użytkownika z uid33, zobaczysz na hoście, uidże jest teraz 100033, co ma sens.


Nie jestem pewien, czy to tylko moja konfiguracja, ale w LXD v3.0.3 LTS (Ubuntu 18.04 LTS) nie znalazłem nic oprócz dowiązań symbolicznych w obrębie /var/lib/lxd/containerstego, na który wskazywałem /var/lib/lxd/storage-pools/lxd/containers(w tym przypadku ostatnim lxdbitem jest nazwa mojej puli pamięci ZFS). Wydaje się, że wszystkie kontenery mają ten sam identyfikator UID / gid 165536 podczas pracy i są własnością, root:rootgdy są wyłączone.
deoren

1
Zdaję sobie sprawę, że to stare pytanie + odpowiedź, ale w Ubuntu 18.04 nie musiałem w ogóle zadzierać z żadnym pozwoleniem. Wystarczy dodać folder lxc configi działało to jak urok!
Apache

4

Oto zaktualizowana odpowiedź na to pytanie.

Zamontuj folder hosta /var/wwwjak /var/testw kontenerze.

lxc config device add mycontainer vartest disk source=/var/www path=/var/test

Witamy w Ask Ubuntu! Zalecam edycję tej odpowiedzi, aby rozszerzyć ją o szczegółowe informacje na temat tego, jak to zrobić. (Zobacz także Jak napisać dobrą odpowiedź? Zawiera ogólne porady na temat tego, jakie rodzaje odpowiedzi są uważane za najcenniejsze na AskUbuntu.)
David Foerster,

3

Do kontenera można przypisać dodatkowe urządzenia , które mogą być folderami dostępnymi dla hosta.

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

Pamiętaj, że <device>to tylko dowolna przypisana nazwa, która będzie używana jako identyfikator do późniejszego zarządzania urządzeniem.

Na przykład, aby zamontować folder hosta „./host” jako „/ mnt / host” w kontenerze ...

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

Pozostaje jeden problem - jeśli chcesz, aby ten folder był zapisywalny zarówno przez hosta, jak i kontener, należy odpowiednio skonfigurować własność i uprawnienia. Komplikuje to domyślny tryb LXD, który wirtualizuje zakresy liczbowe dla wartości użytkowników i grup id. Istnieje jednak proste rozwiązanie : ominąć tę wirtualizację, konfigurując kontener do działania z uprawnieniami równoważnymi z hostem ...

lxc config set <container> security.privileged true

Pełne konsekwencje tego podejścia dla bezpieczeństwa hosta są dla mnie niejasne, ale wydaje się, że wirtualizacja jest nieco „ograniczona”. Praktyczne ryzyko zależy od tego, jak i dlaczego będziesz używać pojemnika. Zobacz uwagi techniczne na https://insights.ubuntu.com/2017/06/15/custom-user-mappings-in-lxd-containers

Zwróć też uwagę, że to podejście prawdopodobnie działa najlepiej, jeśli normalnie operujesz w kontenerze jako użytkownik inny niż root, na przykład jeśli łączysz się z ...

lxc exec zesty -- su --login ubuntu

Problem dotyczy logowania użytkownika innego niż root: envw szczególności jest inaczej http_proxy. Przykładem rozwiązania: sudo http_proxy=http://[fe80::1%eth0]:13128 apt-get update.
nobar

Jeśli chodzi o http_proxy, myślę, że łatwiejszym rozwiązaniem jest prawdopodobnie włączenie IPV4, jak omówiono tutaj .
nobar

... a następnie sudo dhclientw pojemniku - lub zmiany manualdo dhcpw 50-cloud-init.cfg. Ładne wskazówki tutaj: github.com/lxc/lxd/issues/1298
nobar

1
To ewidentnie zły pomysł. Polecenie przejścia na uprzywilejowane kontenery obala jeden z bardzo zaawansowanych osiągnięć LXD. Chociaż LXC 1.x oferował również możliwość korzystania z nieuprzywilejowanych kontenerów (i tak, nawet jako root), nieco trudniej było uporządkować szczegóły. Dzięki LXD to już przeszłość. Poza tym, co jest takiego skomplikowanego w ustawianiu list ACL w niektórych folderach, aby umożliwić UID po stronie hosta wymagany dostęp lub skorzystać z metody opisanej tutaj ? Tak mapowanie UID / GID to nie jedyny sposób!
0xC0000022L

1

W oparciu o doskonałą odpowiedź ph0t0nix , proponuję następujące podejście krok po kroku dla mojego serwera Ubuntu 18.04:

  1. W hoście określ identyfikator UID właściciela rootfs:

    sudo ls -l /var/lib/lxd/storage-pools/lxd/containers/webserver/rootfs  
    id -u root    100000
  2. W kontenerze określ UID Ubuntu (tj. Użytkownik w kontenerze):

    id -u ubuntu    1000
  3. Utwórz folder współdzielony na hoście i dodaj go do kontenera:

    lxc config device add webserver mydevicename disk path=/home/share_on_guest source=/home/share_on_host
  4. Dostosuj identyfikator UID hosta folderu współdzielonego (UID = host UID + gość UID):

    sudo chown 101000:101000 /home/share_on_host
  5. Gość (użytkownik ubuntu) ma teraz dostęp do folderu współdzielonego i może dostosować dostęp do folderu współdzielonego do folderu współdzielonego za pomocą chmod.


0

Mam teraz działające, bezpieczne rozwiązanie tego problemu, używając profili LXD do obsługi mapowania między UID i GID w kontenerze i na hoście.

Bardzo przydatną treść można znaleźć tutaj:

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


5
Zauważ, że robienie rzeczy, które można zapisać na całym świecie, jest zwykle złym pomysłem z punktu widzenia bezpieczeństwa. Prawdopodobnie powinieneś rozważyć użycie list ACL POSIX na ścieżce hosta, przyznając dostęp do użytkownika kontenera poprzez dodanie konkretnej listy ACL dla tego identyfikatora użytkownika, a następnie dla każdego innego użytkownika hosta, który również potrzebuje dostępu do zapisu.
stgraber

1
@stgraber, chociaż zgadzam się z tym, co powiedziałeś, nie mam pojęcia, jak to skonfigurować. Niektóre linki byłyby pomocne.
s3v3n

Proszę nie polecać 0777aka uprawnień „proszę hack-mój-system-i-zniszcz-moje-dane” bez wyraźnego powodu! Prawie nigdy nie ma tego powodu, ponieważ można tego uniknąć dzięki bardziej sensownym modyfikacjom, takim jak zmiana własności (grupy). -1
David Foerster,

Rozumiem twój punkt widzenia, ale użyłem go tylko jako tymczasowego obejścia na maszynie programistycznej dla jednego użytkownika, przy braku innego sposobu na jego uruchomienie. Od tego czasu odkryłem, że używanie profili jest sposobem na poradzenie sobie z tym, zobacz moją zredagowaną odpowiedź powyżej!
user47227,

1
Co jest takiego trudnego w używaniu list ACL lub opisanej tutaj metody ?
0xC0000022L
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.