Translate

quarta-feira, 5 de junho de 2013

KVM - Kernel-based Virtual Machine

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:

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 &
/home/yocto/vm/yocto-vm.sh &
/home/batman/vm/batman-vm.sh &
/home/ti/vm/zabbix-vm.sh &
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;


  • "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 > /sys/kernel/mm/ksm/run