Wie teile ich ein Verzeichnis zwischen einem LXC-Container und dem Host?


14

Wie kann ich einen Ordner zwischen dem Hostsystem (Ubuntu 14.04) und einem Ubuntu LXC-Container freigeben?

Ich habe versucht, den Ordner auf dem Host zu mounten:

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

aber ich kann keine dateien sehen.

Das gleiche gilt für:

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

Muss ich die Berechtigungen für den Freigabeordner ändern?

Antworten:


12

Ich habe einen Artikel im openSUSE-Wiki gefunden: https://en.opensuse.org/User:Tsu2/LXC_mount_shared_directory

Ich folgte den Schritten und es funktioniert jetzt.

Erstellen Sie ein Host-Verzeichnis:

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

Erstellen Sie ein Verzeichnis im lxc-Container:

mkdir /share

Bearbeiten Sie die lxc-Konfigurationsdatei auf dem Host:

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

Gibt es einen Grund, diesen Mount-Eintrag als schreibgeschützt zu definieren? Ist das eine gute Sicherheitsmaßnahme, um zu vermeiden, dass ein Container Daten in ein freigegebenes Dateisystem zurückschreibt?
jgomo3

1
Hat für mich gearbeitet. Beachten Sie, dass der relative Pfad, der sharein verwendet lxc.mount.entrywird, kritisch ist.
HRJ

1
Sie müssen den Einhängepunkt nicht erstellen, wenn Sie ', create = dir' nach 'bind' hinzufügen. Ich habe auch den 'ro'-Teil entfernt und es scheint gut zu funktionieren.
Sam Bull

12

Laut der LXC-Dokumentation können Sie dies über einen privilegierten Container tun:

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

Beachten Sie, dass dies die LXD-Dokumentation und nicht LXC ist. Wenn Sie LXD nicht installiert haben, funktioniert der Befehl lxc nicht.
Sam Bull

@SamBull na ja, das hat das LXC / LXD-Team selbst zugefügt. LXC kann verwendet werden, um auf liblxc (die zugrunde liegende Bibliothek) oder den LXD-Client (benannt lxd) zu verweisen, wie er in dieser Antwort verwendet wird, oder auf LXC (die Software und das "alte" Toolset mit den lxc-*benannten Tools) oder auf das Projekt (wo LXC ist die Abkürzung für LinuX Containers. Dies ist der Grund, warum ich diese Frage auf der Unix.SE-Meta gestellt habe.
0xC0000022L

4

Im Folgenden wird beschrieben, wie ich eines meiner Hostverzeichnisse in den Container eingebunden habe. Das ist kniffliger als es sich anhört, weil wir es erreichen möchten

  • Innerhalb des Containers sollten wir in das Verzeichnis schreiben können.
  • Außerhalb des Containers sollten wir in der Lage sein, in die im Container erstellten Dateien und Verzeichnisse zu schreiben.

Nachdem ich verschiedene Artikel online gelesen habe (das hilfreichste ist dieses Github-Problem ), hier ist, wie ich das löse. Der Trick besteht darin, die Benutzer-ID und die Benutzer-ID des Host-Benutzers der Benutzer-ID und der Benutzer-ID im Container zuzuordnen.

Angenommen, ich werde /home/breakds/projectsgenau an derselben Stelle im Container montiert . Das externe Verzeichnis gehört dem Benutzer breakds, dessen UID und GID es sind 1000.

Ich habe dann einen Benutzer in dem Container namens " debianuid" und "gid" erstellt 1000(weil es der erste Benutzer ist, der kein Root-Benutzer ist). Ich erstelle dann einen (lxc) -Profi auf dem Host von

lxc profile edit breakds

Und unten ist der Inhalt des Profils (ich glaube, es ist im Yaml-Format):

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

Wenden Sie dann dieses Profil dauerhaft auf diesen Container an:

$ lxc profile apply <my container> breakds

Dies sollte den Trick machen.

HINWEIS : Bitte beachten Sie, dass Sie vor dem Wechsel zu diesem Profil sicherstellen müssen, dass alle Verzeichnisse oder Dateien, deren Eigentümer / Gruppe Debian ist, gelöscht werden (und möglicherweise nach dem Wechsel neu erstellt werden). Dies liegt daran, dass nach der Zuordnung von uid und gid ihr Besitz ungültig wird. Ich dachte ursprünglich, da ich nur 1000 auf 1000 abbilden möchte, sollte alles in Ordnung sein, aber ich denke, ich habe hier etwas verpasst und es wäre großartig, wenn jemand einen Rat geben könnte, wie man dies ohne den Hack lösen kann.


Aber Sie können immer chownvom Host.
iBug

1

Sie können dies auch ohne LXD tun, indem Sie die LXC-Konfigurationsdatei direkt bearbeiten:

# 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

Sie müssen auch sicherstellen, dass das Benutzerkonto des Containers die Berechtigung zum Zuordnen zu UID / GID 1000 auf dem Host erhält, indem Sie / etc / subuid und / etc / subgid bearbeiten:

containeruser:165536:65536
containeruser:1000:1

Welches System verarbeitet / created / etc / subuid? Openwrt hat das nicht.
mcr
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.