KVM - Kernel-based Virtual Machine
Autor: Carlos Jacon | Publicado: 2013-06-05T09:54:00-03:00


Servidor de Virtualização: KVM

Neste artigo, irei mostrar como instalar, configurar e otimizar um solução de servidor de virtualização KVM. Utilizarei como exemplo uma implementação real... estou aberto a críticas e sugestões.


Características

Servidor HP Proliant:

Processador Dual-Core AMD Opteron Processor 2220;
Memória de 10GB DDRII 667;
Fonte simples;
Placa de rede onboard com duas saídas Gigabit;
HD SAS 2.5", 2 x 30 GB (RAID 1) e 4 x 146 GB (RAID 5 - 404 GB);
Sistema Operacional Debian 7 (Wheezy).
Plataforma de virtualização KVM.

Implementação

Instalação
apt-get install qemu-kvm


Adicionar usuários utilizadores do KVM ao grupo "kvm"
adduser ravel kvm


Criar o disco virtual
qemu-img create disco.img -f qcow2 100G 
#"qcow2" refere-se ao tipo de disco (recomendado); 
#"100G" é o tamanho do disco dinamicamente alocado


Configurar bridge em placa de rede (/etc/network/interfaces)
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
#auto eth1
iface eth1 inet manual
#allow-hotplug eth1

auto br0
iface br0 inet static
        #tap0: Zabbix
        #tap1: Yocto
        #tap2: Batman
        #tap3: Zabbix-TI
        #tap4: Disponível       
        pre-up ip tuntap add dev tap0 mode tap user ravel
        pre-up ip tuntap add dev tap1 mode tap user yocto
        pre-up ip tuntap add dev tap2 mode tap user batman
        pre-up ip tuntap add dev tap3 mode tap user ti
        pre-up ip tuntap add dev tap4 mode tap user ravel
        pre-up ip link set tap0 up
        pre-up ip link set tap1 up
        pre-up ip link set tap2 up
        pre-up ip link set tap3 up
        pre-up ip link set tap4 up
        bridge_ports all tap0
        bridge_ports all tap1
        bridge_ports all tap2
        bridge_ports all tap3
        bridge_ports all tap4
        post-down ip link set tap0 down
        post-down ip link set tap1 down
        post-down ip link set tap2 down
        post-down ip link set tap3 down
        post-down ip link set tap4 down
        post-down ip tuntap del dev tap0 mode tap
        post-down ip tuntap del dev tap1 mode tap
        post-down ip tuntap del dev tap2 mode tap
        post-down ip tuntap del dev tap3 mode tap
        post-down ip tuntap del dev tap4 mode tap

        address 10.0.0.26
        netmask 255.255.0.0
        gateway 10.0.0.9
        bridge_ports eth1
        bridge_fd 0
        bridge_hello 2
        bridge_maxage 12
        bridge_stp off



Reinicie a rede:
/etc/init.d/networking restart


Mais informações:

http://www.hardware.com.br/guias/debian-desktops/kvm-qemu.html
http://www.linux-kvm.com/content/tip-how-run-headless-guest-machine-using-vnc-kvm
http://blog.bigsmoke.us/2009/12/09/debian-network-bridge-setup-for-kvmqemu
http://wiki.debian.org/QEMU#Networking




Máquinas virtuais

As máquinas virtuais são inicializadas automaticamente através de "/etc/rc.local":
#Inicializar VMs
/home/ravel/vm/zabbix-vm.sh &amp;
/home/yocto/vm/yocto-vm.sh &amp;
/home/batman/vm/batman-vm.sh &amp;
/home/ti/vm/zabbix-vm.sh &amp;


a. Zabbix-PD

Utilização: monitoramento de servidores de redes 
Usuário: ravel 
Diretório: /home/ravel/vm
Disco virtual: /home/ravel/vm/hd/zabbix_pd-hda.img
Rede: tap0
Script de inicialização: /home/ravel/vm/zabbix-vm.sh:
#!/bin/bash
cdrom="/home/ravel/vm/isos/debian-7.0.0-amd64-DVD-1.iso"
hda="file=/home/ravel/vm/hd/zabbix_pd-hda.img,if=virtio,cache=writethrough"
mem="1G -mem-path /hugepages"

#Vídeo
video="-display none" #desativar saída de vídeo VNC
#video="-vnc :2" #habilitar saída de vídeo VNC

kvm -cdrom $cdrom -drive $hda -m $mem $video -smp cores=2,threads=2,sockets=1 -enable-kvm -cpu host -net nic,macaddr=52:54:00:12:01:01 -net tap,ifname=tap0,script=no,downscript=no




b. Zabbix-TI

