====== openQRM - KVM ======
Hier wird der Umgang mit //openQRM 4.7// beschrieben.
===== veraltete VMs killen =====
> kill -9 $(awk -F'"' '{print $2}' /var/lib/kvm/openqrm/*/vnc > /tmp/vncs;ps wwwaux|fgrep '127.0.0.1:'|fgrep -vf /tmp/vncs|awk '{print $2}';rm -f /tmp/vncs)
===== Windows installieren =====
Als erstes legt man eine normale VM im VM-Manager an (hier beispielhaft mit dem Namen "__''Windows''__"),
dadurch wird das entsprechende Verzeichnis sowie die benötigten Dateien angelegt.
Jetzt stoppen wir die neue VM sofort wieder und legen das Windows-Installations-Image
("__''Windows_x86.iso''__") uns KVM-Verzeichnis unserer neuen VM:
> cp Windows_x86.iso /var/lib/kvm/openqrm/Windows/
Nun werden die entsprechenden Dateien nach unseren Vorstellungen bearbeitet;
hier wird das Startlaufwerk angegeben, meistens ist das "c";
allerdings müssen wir ja erstmal Windows von einer virtuellen CD installieren,
deshalb müssen wir den Laufwerksbuchstaben unseres virtuellen CDROM-Laufwerkes angeben:
> vi /var/lib/kvm/openqrm/Windows/boot
#KVM_VM_BOOT="-boot c"
KVM_VM_BOOT="-boot d"
hier muss der korrekte Pfad zum CDROM-ISO-Image eingetragen werden:
> vi /var/lib/kvm/openqrm/Windows/cdrom
KVM_VM_CDROM="-cdrom /var/lib/kvm/openqrm/Windows/Windows_x86.iso"
meistens reichen 2GB RAM, man kann aber auch mehr eingeben, wenn der physikalische Rechner genug RAM hat:
> vi /var/lib/kvm/openqrm/Windows/ram
KVM_VM_RAM="2048"
==== allgemeines ====
Windows startet auf keinem System, auf dem ein BIOS ohne ACPI-Unterstützung läuft,
deshalb müssen wir auch den "''-no-acpi''"-Parameter entfernen.
Seit //Ubuntu 9.10 (karmic)// scheint bei //KVM// der VGA-Typ "std" (''-vga std'') defekt zu sein.
Deshalb sollte man diesen komplett aus der übergebenen Parameterzeile entfernen,
dann greift der Default-Type "cirrus", der auch von allen Windows-Versionen seit Win95 unterstützt wird.
> vi /var/lib/kvm/openqrm/Windows/Windows.kvm
...
#KVM_VM_OPT="-no-acpi -serial none -parallel none -usb -usbdevice tablet -k de -vga std -localtime "
KVM_VM_OPT="-serial none -parallel none -usb -usbdevice tablet -k de -localtime "
...
===== Windows starten =====
Zum starten dieser Windows-Installation unter openQRM muss wie folgt vorgegangen werden:
- **//openQRM 4.7//**
- __Plugins__
- __Virtualization__
- __VM Manager__
- __KVM Host__
- __''Windows''__
- __''[Start]''__
===== Skripte =====
==== KVM-Windows-Start ====
Will man die KVM-Windows-VM ohne Oberfläche von Hand starten,
dann könnte man dieses Skript verwenden.
Allerdings kann es sein, das der eine oder der andere, dieses Skript evtl. anpassen müssen.
#!/bin/bash
VMNAME="Windows"
VNCPORT="2" # VNC-Port
MACADRESSE="00:0C:29:67:82:C8" # MAC-Adresse der Netzwerkkarte
BOOT="c" # Startlaufwerk
ISOIMAGE="Windows_x86.iso" # Name des CD- bzw. DVD-Image
RAM="2048" # Größe des Arbeitsspeichers in MB
SMP="1" # Anzahl der zu verwendenden Prozessorkerne
ACPI="" # "-no-acpi" oder für Windows leer lassen
screen -dmS ${VMNAME} /usr/bin/kvm -hda /var/lib/kvm/openqrm/${VMNAME}/disk01.img -hdd /var/lib/kvm/openqrm/${VMNAME}/disk04.img -cdrom /var/lib/kvm/images/${ISOIMAGE} -m ${RAM} -smp ${SMP} ${ACPI} -serial none -parallel none -usb -usbdevice tablet -k de -boot ${BOOT} -net nic,vlan=1,macaddr=${MACADRESSE},model=e1000 -net tap,vlan=1,script=/usr/share/openqrm/plugins/kvm/bin/openqrm-kvm-ifup-net1,downscript=/usr/share/openqrm/plugins/kvm/bin/openqrm-kvm-ifdown-net1 -vnc 127.0.0.1:${VNCPORT}
=== /usr/share/openqrm/plugins/kvm/bin/openqrm-kvm-ifup-net1 ===
#!/bin/sh
#
# This file is part of openQRM.
#
# openQRM is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2
# as published by the Free Software Foundation.
#
# openQRM is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with openQRM. If not, see .
#
# Copyright 2009, Matthias Rechenburg
#
/sbin/ifconfig $1 0.0.0.0 promisc up
/sbin/ifconfig $1 mtu 1500
/usr/sbin/brctl addif br0 $1
sleep 2
=== /usr/share/openqrm/plugins/kvm/bin/openqrm-kvm-ifdown-net1 ===
Dieses openQRM-Skript ist leer und tut praktisch garnichts.
==== /root/bin/kvm_lokal_frei.sh ====
#!/bin/bash
# 1 - physikalische Host's
# 2 - KVM-Host's
# 3 - VM's
VIRTION="2"
(if [ -z ${1} ] ; then
echo "Bitte warten ..."
. /usr/share/openqrm/etc/openqrm-server.conf
MYSQL="mysql -N -u${OPENQRM_DATABASE_USER} -p${OPENQRM_DATABASE_PASSWORD} openqrm"
ALLEKVMS="$(for i in $(echo "SELECT appliance_name FROM appliance_info WHERE appliance_virtualization='${VIRTION}';" | ${MYSQL})
do
HDDGES="$(ssh ${i} 'df -kP /var/lib/kvm/' | awk '{print $2}' | egrep -v '[a-zA-Z]' | awk '{printf ("%6.2f\n", $1 / 1024^2)}')"
BENUTZT="$(ssh ${i} 'ls -lk /var/lib/kvm/openqrm/*/' | awk '{z=$5;s+=z}END{print s}')"
HDDFREI="$(ssh ${i} 'df -kP /var/lib/kvm/' | awk -v weg=${BENUTZT} '{print $2,weg}' | egrep -v '[a-zA-Z]' | awk '{printf ("%6.2f\n", ($1 - $2) / 1024^2)}')"
ANZAVMS="$(ssh ${i} 'ls /var/lib/kvm/openqrm/ | wc -l' | awk '{printf"%2s\n",$1}')"
RAMGES1="$(ssh ${i} 'free' | awk '/^Mem:/ {print $2/1024}')"
RAMGES2="$(echo "${RAMGES1}" | awk '{printf ("%6.2f\n",$1/1024)}')"
RAMKVM1="$(ssh ${i} 'cat /var/lib/kvm/openqrm/*/ram' | awk -F'"' -v ges="${RAMGES1}" '{z=$2;s+=z}END{printf("%.2f %.2f \n",s/1024,(ges-s)/1024)}')"
RAMKVMS="$(echo "${RAMKVM1}" | awk '{printf ("%7s\n",$1)}')"
RAMFREI="$(echo "${RAMKVM1}" | awk '{printf ("%7s\n",$2)}')"
KVMHOST="$(echo "${i} (${RAMGES2} GB RAM / ${HDDGES} GB HDD) -" | awk '{printf ("%42s\n",$0)}')"
echo -e "${KVMHOST} ${HDDFREI} GB HDD frei - ${ANZAVMS} VMs brauchen ${RAMKVMS} GB RAM - ${RAMFREI} GB RAM frei"
done)"
echo
echo "${ALLEKVMS}" | sort -n
echo "
pro Standard-VM werden ca. 3,2 GB Platzbedarf berechnet;
pro VM mit lokal genutztem 10GB-Image werden ca. 11,2 GB Platzbedarf berechnet;
${0} [KVM-Host]
"
else
BENUTZT="$(ssh ${1} 'ls -lk /var/lib/kvm/openqrm/*/' | awk '{z=$5;s+=z}END{print s}')"
FREI="$(ssh ${1} 'df -kP /var/lib/kvm/' | awk -v weg=${BENUTZT} '{print $2,weg}' | egrep -v '[a-zA-Z]' | awk '{print ($1 - $2) / 1024^2}')"
VMS="$(ssh ${1} 'ls /var/lib/kvm/openqrm/ | wc -l')"
echo "${FREI} GB sind auf der ${1} noch frei und \"${VMS}\" VMs sind installiert."
fi) 2>/dev/null
exit 0
eine Beispielausgabe:
kvm01 ( 70.93 GB RAM / 102.12 GB HDD) - 25.49 GB HDD frei - 18 VMs brauchen 36.00 GB RAM - 34.93 GB RAM frei
kvm02 ( 70.93 GB RAM / 412.05 GB HDD) - 295.31 GB HDD frei - 21 VMs brauchen 70.00 GB RAM - 0.93 GB RAM frei
kvm03 ( 15.69 GB RAM / 393.72 GB HDD) - 229.47 GB HDD frei - 4 VMs brauchen 16.00 GB RAM - -0.31 GB RAM frei
==== no boot device found ====
Wenn man sich die KVM-VM-Konsole per VNC ansieht
und die Meldung "**''no boot device found''**" zu sehen ist,
dann fehlen diese drei Links:
# ln -s /usr/share/kvm/pxe-e1000.bin /usr/share/qemu/
# ln -s /usr/share/kvm/pxe-rtl8139.bin /usr/share/qemu/
# ln -s /usr/share/kvm/pxe-virtio.bin /usr/share/qemu/
Ein weiteres Merkmal ist, dass für die Cloud kein LVM-Snapshot
angelegt wird.
==== KVM-VM stirbt sofort nach dem Start ====
Wenn die VM nicht starten will, dann
# ssh root@kvm01
Die VM wird durch das Script "''/var/lib/kvm/openqrm/vm01/vm01.kvm''" gestartet,
hier werden wir die letzte Zeile:
# vi /var/lib/kvm/openqrm/vm01/vm01.kvm
...
$RUNSCREEN -dmS $KVM_VM_MAC_1 $KVM $KVM_VM_DISK $KVM_VM_CDROM -m $KVM_VM_RAM -smp $KVM_VM_CPUS $KVM_VM_OPT $KVM_VM_BOOT $KVM_VM_NET -vnc $KVM_VM_VNC
noch mal mit einem ECHO ausgeben:
...
echo "$RUNSCREEN -dmS $KVM_VM_MAC_1 $KVM $KVM_VM_DISK $KVM_VM_CDROM -m $KVM_VM_RAM -smp $KVM_VM_CPUS $KVM_VM_OPT $KVM_VM_BOOT $KVM_VM_NET -vnc $KVM_VM_VNC"
$RUNSCREEN -dmS $KVM_VM_MAC_1 $KVM $KVM_VM_DISK $KVM_VM_CDROM -m $KVM_VM_RAM -smp $KVM_VM_CPUS $KVM_VM_OPT $KVM_VM_BOOT $KVM_VM_NET -vnc $KVM_VM_VNC
dann sieht das so aus:
# /var/lib/kvm/openqrm/vm01/vm01.kvm
/usr/bin/screen -dmS 00:7F:9F:B8:63:50 /usr/bin/kvm -hda /var/lib/kvm/openqrm/vm01/disk01.img -hdd /var/lib/kvm/openqrm/vm01/disk04.img -m 2048 -smp 2 -no-acpi -serial none -parallel none -usb -usbdevice tablet -k de -boot nc -net nic,vlan=1,macaddr=00:7F:9F:B8:63:50,model=virtio -net tap,vlan=1,script=/usr/share/openqrm/plugins/kvm/bin/openqrm-kvm-ifup-net1,downscript=/usr/share/openqrm/plugins/kvm/bin/openqrm-kvm-ifdown-net1 -vnc 127.0.0.1:1
jetzt können wir das eigentliche Kommando auf der Kommandozeile starten, um die Fehlermeldung zu sehen:
# /usr/bin/kvm -hda /var/lib/kvm/openqrm/vm01/disk01.img -hdd /var/lib/kvm/openqrm/vm01/disk04.img -m 2048 -smp 2 -no-acpi -serial none -parallel none -usb -usbdevice tablet -k de -boot nc -net nic,vlan=1,macaddr=00:7F:9F:B8:63:50,model=virtio -net tap,vlan=1,script=/usr/share/openqrm/plugins/kvm/bin/openqrm-kvm-ifup-net1,downscript=/usr/share/openqrm/plugins/kvm/bin/openqrm-kvm-ifdown-net1 -vnc 127.0.0.1:1
qemu: could not load PC BIOS 'bios.bin'
Wie man sieht, wurde hier eine sehr wichtige Datei (**bios.bin**) nicht gefunden!
Dieses Problem tritt bei openQRM hin und wieder auf (meistens nach einem Update).
Es kann durch das starten des Script's **''kvmbios.sh''** schnell wieder gerichtet werden.
=== /root/bin/kvmbios.sh ===
#!/bin/bash
ls -l /usr/share/qemu/bios.bin /usr/share/qemu/vgabios.bin /usr/share/qemu/vgabios-cirrus.bin
rm -vf /usr/share/qemu/bios.bin
cd /usr/share/qemu/ && ln -vs ../seabios/bios.bin bios.bin
rm -vf /usr/share/qemu/vgabios.bin
cd /usr/share/qemu/ && ln -vs ../vgabios/vgabios.bin vgabios.bin
rm -vf /usr/share/qemu/vgabios-cirrus.bin
cd /usr/share/qemu/ && ln -vs ../vgabios/vgabios-cirrus.bin vgabios-cirrus.bin
aptitude reinstall qemu-common
ls -l /usr/share/qemu/bios.bin /usr/share/qemu/vgabios.bin /usr/share/qemu/vgabios-cirrus.bin