Images anlegen qemu-img create, kvm-img dd iso raw qcow qcow2 Overlay ovl, sparse image, sparse files, genisoimage
(Link zu dieser Seite als [[QEMU-KVM-Buch/ Speichermedien/ Images anlegen]])
Inhaltsverzeichnis |
[bearbeiten] Images anlegen
Virtuelle Maschinen nutzen meist Image-Dateien als virtuelle Speichermedien. Diese lassen sich problemlos auf andere Rechner übertragen und sind damit flexibler einsetzbar als die ebenfalls mögliche Nutzung realer Festplatten. Nach dem Anlegen müssen diese Image-Dateien, wie reale Speichermedien, partitioniert und formatiert werden. Dies kann durch Programme der Gast-Systeme geschehen.
[bearbeiten] Anlegen von Images mit qemu-img
Das mit QEMU/KVM mitgelieferte Kommandozeilentool qemu-img beziehungsweise kvm-img wird mit dem Parameter create zur Erzeugung von Image-Dateien aufgerufen. Nach diesem Parameter wird der Dateiname und die virtuelle Größe des Images angegeben.
Host ~$ qemu-img create Platte.img 1G Formating 'Platte.img', fmt=raw, size=1048576 kB
Hier wurde die virtuelle Größe mit einem GByte vorgegeben. Im Dateisystem des Host-Systems wird die erzeugte Datei auch mit einer Größe von einem GByte ausgewiesen. Der Grund ist, dass ohne explizite Vorgabe eines Image-Formates automatisch das Image im raw-Format angelegt wird. Die Größe der Datei wird anhand der Werkzeuge des Betriebssystems ermittelt. Unter Microsoft Windows erledigt das der Befehl dir oder der Dateimanager. In diesen Beispielen werden Unix-/Linux-Befehle angewendet.
Host ~$ ls -lh -rw-r--r-- 1 ich ich 1,0G 2007-06-23 11:11 Platte.img
Weitere Informationen zu Image-Dateien erhält man mit qemu-img und dem Parameter info. Als Ergebnis wird der Dateiname, das Image-Format, die virtuelle Größe und die im Dateisystem hinterlegte Größe ausgegeben.
Host ~$ qemu-img info Platte.img image: Platte.img file format: raw virtual size: 1.0G (1073741824 bytes) disk size: 0
Nachfolgend soll ein Image im qcow2-Format angelegt werden. Definiert wird das Image-Format in qemu-img mit dem Parameter -f mit Angabe des gewünschten Formates.
Host ~$ qemu-img create -f qcow2 Platte-qcow2.img 1G Formatting 'Platte-qcow2.img', fmt=qcow2 size=1073741824 encryption=off cluster_size=0
Mit qemu-img und dem Parameter info lässt man sich Informationen zu diesem Image anzeigen.
Host ~$ qemu-img info Platte-qcow2.img image: Platte-qcow2.img file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 140K cluster_size: 65536
Mit qemu-img und dem Parameter check kann man Images im Format qcow2 überprüfen.
Host ~$ qemu-img check Platte-qcow2.img No errors were found on the image.
Im Dateisystem wird eine Dateigröße von nur 256K KByte angezeigt, obwohl ein GByte als virtuelle Größe vorgegeben war.
Host ~$ ls -lh Platte-qcow2.img -rw-r--r-- 1 ich ich 256K 2009-11-14 13:32 Platte-qcow2.img
Wie es scheint ist die Image-Datei im qcow2-Format wesentlich kleiner als die Image-Datei im raw-Format. Ist das wirklich so? Wie beschrieben, unterstützen moderne Dateisysteme eine effiziente Verwaltung von Sparse-Dateien. Dazu ein Experiment auf einem Linux-Rechner. In diesem Beispiel ist das Verzeichnis /tmp als extra Partition mit einer Größe von 1,9 GByte eingebunden. Dies zeigt der Befehl df.
Host ~$ df -h | grep "/tmp" Dateisystem Größe Benut Verf Ben% Eingehängt auf /dev/hda3 1,9G 6,1M 1,9G 1% /tmp
Der Befehl mount ermittelt das Dateisystem.
Host ~$ mount | grep "/tmp" /dev/hda3 on /tmp type xfs (rw)
Das hier zugrunde liegende Dateisystem XFS unterstützt eine effektive Verwaltung von Sparse-Dateien. Für einen Test legt man in diesem Verzeichnis eine große Image-Datei im raw-Format an.
Host ~$ qemu-img create -f raw /tmp/GrosseImageDatei.img 1000G Formating '/tmp/GrosseImageDatei.img', fmt=raw, size=1048576000 kB
Die Datei mit einer Größe von einem TByte wurde ohne Fehler angelegt.
Host ~$ ls -lh /tmp/GrosseImageDatei.img -rw-r--r-- 1 ich ich 1000G 2007-06-23 12:53 /tmp/GrosseImageDatei.img
Auch qemu-img info zeigt diese Größe an.
Host ~$ qemu-img info /tmp/GrosseImageDatei.img image: /tmp/GrosseImageDatei.img file format: raw virtual size: 1.0T (1073741824000 bytes) disk size: 0
Obwohl eine Datei mit der Größe von einem TByte in einer Partition mit nur 1,9 GByte angelegt wurde, hat sich der Füllstand dieser Partition kaum verändert.
Host ~$ df -h | grep "/tmp" Dateisystem Größe Benut Verf Ben% Eingehängt auf /dev/hda3 1,9G 6,2M 1,9G 1% /tmp
Diese Datei wird in ihrer Größe anwachsen, wenn sie mit Inhalt gefüllt wird. Ein Gast-System, das dieses Image verwendet, hat keine Informationen über die Größe der eingebundenen Partition des Host-Systems in dem dieses Image gespeichert ist. Wird das Image zu groß wie diese Partition, gibt es ohne Vorwarnung Schreibfehler im Gast-System.
Daneben taucht noch ein weiteres Problem auf. Kopiert man dieses Image auf ein Dateisystem, das keine effektive Verwaltung von Sparse-Dateien unterstützt, kann der Kopiervorgang mit einer Fehlermeldung abbrechen wenn das Zielmedium das Image nicht in seiner vollen Größe aufnehmen kann. Dies kann verwirrend sein wenn zum Beispiel ein Backup nicht erfolgreich ist, obwohl das Zielmedium eine höhere Kapazität hat. Zum Beispiel schlägt auch der Versuch fehl dieses Image auf einen USB-Stick oder eine Diskette zu kopieren, denn diese sind meist im Dateisystem vfat angelegt.
[bearbeiten] Anlegen von raw-Images und Sparse-Dateien mit dd
Die nachfolgenden Beispiele für das Anlegen von Dateien mit dd dienen dem Verständnis, wie raw-Images und Sparse-Dateien aufgebaut sind. dd ist ein Tool zum Umleiten von Datenströmen. Dieses Standard-Tool ist auf nahezu allen Unix-/Linux-Systemen verfügbar. dd gibt es auch für Microsoft Windows. Diese mit dd angelegten Image-Dateien können genauso wie die mit qemu-img angelegten Dateien verwendet werden. Wird ein Datenstrom bestehend aus lauter Nullen mit einer definierten Länge in eine Datei umgeleitet, entsteht ein raw-Image. Der folgende Befehl erzeugt ein Image im raw-Format mit einer Größe von einem GByte. Es werden dabei aus dem Device /dev/zero Nullen geholt und in die Datei Platte.img geschrieben. Die Blockgröße der Daten ist hier mit 1024 KByte vorgegeben. Der Parameter count gibt dabei an wie viele dieser Blöcke geschrieben werden. Bei tausend Blöcken ergibt das ein GByte.
Host ~$ dd if=/dev/zero of=Platte.img bs=1024k count=1000 1000+0 records in 1000+0 records out 1048576000 bytes (1,0 GB) copied, 59,4961 Sekunden, 17,6 MB/s
Der Befehl qemu-img zeigt, dass es sich wirklich um ein raw-Image handelt.
Host ~$ qemu-img info Platte.img image: Platte.img file format: raw virtual size: 1.0G (1048576000 bytes) disk size: 1.0G
Da dieses Image mit lauter Nullen gefüllt wurde, ist es keine Sparse-Datei. Zur Erzeugung einer Sparse-Datei wird der Parameter seek benötigt, der das Ende der Datei bestimmt. Damit wird nur eine gewisse Anzahl Blöcke am Dateianfang real geschrieben und das Ende der Datei vermerkt. Dazwischen werden keine Blöcke geschrieben. Der tatsächlich von der Datei belegte Bereich im Filesystem ist entsprechend kleiner. Im folgenden Beispiel wird nur ein Block geschrieben (count=1) und das Dateiende auf 1024 Blöcke gesetzt.
Host ~$ dd if=/dev/zero of=Sparse.img bs=1024k count=1 seek=1024 1+0 records in 1+0 records out 1048576 bytes (1,0 MB) copied, 0,003086 Sekunden, 340 MB/s
Der Befehl qemu-img zeigt die virtuelle und die reale Größe dieser Datei an.
Host ~$ qemu-img info Sparse.img image: Sparse.img file format: raw virtual size: 1.0G (1074790400 bytes) disk size: 1.0M
[bearbeiten] Effektives Kopieren von Sparse-Dateien
Unter Unix/Linux unterstützt der Befehl cp ein effektives Kopieren von Sparse-Dateien. Standardmäßig werden Sparse-Dateien von dem Befehl cp erkannt und die Ziel-Dateien werden ebenfalls als Sparse-Dateien angelegt. Dieses Verhalten wird mit der Option -sparse=auto ausgewählt. Man gibt -sparse=always ein, um als Ziel-Datei eine Sparse-Datei zu erzeugen wenn die Quell-Datei eine ausreichend lange Sequenz aus Null-Bytes enthält. Man verwendet -sparse=never, um die Erzeugung einer Sparse-Datei zu verhindern. Um diese Optionen zu testen legt man mit dd eine Sparse-Datei an.
Host ~$ dd if=/dev/zero of=Platte.img bs=1024k count=1 seek=1024
Mit qemu-img info lässt man sich Informationen zu diesem Image anzeigen.
Host ~$ qemu-img info Platte.img image: Platte.img file format: raw virtual size: 1.0G (1074790400 bytes) disk size: 1.0M
Die reale Dateigröße ist hier ein MByte. Das Fassungsvermögen ist dagegen ein GByte. Diese Datei wird mit cp und der Option --sparse=never kopiert.
Host ~$ cp --sparse=never Platte.img Platte-never.img
Die Kopie wird mit qemu-img info untersucht.
Host ~$ qemu-img info Platte-never.img image: Platte-never.img file format: raw virtual size: 1.0G (1074790400 bytes) disk size: 1.0G
Wie zu erwarten ist die reale Größe jetzt ein GByte. In dem nächsten Beispiel wird die originale Sparse-Datei mit der Option --sparse=always kopiert.
Host ~$ cp --sparse=always Platte.img Platte-always.img
Die reale Größe der Datei wurde verringert da das erste MByte nur aus Nullen bestand. Diese Nullen wurden zu Löchern umgewandelt.
Host ~$ qemu-img info Platte-always.img image: Platte-always.img file format: raw virtual size: 1.0G (1074790400 bytes) disk size: 0
Bei der Datei Platte-never.img wurden beim Kopiervorgang die Löcher in Nullen umgewandelt, wodurch die Datei die reale Größe von einem GByte erlangte. Mit der Option –sparse=always kann die Kopie dieser Datei wieder als Sparse-Datei angelegt werden.
Host ~$ cp --sparse=always Platte-never.img Platte-never-always.img Host ~$ qemu-img info Platte-never-always.img image: Platte-never-always.img file format: raw virtual size: 1.0G (1074790400 bytes) disk size: 0
[bearbeiten] Overlay-Images anlegen
QEMU und KVM unterstützen Overlay-Images. Diese basieren auf einer bereits angelegten Image-Datei. Ein Overlay-Image speichert die Änderungen zur ursprünglichen Image-Datei. Das Basis-Image wird dabei nicht verändert, es sei denn im QEMU-Monitor wird der Befehl commit angewendet. Enthält das Basis-Image eine komplette Installation eines Betriebssystems, kann dieses als Template für weitere virtuelle Maschinen dienen. Diese speichern ihre Änderungen jeweils in die entsprechenden Overlay-Images. Beim Anlegen der Overlay-Datei muss keine Größe definiert werden. Der Pfad und Name des Basis-Images wird mit der Option -b angegeben.
Host ~$ qemu-img create -b Platte.img -f qcow2 Platte.ovl
Der Befehl qemu-img info zeigt bei einem Overlay-Image die virtuelle Größe und den Pfad mit Namen des Basis-Images an.
Host ~$ qemu-img info Platte.ovl image: Platte.ovl file format: qcow2 virtual size: 650M (681574400 bytes) disk size: 4.0K cluster_size: 512 backing file: Platte.img (actual path: Platte.img)
Das Overlay-Image wird wie ein normales Image eingebunden.
Host ~$ qemu Platte.ovl
Die im Overlay-Image gespeicherten Änderungen können auch mit qemu-img in das Basis-Image geschrieben werden. Das Overlay-Image und das Basis-Image dürfen dabei nicht von einer virtuellen Maschine in Gebrauch sein.
Host ~$ qemu-img commit -f qcow2 Platte.ovl Image committed.
Overlay-Dateien ermöglichen es, dass von einem Basis-Image gleichzeitig mehrere virtuelle Maschinen booten können.
Host ~$ qemu-img create -b Platte.img -f qcow2 Platte1.ovl Host ~$ qemu-img create -b Platte.img -f qcow2 Platte2.ovl Host ~$ qemu Platte1.ovl Host ~$ qemu Platte2.ovl
Nachfolgend ein Skript, dass beim Start eine Overlay-Datei von einem Basis-Image (Variable BASE_IMG) anlegt. Der Name des Overlay-Images wird dabei aus dem Namen des Basis-Images und einem Zeitstempel gebildet. Optional kann beim Aufruf des Skripts als Parameter ein Wort (ohne Leer- und Sonderzeichen) angegeben werden. Dieses Wort wird vom Skript in den Namen der Overlay-Datei integriert.
#!/bin/sh BASE_IMG="Platte.img" DATE_TIME=`date '+%Y-%m-%d-%H%M'` OVL_NAME="$BASE_IMG-$1-$DATE_TIME.ovl" qemu-img create -b "$BASE_IMG" -f qcow2 "$OVL_NAME" qemu -hda "$OVL_NAME"
Diese Zeilen werden als Skript-Datei mit dem Namen qemuovl.sh in das Verzeichnis, welches das Basis-Image enthält, gespeichert. Anschließend verleiht man der Skript-Datei Ausführungsrechte.
Host ~$ chmod +x qemuovl.sh
Beim Aufruf dieses Skripts kann ein Parameter zur Bezeichnung dieses Overlay-Images angegeben werden, zum Beispiel:
Host ~$ ./qemuovl.sh testSP2
[bearbeiten] CDs, DVDs und Disketten als Image importieren
Es its möglich mit jedem modernen CD-/DVD-Brenn-Programm Image-Dateien von CDs und DVDs erzeugen. Das Importieren eines Installationsmediums als Image wird aus rechtlicher Sicht als Anfertigen einer Kopie einer Software gewertet. Zu beachten sind daher die jeweiligen Lizenz-Bestimmungen.
Unter Unix/Linux ist es leicht Image-Dateien von CDs, DVDs, Disketten und Partitionen auf der Kommandozeile zu erzeugen. Dazu dient der Unix-Befehl dd. Da die Namen für die Disketten-, CD- und DVD-Devices bei jedem System abweichen können, sind zuerst diese Namen zu ermitteln. Ein Blick in die Datei /etc/fstab beziehungsweise /etc/vfstab (Solaris) gibt Auskunft über die vom System genutzten Namen der Devices.
Host ~$ cat /etc/fstab /dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0 /dev/fd0 /media/floppy0 auto rw,user,noauto 0 0
In diesem Beispiel wird das Disketten-Laufwerk über das Device /dev/fd0 und das CD-Laufwerk über das Device /dev/hdc angesprochen. Beim Importieren dürfen die entsprechenden Devices nicht vom System eingebunden sein. Der folgende Befehl importiert eine Diskette:
Host ~$ dd if=/dev/fd0 of=disketten-image.img
Dieser Befehl importiert eine eingelegte CD.
Host ~$ dd if=/dev/hdc of=cd-image.iso
Bei einigen Unix-Versionen, wie FreeBSD, muss noch die Block Size angegeben werden.
Host ~$ dd if=/dev/acd0 of=file.iso bs=2048
Auch unter Mac OS X gibt es den Befehl dd. Eine eingelegte CD/DVD wird vom System automatisch nach /Volumes/<name> eingebunden. Der Name der CD wird dabei im Finder angezeigt. In diesem Beispiel ist das W2P_DE. Zum Einlesen der CD ist zunächst das entsprechende Device ausfindig zu machen. Unter Mac OS X sind die Device-Dateien unter /dev eingeblendet. Interessant sind die Devices /dev/disk*, da diese für Festplatten und CD-Laufwerke benutzt werden. Ist keine CD eingelegt sind beispielsweise folgende Einträge zu finden:
Host ~$ ls /dev/disk* /dev/disk0 /dev/disk0s1 /dev/disk0s2
Dabei ist disk0 die erste Festplatte. Diese enthält hier zwei Partitionen, disk0s1 und disk0s2. Wird eine CD eingelegt, werden unter /dev automatisch neue Devices eingefügt.
Host ~$ ls /dev/disk* /dev/disk0 /dev/disk0s1 /dev/disk0s2 /dev/disk1 /dev/disk1s0
Das CD-Laufwerk wird hier mit /dev/disk1s0 angesprochen. Im eingebundenen Zustand verweigert das System dem Programm dd den Zugriff auf das Laufwerk. Darum wird zuerst das Laufwerk wieder ausgehangen.
Host ~$ sudo umount /Volumes/W2P_DE
Danach wird mit dd der Inhalt der CD ausgelesen und in das Image geschrieben.
Host ~$ dd if=/dev/disk1s0 of=/PDB/daten/cd-image.iso
Zum Abschluss sollte man die CD wieder mounten, da sonst der Auswurf der CD über das immer noch auf dem Desktop befindliche Icon beziehungsweise mit dem Finder nicht mehr funktioniert.
Host ~$ sudo mount_cd9660 /dev/disk1s0 /Volumes/W2P_DE
Das Importieren von CDs, DVDs und Disketten unter Microsoft Windows ist nur mit zusätzlicher Software möglich. Der QEMU-Manager für Windows ermöglicht das Importieren von Disketten, CDs und DVDs als Image-Dateien mit einem Wizard. Dieser wird im Qemu-Manager für Windows über ein Icon gestartet. Dabei wird gefragt, ob man eine CD/DVD oder eine Diskette importieren möchte. Im nächsten Fenster wird nach dem Quell-Laufwerk gefragt und es muss ein Dateiname für die Image-Datei angegeben werden.
Das Programm dd gibt es nicht nur unter Unix und Linux, sondern es ist auch für Microsoft Windows verfügbar. dd kann unter Cygwin verwendet werden. Man kann dd aber auch als separates Tool installieren. Es wird von der URL http://www.chrysocome.net/downloads/dd-0.5.zip heruntergeladen, entpackt und direkt aufgerufen. Die nachfolgende Beschreibung bezieht sich auf letztere Variante. Dazu wird zunächst die interne Bezeichnung des CD-Laufwerks ermittelt.
Host C:\tools\bin> dd.exe --list
\\.\Volume{c7ef4360-d6e9-11d8-ab2a-005056c00008}\
link to \\?\Device\CdRom0
CD-ROM
Mounted on w:\
Die CD liegt hier im Laufwerk W: und die interne Bezeichnung ist \\?\Device\CdRom0. Dieses Device kann in eine Datei ausgelesen werden.
Host C:\> dd.exe if=\\?\Device\CdRom0 of=c:\cd-image.iso
[bearbeiten] Anlegen eines CD-Image aus einem Verzeichnis
Unter Linux kann von einem Verzeichnis mit Inhalt ein CD-Image generiert werden. Das dazu notwendige Tool genisoimage (ehemals mkisofs) kann mit der cdrkit-Suite (http://www.cdrkit.org) oder auch separat installiert werden. Unter Debian oder Ubuntu erfolgt die Installation mit einer Befehlszeile.
Host ~$ sudo apt-get install genisoimage
Das Anlegen des CD-Image erfolgt mit folgendem Befehl.
Host ~$ genisoimage -R -J -o CD-image.iso Verzeichnis
Dieses CD-Image kann wie gewohnt verwendet werden.
Host ~$ qemu -hda Platte.img -cdrom CD-image.iso
[bearbeiten] Links
- Werkzeuge fürs Image LINUX-MAGAZIN 2009/08
- https://sourceforge.net/projects/libewf/ Libewf is a library for support of the Expert Witness Compression Format (EWF)
- https://sourceforge.net/projects/dcfldd/ enhanced version of dd for forensics and security