Utilização: monitoramento de servidores de redes, utilizado pela TI Usuário: ti 
Diretório: /home/ti/vm
Disco virtual: /home/ti/vm/hd/zabbix_ti-hda.img
Rede: tap4
Script de inicialização: /home/ti/vm/zabbix-vm.sh:
#!/bin/bash
cdrom="/home/ti/vm/isos/debian-7.0.0-amd64-DVD-1.iso"
hda="/home/ti/vm/hd/zabbix_ti-hda.img"
mem="1G -mem-path /hugepages"

#Vídeo
#video="-display none" #desativar saída de vídeo VNC
video="-vnc :1" #habilitar saída de vídeo VNC

kvm -cdrom $cdrom -hda $hda -m $mem $video -smp cores=2,threads=2,sockets=1 -enable-kvm -cpu host -net nic,macaddr=52:54:00:12:01:03 -net tap,ifname=tap4,script=no,downscript=no
#-display none




c. Yocto

Utilização: servidor de compilação Usuário: yocto 
Diretório: /home/yocto/vm
Disco virtual: /home/yocto/vm/hd/yocto-hda.img
Rede: tap1
Script de inicialização: /home/yocto/vm/yocto-vm.sh:
#!/bin/bash
cdrom="/home/yocto/vm/isos/kubuntu-13.04-desktop-amd64.iso"
hda="/home/yocto/vm/hd/yocto-hda.img"
mem="4G -mem-path /hugepages"

#Vídeo
video="-display none" #desativar saída de vídeo VNC
#video="-vnc :4" #habilitar saída de vídeo VNC

kvm -cdrom $cdrom -hda $hda -m $mem $video -smp cores=2,threads=2,sockets=1 -enable-kvm -cpu host -net nic,macaddr=52:54:00:12:01:00 -net tap,ifname=tap1,script=no,downscript=no




d. Batman

Utilização: servidor de compilação 
Usuário: batman 
Diretório: /home/batman/vm
Disco virtual: /home/batman/vm/hd/batman.img
Rede: tap2
Script de inicialização: /home/batman/vm/batman-vm.sh:
#!/bin/bash
cdrom="/home/batman/vm/isos/gentoo-install-amd64-minimal-20130516.iso"
hda="/home/batman/vm/hd/batman.img"
mem="2G -mem-path /hugepages"

#Vídeo
#video="-display none" #desativar saída de vídeo VNC
video="-vnc :3" #habilitar saída de vídeo VNC

kvm -cdrom $cdrom -hda $hda -m $mem -boot d -smp cores=2,threads=2,sockets=1 -enable-kvm -cpu host $video -net nic,macaddr=52:54:00:12:01:02 -net tap,ifname=tap2,script=no,downscript=no



** Cada VM deve utilizar um endereço MAC distinto. 


Otimização

Parâmetros:

"-smp cores=2,threads=2,sockets=1 -cpu host -enable-kvm":Acelerador KVM ("-enable-kvm") e configuração do processador virtual ("-smp cores=2,threads=2,sockets=1 -cpu host") - inserido no script de inicialização da VM."-cpu host": disponibiliza todas as instruções do processador físico à VM;
Mais informações:https://wiki.archlinux.org/index.php/QEMU#Virtual_machine_runs_too_slowly



"KSM (Kernel Samepage Merging)":Permite que páginas idênticas de memória sejam empacotadas pelo kernel numa única página compartilhada por um ou mais processos. Esta funcionalidade é potenciada pelo KVM para permitir que múltiplas, similares, máquinas virtuais tenham uma utilização de memória reduzida. Como a memória é compartilhada, a utilização combinada desta pelas máquinas virtuais é reduzida.Habilitar KSM (Kernel Samepage Merging) - "/etc/rc.local" (inserir acima dos scripts de inicialização de VMs):#Habilitar KSM - Kernel Samepage Merging
echo 1 &gt; /sys/kernel/mm/ksm/run


Recomendação de leitura:&nbsp;IBM - KVM Best Practices





Huge Pages:Reduz o consumo de memória e melhora a performance reduzindo a pressão sobre a cache.Habilitar "hugepages"
Criar o diretório "/hugepages" e dar permissão ao grupo "kvm"mkdir /hugepages
chown -R ravel:kvm /hugepages


"/etc/fastab"hugetlbfs       /hugepages  hugetlbfs       defaults        0 0


"/etc/rc.local" (inserir acima dos scripts de inicialização de VMs):#Set HugePages
echo 550 &gt; /proc/sys/vm/nr_hugepages
#"550" corresponde a metade de memória RAM destinada a VM mais 10%


Apontar localização do diretorio hugepages no script de inicialização da VM ("-m QDE_DE_MEMORIA -mem-path /hugepages"). Vide exemplo de script de inicialização de VM).


Mais informações:
http://www.linux-kvm.com/content/get-performance-boost-backing-your-kvm-guest-hugetlbfs&nbsp;
http://pic.dhe.ibm.com/infocenter/lnxinfo/v3r0m0/index.jsp?topic=%2Fliaat%2Fliaattunconfighp.htm