====== 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