qemu-kvm & libvirtHauptseite | Über | Hilfe | FAQ | Spezialseiten | Anmelden

Druckversion | Impressum | Datenschutz

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]])

<<<|###| >>> | English


Inhaltsverzeichnis

[bearbeiten] Images anlegen

Virtuelle Maschinen nutzen meist Image-Dateien als virtuelle Speichermedien. Diese lassen sich 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 und 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 check überprüft man Images im Format qcow2.

Host ~$ qemu-img check Platte-qcow2.img
No errors were found on the image.

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

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? 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ß für 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 ist 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

<<<|###| >>>

Von „http://qemu-buch.de/de/index.php/QEMU-KVM-Buch/_Speichermedien/_Images_anlegen

Diese Seite wurde bisher 11.823 mal abgerufen. Diese Seite wurde zuletzt am 17. März 2010 um 10:58 Uhr geändert. Inhalt ist verfügbar unter der GNU Free Documentation License 1.2.


Finden

Blättern

News

Deutsch
Weitersagen
Bestellen
Tipps für Autoren
Autoren
Impressum


English
Order
Recommendation
The Authors
Contact



Letzte Änderungen
Twitter


Ändern
Seite bearbeiten
Bearbeitungshilfe
Seitenoptionen
Diskussion
Kommentar hinzufügen
Druckversion
Seitendaten
Versionen
Links auf diese Seite
Änderungen an verlinkten Seiten
Meine Seiten
Anmelden
Spezialseiten
Neue Seiten
Dateiliste
Statistik
Kontakt
Mehr …