OVF/OFA zu Fuß unter QEMU/KVM
Open Virtualization Format (OVF) ist eine Spezifikation, die es ermöglicht, Virtuelle Maschinen leicht in die eigene Virtualisierungslösung wie QEMU, Xen, VirtualBox oder VMWare zu importieren bzw. zwischen diesen auszutauschen. In der einfachsten Form besteht so eine VM aus einem Verzeichnis mit 3 Dateien:
- Einer Image-Datei, die das Festplattenabbild enthält und i.d.R. das VMDK-Format benutzt.
- Ein XML-Datei, die CPU-Anzahl, RAM-Größe und ähnliches festlegt.
- Ein Manifest-Datei, die die anderen Dateien referenziert und deren SHA1-Prüfsummen enthält.
Neben der Unterstützung von Zertifikate für die digitale Signierung kann ein ein OVF-Paket auch mehrere VMs enthalten, so daß komplette Umgebungen bestehend aus mehreren Maschinen ausgetauscht werden können.
Da die Handhabung von mehreren Datein für den Austausch eher umständlich ist, können dieses Dateien in einer einzelnen OVA-Datei zusammengefasst werden. (Eine OVA-Datei ist lediglich ein TAR-Archiv der OVF-Dateien)
OVA-Archive können derzeit nicht direkt in QEMU/KVM importiert werden, es existietr aber ein auf libvirt-aufbauendes Projekt, das dieses ermöglicht. Alternativ kann man das auch per Hand machen, da QEMU/KVM eigentlich auch alle Geräte unterstützt, die auch von VMWare benutzt werden. Einziges Problem ist derzeit des LSILogic-SCSI-Controller, der mit QEMU-1.1 noch ein eigenes BIOS benötigt, um davon booten zu können:
- OVA-Archiv mit
tar xf "$VM.ofa"
entpacken - Aus der Datei
$VM.ovf
folgende Informationen extrahieren:- Number of Virtual CPUs
- Memory Size
- Daraus eine libvirt-XML-Datei erstellen:
<domain type="kmv"> <name>NAME</name> <memory unit="KiB">SIZE</memory> <vcpu>CPUS</vcpu> <os> <type arch="x86_64" machine="pc">hvm</type> </os> <features> <acpi/><apic/><pae/> </features> <devices> <disk type="file" device="disk"> <driver name="qemu" type="vmdk"> <source file="FILE.vmdk"/> <target dev="sda" bus="scsi"/> </disk> <controller type="scsi" index="0″ model="lsilogic"/> <interface type="bridge"> <source bridge="eth0″/> <model type="pcnet"/> </interface> <input type="tabet" bus="usb"/> <video> <model type="vmware" vram="9216″/> </video> </devices> <qemu:commandline xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0"> <qemu:arg value="-option-rom"/> <qemu:arg value="/var/lib/libvirt/images/8xx_64.rom"/> </qemu:commandline> </domain>
- Von der www.lsi.com-Seite die Datei
lsi_bios.zip
herunterladen und daraus die Datei8xx_64.rom
extrahieren und verfügbar machen:unzip -d /var/lib/libvirt/images/ lsi_bios.zip 8xx_64.rom
virsh define "$VM.xml"
virsh start "$VM"
Bekannte Probleme:
- Nicht alle VMDK-Formate können von qemu-1.1 geschrieben werden:
VMDK: can’t write to allocated cluster for streamOptimized.
Als Work-Around muß man die Datei in ein anderes Format (qcow2, qed, raw) mit
qemu-img convert -f vmdk -O qcow2 "$DISK.vmdk" "$DISK.qcow2"
konvertieren oder einfach eine qcow2-Datei über die vmdk-Datei legenqemu-img create -f qcow2 -b "$DISK.vmdk" "$DISK.qcow2"
. Entspechend muß in der libvirt-XML-Datei dann auchvmdk
durchqcow2
ersetzt werden. - Das Booten von SCSI erfodert mit qemu-1.x zwingend das LSI-BIOS.
- Wenn kein DHCP-Server konfiguriert ist, kann man das Interface
virbr0
statteth0
verwenden, was einem lokalen Netz mit NAT und DHCP entspricht. Das muß ggf. noch mitvirsh net-start default
gestartet werden.