Arquvo de ‘virtualização’
-
libvirt no Slackware 13.1
Libvirt é um ótimo utilitário para gerenciamento de máquinas virtuais de algumas plataformas de virtualização, como Xen, KVM, VMWare ESX, VirtualBox, OpenVZ, entre outros. Neste post farei um guia rápido para instação dele.
Como estou usando a distribuição Slackware, é interessante compilar o libvirt e gerar um pacote txz, no padrão da distribuição. Como o pessoal da slackbuilds.org já disponibilizou o script SlackBuild para ele, vamos aproveitar. Acesse esse link que mostrará o resultado da busca por libvirt no repositório. Como resultado, aparecerá o link para a página de download da versão mais atual que estiver no repositório. Clique no link.
Quando escrevi este post, a versão que estava lá era a 0.7.6, mas eu abordarei aqui a versão 0.8.1 por causa de novos recursos. Portanto, o único pacote necessário será o libvirt.tar.gz. Baixe-o clicando no link da página. O código fonte da versão 0.8.1 você encontrará neste endereço.
Dentre vários recursos desta versão, uma em especial eu gostaria de colocar em evidência: o suporte ao módulo macvtap. A grosso modo, isto possibilita anexar uma interface virtual tap em uma interface real. Assim é possível que o sistema operacional hóspede se integre à LAN real da máquina hospedeira. Este recurso está disponível a partir da versão 2.6.34 do kernel do Linux. Desta maneira, será necessário atualizar o kernel para esta versão. Como compilar o kernel não está no escopo do artigo, deixo apenas a informação de habilitar o recurso de macvtap na seção Device Drivers->Network device support->MAC-VLAN support e MAC-VLAN based tap device.
Supondo que os pacotes do libvirt foram salvos no diretório ~/libvirt, execute os seguintes passos:
cd ~/libvirt tar xvf libvirt.tar.gz mv libvirt/* .
Edite o arquivo libvirt.SlackBuild para alterar a versão de 0.7.6 para 0.8.1. Salve e vamos compilar:
ARCH=`uname -m` ./libvirt.SlackBuild
Aguarde terminar e após instale o pacote:
installpkg /tmp/libvirt-0.8.1-x86_64-1.tar.gz
Configuração básica
Verifique neste post um exemplo de script de inicialização para o serviço do libvirt. Copie o script para um arquivo chamado rc.libvirtd na pasta /etc/rc.d/. Devo lembrar de acrescentar sua chamada dentro do script rc.local, caso queira que ele suba automaticamente com o sistema, quando iniciado.
Por default, o servidor do libvirt abrirá um socket tls para acesso tcp, e para isto, é necessário gerar um certificado. Com a finalidade apenas de teste, não creio ser necessário isto, já que o acesso normalmente será feito pelo socket unix mesmo. Altere a opção listen_tls=1 para listen_tls=0 no arquivo /etc/libvirt/libvirtd.conf. Não adianta só comentar esta linha, já que o default é habilitado.
-
rc.libvirt
Segue abaixo um script de start e stop para o serviço libvirtd que fiz para Slackware:
#!/bin/bash MODULES="tun vhost_net" PIDFILE="/var/run/libvirtd.pid" TIMEOUT=${TIMEOUT:-40} OPTS=${OPTS:-""} check_running_machines() { i=0 for j in `virsh list | grep running | awk '{print $2;}'` ; do virsh shutdown $j done echo -n "Waiting machines" while [ $(virsh list | grep running | wc -l) -gt "0" ]; do if [ "$i" -ge "$TIMEOUT" ];then break fi echo -n "." i=`expr $i + 1` sleep 1 done echo "" if [ $(virsh list | grep running | wc -l) -gt "0" ];then echo -n "The following machines are still running, forcing shutdown: " for j in `virsh list | grep running | awk '{print $2;}'` ; do virsh destroy $j echo -n "$j " done echo "" sleep 2 fi } check_processor() { egrep 'vmx' /proc/cpuinfo > /dev/null if [ "$?" -eq "0" ];then MODULES="$MODULES kvm_intel kvm" fi check=$? egrep 'svm' /proc/cpuinfo > /dev/null if [ "$?" -eq "0" ];then MODULES="$MODULES kvm_amd kvm" fi check=`expr $check + $?` if [ $check -eq "2" ];then echo "Your systems does not support KVM!" fi } start() { if [ -f $PIDFILE ];then echo "libvirt is already running..." exit 1 fi echo "Starting libvirtd..." check_processor modprobe -a $MODULES libvirtd -d -l $OPTS } stop() { if [ ! -f $PIDFILE ];then echo "libvirt is not running..." exit 2 fi check_running_machines check_processor echo "Stopping libvirtd..." kill -TERM `cat $PIDFILE` modprobe -ra $MODULES } case $1 in start) start ;; stop) stop ;; restart) stop sleep 1 start ;; *) echo "Usage: $0 (start|stop|restart)" ;; esac -
qemu-kvm
Há tempos venho usando a virtualização como meio de testar sistemas e multiplicar o número de máquinas de teste, que sem ela, seria quase impossível. Nesta última semana passei a me preocupar mais com o assunto. Embora eu já venha usando seus milagrosos recursos, nunca havia parado para ver que soluções existem na praça e como esta mágica funciona. Resolvi finalmente ler um livro sobre o tema que um amigo me emprestou há mais de um ano. Não sei o que é pior, não devolver o livro do amigo ou não ler. O livro se chama Virtualização, publicado pela Linux Magazine.
Para quem ainda não leu, o livro fala do conceito de virtualização de uma forma bastante didática e direta apresentando softwares desta área, porém sua ênfase está na solução OpenSource Xen. Ao ler o livro, me lembrei de um recurso que já tinha visto, mas não estudado antes, as instruções Intel-VT e AMD-V, que podem ser referenciadas como vmx e svm respectivamente no Linux. Lembrei também, que há opções disponíveis na tela de configuração do Kernel para habilitar esses recursos, o KVM. Falando rapidamente, o KVM (Kernel-based Virtual Machine) é uma implementação no kernel-space que permite melhor uso do recurso de virtualização do processador usando máquinas virtuais compatíveis com ele.
Mas o KVM não poderia trabalhar sozinho numa solução de virtualização. Pesquisando um pouco mais, vi que o emulador Qemu tem uma versão modificada para trabalhar com o KVM. Como usuário de Slackware que sou, encontrei o script SlackBuild no repostório não-oficial SlackBuilds.org do qemu-kvm. Baixei o pacote do qemu-kvm que estava no mesmo repositório juntamente com seu script e já mandei bala. Alterei o script para dizer qual arquiteturas quero emular. Para isto, basta definir a variável BUILD_ARCH que contém as arquiteturas separadas por um espaço. A lista de arquiteturas suportadas é: i386; x86_64; alpha; arm; armeb; cris; m68k; microblaze; mips; mipsel; ppc; ppc64; ppc64abi32; sh4; sh4eb; sparc; sparc64 e sparc32plus. No meu caso, ficou assim:
BUILD_ARCH="i386 x86_64"
ARCH=`uname -m` ./qemu-kvm.SlackBuild
Depois disto, aguardei o fim da compilação e instalei:
installpkg /tmp/qemu-kvm-0.12.3-x86_64-1_SBo.tgz
Para seu uso, é importante que seu processador suporte a instrução vmx ou svm. Para saber se seu processador suporta, use o seguinte comando:
egrep '(vmx|svm)' /proc/cpuinfo
Se retornar alguma linha, quer dizer que seu processador está preparado. O KVM deve estar compilado com o kernel. Pode ser tanto incorporado no kernel como em módulo. No kernel huge do Slackware, ele já vem compilado como módulo. Para usá-lo, basta carregar o módulo.
Para AMD:
modprobe -a kvm kvm_amd
ou para Intel:
modprobe -a kvm kvm_intel
Agora só é preciso criar a máquina virtual.
O qemu vem com algumas ferramentas, mas aqui falarei apenas de duas: qemu e qemu-img. Antes de tudo, precisamos criar o disco virtual. Para isso, usei o qemu-img:
qemu-img create -f qcow2 ~/teste.img 10G
Traduzindo, mandei ele criar o arquivo de imagem ~/teste.img no formato qcow2 de tamanho 10G. Caso verifique o tamanho do arquivo de imagem e ele esteja muito pequeno, não se assuste. Ele cresce conforme demanda até o limite de 10G. Ainda não descobri como criar o imagem com todo seu espaço já alocado.
Agora basta rodar a máquina na linha de comando:
qemu -hda ~/teste.img -cdrom ~/slackdvd.iso -boot d -m 256 -k pt-br -name Teste -net nic,model=pcnet -net user
Traduzindo, eu pedi para o qemu inicializar a máquina de nome Teste atribuindo o disco ide primério como sendo teste.img, uma unidade de cdrom montada com a imagem slackdvd.iso. Pedi para que busque o boot na unidade d, ou seja, no dvd. Ele terá também 256MB de memória, um teclado com layout pt-br. Para conectividade use uma placa de rede do modelo pcnet e crie uma nat da minha interface de rede real para ela. Assim terei acesso à Internet. Caso não queira ter o terminal preso, acrescente a opção -daemonize.
Essa configuração é básica, apenas para se ter um primeiro contato. Vale observar também, que o comando qemu cria um ambiente 32bit. Para uso de sistemas 64bit, use o comando qemu-system-x86_64 em seu lugar. Para configurações mais completas, confira o manual do comando qemu:
man qemu
Tags
Recentes
Blog
Lista de Links
- Debugging Consultoria Debugging Consultoria
- LPI
- Voip-Info Wiki VoIP