2016-11-01 5 views
5

Für ein Projekt muss ich ein Linux-Image in einem Container Docker starten. Das Bild, das ich mounten möchte, ist Raspbian. Ich muss auf das Linux-Dateisystem des Bildes zugreifen und eine Datei hinzufügen.Mount Linux-Image in Docker-Container

ich auf das Bild, indem Sie den Ordner mit dem Volume-Zeichen Montage:

docker run -it -v /path/to/image/folder:/default ubuntu /bin/bash

Mit fdisk -l raspbian.img fand ich den Offset:

Disk raspbian.img: 1.3 GiB, 1389363200 bytes, 2713600 sectors 
Units: sectors of 1 * 512 = 512 bytes 
Sector size (logical/physical): 512 bytes/512 bytes 
I/O size (minimum/optimal): 512 bytes/512 bytes 
Disklabel type: dos 
Disk identifier: 0x5a7089a1 

Device  Boot Start  End Sectors Size Id Type 
raspbian.img1  8192 137215 129024 63M c W95 FAT32 (LBA) 
raspbian.img2  137216 2713599 2576384 1.2G 83 Linux 

Jetzt, wenn ich versuche, das Bild mit mount -o loop,offset=$((137216*512)) raspbian.img /mnt/ zu montieren Ich bekomme mount: /mnt/: mount failed: Unknown error -1. Kann mir jemand erklären, ob ich ein Linux-Image in einem laufenden Docker-Container mounten kann und wenn ja, wie?

bearbeiten

das gleiche tun montieren Operationen in vagrant perfekt funktioniert. Gibt es einige Einschränkungen für das Andocken von Dateisystemen?

+0

Raspbian soll unter Bare-Metal-ARM-Hardware laufen zu lassen , nicht in einer VM. Neben, es erfordert ARM und Sie haben wahrscheinlich Docker/Ubuntu unter einer anderen Plattform richtig eingerichtet? – Alkaline

+0

Ich weiß. Aber ich möchte das Dateisystem des Bildes mounten. Ich will Raspbian nicht booten. – k4l4m

Antwort

7

Gibt es einige Einschränkungen beim Andocken von Dateisystemen?

Ja. Ein Standard-Docker-Container verfügt über eine Reihe von Sicherheitseinschränkungen. Wie Sie herausgefunden haben, können Sie keine neuen Dateisysteme mounten. Sie können die Netzwerkumgebung des Containers auch nicht ändern.

Eine Lösung besteht einfach darin, den Mount-Vorgang auf dem Host auszuführen und dann das gemountete Verzeichnis unter Verwendung des -v-Arguments zu docker run dem Container auszusetzen. Etwas wie:

# losetup -fP --show raspbian.img 
/dev/loop0 
# mount /dev/loop0p2 /mnt 
# docker run -v /mnt:/raspbian ubuntu bash 

Aber wenn Sie wirklich die Halterung im Inneren des Behälters ausführen möchten, können Sie einen privilegierten Behälter laufen kann, mit der --privileged Option docker run. Dadurch werden die meisten Einschränkungen entfernt, die normalerweise für einen Docker-Container gelten:

  • Sie haben vollständigen Zugriff auf den Host /dev.
  • Sie können Dateisysteme mounten.
  • Sie können die Netzwerkkonfiguration im Container ändern.

Zum Beispiel:

# docker run -it --rm --privileged -v /images:/images ubuntu bash 

Jetzt kann ich das Bild inspizieren:

[email protected]:/# fdisk -l /images/2016-09-23-raspbian-jessie-lite.img 
Disk /images/2016-09-23-raspbian-jessie-lite.img: 1.3 GiB, 1389363200 bytes, 2713600 sectors 
Units: sectors of 1 * 512 = 512 bytes 
Sector size (logical/physical): 512 bytes/512 bytes 
I/O size (minimum/optimal): 512 bytes/512 bytes 
Disklabel type: dos 
Disk identifier: 0x5a7089a1 

Device          Boot Start  End Sectors Size Id Type 
/images/2016-09-23-raspbian-jessie-lite.img1  8192 137215 129024 63M c W95 FAT 
/images/2016-09-23-raspbian-jessie-lite.img2  137216 2713599 2576384 1.2G 83 Linux 

Und es montieren:

[email protected]:/# mount -o loop,offset=$((137216*512)) /images/2016-09-23-raspbian-jessie-lite.img /mnt 
[email protected]:/# ls /mnt 
bin dev home lib64  media opt root sbin sys usr 
boot etc lib lost+found mnt proc run srv tmp var 
[email protected]:/# 
+0

Super! Vielen Dank. Vergessen Sie den privilegierten Modus. – k4l4m