2014-02-25 10 views
9

Ich benutze einen Docker Container (basierend auf dem offiziellen Centos: 6.4 Image) um eine ISO zu erstellen, die ich dann mounten und verifizieren muss. Ich kann die ISO-Montage mit:Ist es möglich, eine ISO in einem Andockbehälter zu montieren?

sudo mount -o loop /path/to/iso /mnt 

Gibt:

mount: Could not find any loop device. Maybe this kernel does not know 
    about the loop device? (If so, recompile or `modprobe loop'.) 

Es sieht aus wie der Kernel ohne Loop-Gerät Unterstützung kompiliert wurde. Ist es möglich, Docker-Images zu erstellen, die Loop-Geräte unterstützen? Ich konnte jedoch keine Informationen dazu finden, wenn man this thread betrachtet, scheint es, dass dies ein fortlaufendes Thema sein könnte.

Ich frage mich, ob es eine Möglichkeit gibt, diese Einschränkung zu umgehen?

Antwort

1

Ich bezweifle, dass es der Kernel ist. Es sieht eher so aus, als hätte Ihr Docker-Container keine Loop-Geräte. Haben Sie versucht, losetup zu verwenden?

+0

Hallo, vielen Dank für Ihre Antwort. Kannst du mir ein bisschen mehr Informationen über deinen Vorschlag geben? Die Beispiele auf der Manpage "losetup" legen nahe, dass die Schleifeneinträge in/dev existieren, was in diesem Fall nicht der Fall ist (Inhalt von '/ dev': console full kmsg mapper null ptmx pts zufälliger shm stderr stdin stdout tty tty1 urandom null '). Es sah so aus, als wäre die Verwendung von 'dmsetup' eine Option, aber wiederum gibt es nicht viele Informationen darüber, wie dies geschehen würde. – pxul

+0

Was gibt 'losetup -f'? – abligh

+0

So wie ich es vom mount-Befehl bekomme: 'losetup: Konnte kein Loop-Gerät finden. Vielleicht weiß dieser Kernel nichts über das Loop-Gerät? (Wenn ja, kompiliere oder modprobe Schleife.) ' – pxul

4

Ich habe das Gefühl, das ist kein guter Weg, um mein Problem zu lösen, aber das ist, was ich vorerst getan habe, bis sich eine vernünftigere Idee ergibt.

Mein Container beginnt in bash, aus dieser Schale Ich bin in der Lage Loop-Geräte hinzufügen mit:

# mknod /dev/loop0 -m0660 b 7 0 
# mknod /dev/loop1 -m0660 b 7 1 
... 
# mknod /dev/loop9 -m0660 b 7 9 

und jetzt, ich habe Loop-Geräte zur Verfügung, so dass ich im Stande bin, ein ISO zu montieren. Ich bemerkte jedoch, dass das erste verfügbare Loop-Gerät für mich /dev/loop2 war:

bash-4.1# losetup -f 
/dev/loop2 

bedeutet dies, dass loop0 und loop1 ist bereits im Einsatz, dies bestätigt:

bash-4.1# losetup -a 
/dev/loop0: [fd00]:1978974 (/dev/loop0) 
/dev/loop1: [fd00]:1978975 (/dev/loop1) 
/dev/loop2: [fd00]:2369514 (/path/to/my/iso) 

und, deshalb ich denke, diese Lösung schlecht ist, von außerhalb des Behälters:

12:36:02 $ losetup -a 
/dev/loop0: []: (/var/lib/docker/devicemapper/devicemapper/data) 
/dev/loop1: []: (/var/lib/docker/devicemapper/devicemapper/metadata) 
/dev/loop2: []: (/path/to/my/iso) 

So sieht es aus wie die ersten 2 Loop-Geräte I in dem Behälter geschaffen abgebildet loop0 und loop1 außerhalb des Behälters, weshalb sie nicht zur Verfügung standen. Ich denke, es muss eine Möglichkeit geben, diese Geräte mit devicemapper einzurichten (das wird von Docker verwendet, nach dem Aussehen), aber ich konnte nicht viele Informationen dazu finden.

Bis auf weiteres wird diese Lösung für mich in Ordnung sein - ich muss nur vorsichtig sein, sich an umount das Bild zu erinnern, wenn ich damit fertig bin.

Ich bin mir bewusst, dass dies alles andere als eine vernünftige Lösung ist, also wenn jemand anderes einen besseren Plan aufstellen kann, bin ich ganz Ohr.

13

Um eine ISO innerhalb eines Behälters zu montieren, müssen Sie zwei Dinge:

  • Zugriff auf Loop-Geräte,
  • Erlaubnis Dateisysteme zu montieren.

Standardmäßig dockt Docker beide Dinge an; deshalb erhalten Sie diese Fehlermeldung.

Die einfachste Lösung ist, den Container im privilegierten Modus zu starten (docker run -privileged ...).

Eine feinkörnigere Lösung besteht darin, in die Funktionen cgroup und container der Geräte zu tauchen, um die erforderlichen Berechtigungen zu erhalten.

Beachten Sie, dass Sie privilegierte Operationen nicht als Teil einer Dockerdatei ausführen können. Wenn Sie diese ISO in eine Docker-Datei einbinden müssen, können Sie dies nicht tun.

Allerdings empfehle ich Ihnen einen Blick auf Xorriso haben und speziell das osirrox-Tool, das Sie nur Dateien von ISO-Images extrahieren können, wie Sie eine TAR-Datei extrahieren würde, ohne jede Art von besonderen Zugang zu erfordern, zB:

osirrox -indev /path/to/iso -extract//full-iso-contents 
Verwandte Themen