LXC: Wie kann ich einen Ordner vom Host in den Container mounten?

22

Ich versuche, einen Ordner auf dem Host in einem LXC-Container bereitzustellen.

Der Host hat einen Ordner /mnt/ssd/solr_dataerstellt (dieser befindet sich derzeit im Root-Dateisystem, aber später werde ich dort ein SSD-Laufwerk einbinden, also bereite ich mich darauf vor).

Ich möchte, dass dieser Ordner wie /dataim Container eingehängt wird.

Also in der Container-Fstab-Datei habe ich Folgendes:

/mnt/ssd/solr_data      /var/lib/lxc/Solr4StandAlone/rootfs/data        ext4    defaults,noatime        0       0

Aber das ist ein No-Go, ich bekomme diesen Fehler beim Starten des Containers:

lxc-start: No such file or directory - failed to mount '/mnt/ssd/solr_data' on '/usr/lib/x86_64-linux-gnu/lxc//data'
lxc-start: failed to setup the mounts for 'Solr4StandAlone'
lxc-start: failed to setup the container
lxc-start: invalid sequence number 1. expected 2
lxc-start: failed to spawn 'Solr4StandAlone'
David Parks
quelle

Antworten:

15

Um das Verzeichnis automatisch im Container zu erstellen, können Sie auch die create=dirOption in der fstab hinzufügen :

/mnt/ssd/solr_data      /var/lib/lxc/Solr4StandAlone/rootfs/data        none   bind,create=dir

Bearbeiten: Dies ist spezifisch für LXC. Siehe diesen Thread

Genau wie wir bereits "optional" hatten, werden zwei neue LXC-spezifische Mount-Flags hinzugefügt:

  • create = dir (Führt ein mkdir_p auf dem Pfad aus)

  • create = file (führt ein mkdir_p für den Verzeichnisnamen und ein fopen für den Pfad aus)

Dies wurde durch einige der benötigten Bindemontagen für die nicht privilegierten Container motiviert.

kleine Kerl
quelle
1
Für welche Version mountgilt dies? Ich konnte mount(8)zum Beispiel die in Ubuntu 14.04 beschriebene Option nicht finden .
0xC0000022L
Auch nicht in der neuestenmount(8)
0xC0000022L
2
in der tat ... sieht so aus, als würde es nur mit lxc funktionieren. Siehe diesen Thread auf LXC-Devel ML
Little-Dude
12

In /var/lib/lxc/Solr4StandAlone/configeine Zeile gelesen:

lxc.mount.entry = /mnt/ssd/solr_data  /var/lib/lxc/Solr4StandAlone/rootfs/data none bind 0 0

lxc-stopStoppen Sie dann Ihren Behälter und lxc-startIhren Behälter wieder.

Das ist alles was benötigt wird.

ref: Referenzlink

Mausy5043
quelle
2
Ihre Lösung sollte eine bessere Bewertung erhalten, da sie mit dem nicht privilegierten LXC-Container-Tool funktioniert. Die anderen funktionieren in diesem Fall nicht. Und wahrscheinlich müsste Selinux / Apport angepasst werden, um ihre Methode zu ermöglichen. +1 für Ihre Lösung!
Huygens
10

Ich musste den /dataOrdner im lokalen Container erstellen, bevor der Mount ordnungsgemäß funktionieren würde.

Ich habe auch diesen fstab-Eintrag benutzt:

/mnt/ssd/solr_data      /var/lib/lxc/Solr4StandAlone/rootfs/data        none   bind     0       0
David Parks
quelle
bindDie Mount-Option fehlte im OP. Ich glaube, es ist die wichtigste Korrektur (auch in allen anderen Arbeitsantworten vorhanden).
imz - Ivan Zakharyaschev
9

Ab dem 30.09.2015 bricht eine Änderung aufgrund eines Sicherheitspatches das Mounten auf einen absoluten Pfad mit lxc.mount.entry in der Konfigurationsdatei ab.

Stattdessen können Sie einen relativen Pfad verwenden

 lxc.mount.entry = /mnt/ssd/solr_data data none bind 0 0

Siehe: https://wiki.debian.org/LXC#Bind_mounts_inside_the_container

KeksNinja
quelle
Tolle Ergänzung, es funktioniert als Antwort, es wird hochgestuft, damit die Leute es bald sehen. Danke fürs Hinzufügen!
David Parks
5

Da sich LXC im Laufe der Zeit geändert hat, kann dies sehr einfach sein, aber es hat mich ein wenig verblüfft und ich wollte dazu beitragen. Ich habe auch eine Liste dafür erstellt, damit ich mich an mich selbst erinnern kann, aber die einfache Verwendung von lxc config device reicht aus.

sudo lxc config device add Solr4StandAlone sdb disk source=/var/lib/lxc/Solr4StandAlone/rootfs/data path=mnt/ssd/solr_data

Hinweis: Es ist wichtig, den vorderen Schrägstrich aus dem Pfadargument aufgrund einer von @biscuitNinja erwähnten Änderung zu lassen

Mounten von Verzeichnissen vom Container zum Host

ekydfejj
quelle
1

Wenn Sie libvirtIhren lxcContainer mit erstellen , können Sie das Verzeichnis auf dem Host passthroughwie folgt festlegen:

root@localhost:/# cat /etc/libvirt/lxc/my_container.xml
...
 <filesystem type='mount' accessmode='passthrough'>
    <source dir='<dir on host>'/>
    <target dir='<dir on container>'/>
 </filesystem>
....
Swanand Pashankar
quelle