Hinzufügen eines freigegebenen Hostverzeichnisses zu einem LXC / LXD-Container

19

Ich habe mit LXC / LXD unter Ubuntu 14.04 experimentiert und es funktioniert alles hervorragend. Ich muss nur herausfinden, wie freigegebene Verzeichnisse zwischen meinem Hostcomputer und einem Container funktionieren, damit ich Virtualbox ein für alle Mal loswerden kann.

Ich habe diese Seite gesehen: https://wiki.gentoo.org/wiki/LXD

Das gibt Anweisungen, aber ich bekomme immer wieder Fehler.

Kennt jemand einfache, klare Anweisungen, um dies zum Laufen zu bringen? Jede Hilfe sehr geschätzt.

user47227
quelle
2
Ich habe es geschafft , eine Host - Verzeichnis zu montieren Verwendung: lxc config device add confexample sharedtmp disk path=/tmp source=/tmp/shared. Betrachtet man jedoch das Verzeichnis auf dem Container, sind der Eigentümer und die Gruppe für die darin enthaltenen Dateien auf "nobody" und "nogroup" gesetzt und der Mount ist schreibgeschützt.
User47227
Könnten Sie bitte etwas mehr Details hinzufügen? Was genau hast du gemacht, was wolltest du erreichen und was ist stattdessen passiert? Sind Sie auf Warn- oder Fehlermeldungen gestoßen? Bitte geben Sie diese in Ihrer Frage vollständig wieder. Sie können Terminalinhalte und die meisten Dialogmeldungen in Ubuntu auswählen, kopieren und einfügen. (Siehe Wie stelle ich eine gute Frage? )
David Foerster
Angenommen, Sie verwenden einen nichtprivilegierten Container und die UID / GID-Zuordnung ist das Problem. Schauen Sie sich diesen Abschnitt eines Artikels über die Benutzerzuordnungen mit LXD an. Dies wurde jedoch wahrscheinlich zu LXD hinzugefügt, nachdem Sie Ihre Frage gestellt haben.
0xC0000022L
Ich weiß nicht, welche Version dies hinzugefügt hat (ich bin auf 2.18), aber wenn möglich, könnten Sie auch die verwenden lxc file, um Dateien zwischen Host und Container zu übertragen, mit pushund pull.
Code_dredd

Antworten:

21

Die Anweisungen auf https://wiki.gentoo.org/wiki/LXD , die Sie erwähnen, sind korrekt, bedürfen jedoch möglicherweise einer weiteren Erläuterung.

Auf dem Host überprüfen Sie zunächst den Besitz des Verzeichnisses, in dem die Containerdaten gespeichert sind. Lauf

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

und überprüfen Sie den Eigentümer des Containers, für den Sie das Verzeichnis freigeben möchten. In meinem Fall waren das uidund gidbeide 100000.

Verwenden Sie diese als Nächstes, um den Eigentümer des Verzeichnisses zu ändern, das Sie freigeben möchten:

sudo chown 100000:100000 /tmp/share_on_host

Teilen Sie das Verzeichnis mit dem Container so, wie Sie es in Ihrem Kommentar angegeben haben:

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

Jetzt werden Sie im Container sehen, dass das Verzeichnis /tmp/share_on_guest(ich würde nicht empfehlen, Ihr Verzeichnis zu mounten, /tmpda dies vom System für andere Dinge verwendet wird und spezielle Berechtigungen hat) im Besitz von root ist. Ab hier können Sie chownim Container verwenden, um den Eigentümer in den entsprechenden uidund gidfür Ihren Benutzer im Container zu ändern .

Als Randnotiz: Nachdem Sie den Eigentümer des Containers auf z. B. einen Benutzer mit uid33 uidgeändert haben, sehen Sie auf dem Host, dass es jetzt 100033 gibt, was durchaus Sinn macht.

ph0t0nix
quelle
Ich bin mir nicht sicher, ob es nur mein Setup ist, aber mit LXD v3.0.3 LTS (Ubuntu 18.04 LTS) habe ich nur symbolische Links gefunden /var/lib/lxd/containers, auf die verwiesen wird /var/lib/lxd/storage-pools/lxd/containers(in diesem Fall ist das letzte lxdBit der Name meines ZFS-Speicherpools). Alle Container dort schienen die gleiche UID / GID von 165536 zu haben, wenn sie ausgeführt wurden und sich im Besitz von befanden, wenn sie root:rootausgeschaltet waren.
Deoren
1
Mir ist klar, dass dies eine alte Frage + Antwort ist, aber in Ubuntu 18.04 musste ich mich mit keiner Erlaubnis herumschlagen. Fügen Sie einfach den Ordner mit lxc configund es hat wie ein Zauber funktioniert!
Apache,
4

Hier ist eine aktualisierte Antwort auf diese Frage.

Hängen Sie den Host-Ordner /var/wwwwie /var/testim Container ein.

lxc config device add mycontainer vartest disk source=/var/www path=/var/test
Guest8354542556745
quelle
Willkommen bei Ask Ubuntu! Ich empfehle , diese Antwort zu bearbeiten , um sie mit spezifischen Details zu erweitern. (Siehe auch Wie schreibe ich eine gute Antwort ?, um allgemeine Hinweise zu erhalten, welche Arten von Antworten auf AskUbuntu als am wertvollsten gelten.)
David Foerster
3

Sie können dem Container zusätzliche Geräte zuweisen. Dies können Ordner sein, auf die der Host zugreifen kann.

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

Beachten Sie, dass dies <device>nur ein willkürlicher Name ist, den Sie zuweisen und der als ID für die nachfolgende Geräteverwaltung verwendet wird.

Um beispielsweise den Host-Ordner "./host" als "/ mnt / host" in den Container einzubinden ...

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

Es bleibt ein Problem : Wenn dieser Ordner sowohl vom Host als auch vom Container beschreibbar sein soll, müssen Eigentümer und Berechtigungen entsprechend konfiguriert werden. Dies wird durch den Standardmodus von LXD erschwert, der die numerischen Bereiche für Benutzer- und Gruppenwerte virtualisiert id. Es gibt jedoch eine einfache Lösung : Umgehen Sie diese Virtualisierung, indem Sie den Container so konfigurieren, dass er mit Host-äquivalenten Berechtigungen ausgeführt wird.

lxc config set <container> security.privileged true

Die vollständigen Auswirkungen dieses Ansatzes auf die Host-Sicherheit sind mir derzeit nicht klar, scheinen aber von der Virtualisierung etwas "eingegrenzt" zu sein. Das praktische Risiko hängt davon ab, wie und warum Sie den Behälter verwenden. Siehe technische Hinweise unter https://insights.ubuntu.com/2017/06/15/custom-user-mappings-in-lxd-containers

Beachten Sie außerdem, dass dieser Ansatz wahrscheinlich am besten funktioniert, wenn Sie normalerweise als Nicht-Root-Benutzer im Container arbeiten, z. B. wenn Sie Folgendes anhängen:

lxc exec zesty -- su --login ubuntu
kein Balken
quelle
Es gibt ein Problem mit dem Nicht-Root-Login: Das envist insbesondere anders http_proxy. Ein Beispiel Umgehung: sudo http_proxy=http://[fe80::1%eth0]:13128 apt-get update.
Nobar
In Bezug auf http_proxy, ich denke , die einfachere Lösung wahrscheinlich IPV4 zu ermöglichen , ist wie besprochen hier .
Nobar
... gefolgt von sudo dhclientim Container - oder wechseln manualzu dhcpin 50-cloud-init.cfg. Schöne Hinweise hier: github.com/lxc/lxd/issues/1298
nobar
1
Dies ist eine offensichtlich schlechte Idee. Die Empfehlung, auf privilegierte Container umzusteigen, untergräbt einen der größten Fortschritte, die LXD gebracht hat. Während LXC 1.x auch die Möglichkeit bot, nichtprivilegierte Container (und ja, sogar als Root) zu verwenden, war es etwas komplizierter, die Details zu klären. Mit LXD gehört dies der Vergangenheit an. Was ist außerdem so kompliziert daran, ACLs für einen Ordner festzulegen, um der host-seitigen UID den erforderlichen Zugriff zu ermöglichen oder die hier beschriebene Methode zu verwenden ? Ja, die Zuordnung von UIDs / GIDs ist nicht der einzige Weg!
0xC0000022L
1

Basierend auf der ausgezeichneten Antwort von ph0t0nix schlage ich für meinen Ubuntu 18.04-Server den folgenden schrittweisen Ansatz vor:

  1. Bestimmen Sie im Host die UID des Eigentümers von rootfs:

    sudo ls -l /var/lib/lxd/storage-pools/lxd/containers/webserver/rootfs  
    id -u root    100000
  2. Bestimmen Sie im Container die UID von Ubuntu (dh Benutzer im Container):

    id -u ubuntu    1000
  3. Erstellen Sie einen freigegebenen Ordner auf dem Host und fügen Sie ihn dem Container hinzu:

    lxc config device add webserver mydevicename disk path=/home/share_on_guest source=/home/share_on_host
  4. Passen Sie die Host-UID des freigegebenen Ordners an (UID = UID-Host + UID-Gast):

    sudo chown 101000:101000 /home/share_on_host
  5. Gast (Benutzer ubuntu) hat jetzt Zugriff auf freigegebenen Ordner und kann den Containerzugriff auf freigegebenen Ordner mit anpassen chmod.

Jörg
quelle
0

Ich habe jetzt eine funktionierende, sichere Lösung für dieses Problem, indem ich LXD-Profile verwende, um die Zuordnung zwischen UID und GID im Container und auf dem Host zu handhaben.

Eine sehr nützliche Zusammenfassung finden Sie hier:

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

user47227
quelle
5
Beachten Sie, dass es unter Sicherheitsgesichtspunkten in der Regel eine schlechte Idee ist, Dinge von der Welt aus beschreibbar zu machen. Sie sollten sich wahrscheinlich mit POSIX-ACLs im Host-Pfad befassen und dem Benutzer des Containers Zugriff gewähren, indem Sie eine bestimmte ACL für diese UID und dann für jeden anderen Host-Benutzer, der ebenfalls Schreibzugriff benötigt, hinzufügen.
Stgraber
1
@stgraber, obwohl ich dem, was Sie gesagt haben, zustimme, habe ich keine Ahnung, wie ich das einrichten soll. Einige Links wären hilfreich.
S3V3N
Bitte empfehlen 0777Sie die Berechtigungen "Bitte hacken Sie mein System und zerstören Sie meine Daten" nicht ohne ersichtlichen Grund! Es gibt fast keinen Grund dafür, da dies durch sinnvollere Änderungen wie das Ändern der (Gruppen-) Eigentümerschaft vermieden werden kann. -1
David Foerster
Ich verstehe Ihren Standpunkt, aber ich habe ihn nur als vorübergehende Problemumgehung auf einem einzelnen Benutzerentwicklungscomputer verwendet, sofern keine andere Möglichkeit vorhanden ist, damit er funktioniert. Seitdem habe ich herausgefunden, dass die Verwendung von Profilen der Weg ist, um damit umzugehen, siehe meine bearbeitete Antwort oben!
User47227
1
Was ist so schwer an der Verwendung von ACLs oder der hier beschriebenen Methode ?
0xC0000022L