SOBRE O XEN – INTRODUÇÃO
Para começar, vamos explicar o que é o Xen para entender o processo de paravirtualização e fazermos uma comparação com o modelo de virtualização total.
“O Xen é um dos mais populares exemplos de paravirtualização. Na virtualização total, o sistema operacional visitante tenta executar tarefas protegidas e, por estarem no espaço de aplicação do sistema operacional hospedeiro, não podem ser executadas. No entanto, o VMM intervém e executa ou simula a execução dessas, o que reduz o desempenho da virtualização total. Já a paravirtualização apresenta-se como uma alternativa a isso, na medida em que o sistema operacional visitante é modificado para não tentar executar diretamente na CPU as tarefas protegidas, mas entregar essas ao VMM. Este tipo de virtualização tem um ganho de desempenho significativo frente à total.
Uma das maiores vantagens do uso do Xen como VMM na paravirtualização é o fato de que este apresenta um desempenho melhor do que os produtos de virtualização total, quando a máquina física hospedeira não tem instruções de hardware de suporte a virtualização. No entanto, há a necessidade de que o sistema visitante seja portado para o Xen, o que não chega a ser uma desvantagem, já que os sistemas operacionais mais comuns no mercado têm versões para o Xen. Alguns dos sistemas suportados pelo Xen são Linux, FreeBSD e Windows XP.
A tecnologia de virtualização provida pelo Xen difere da tecnologia do VMWare. O Xen segue o conceito da paravirtualização, que fornece um conjunto de abstrações (processador virtual, memória virtual, rede virtual etc.) sobre o qual diferentes sistemas podem ser portados [7]. As abstrações não são necessariamente similares ao hardware da máquina física hospedeira.
Para entender como o Xen implementa a paravirtualização, é importante salientar dois conceitos: o de domínio e o de hypervisor. Os domínios são as máquinas virtuais do Xen. Essas podem ser de dois tipos, privilegiadas (domínio 0) e não-privilegiadas (domínio U). O hypervisor é o responsável por controlar os recursos de comunicação, de memória e de processamento das máquinas virtuais, mas não possui os drivers para manipular os dispositivos diretamente.
Quando a máquina hospedeira é iniciada, uma máquina virtual do domínio 0, privilegiado, é criada. Esse domínio acessa uma interface de controle e executa aplicações de gerenciamento. As máquinas virtuais dos domínios U só podem ser criadas, iniciadas e desligadas através do domínio 0. Na máquina virtual do domínio 0 é executado um Linux com núcleo modificado, que pode acessar os recursos da máquina física, já que possui privilégios especiais, e ainda se comunicar com as outras máquinas virtuais, domínio U.
O sistema operacional do domínio 0 tem que ser modificado para possuir os drivers de dispositivo da máquina física e dois drivers que tratam requisições de acessos à rede e ao disco realizadas pelas máquinas virtuais do domínio U. Em suma, só a máquina virtual do domínio 0 tem acesso direto aos recursos da máquina física, enquanto que as demais máquinas virtuais têm acesso a uma abstração dos recursos, que para serem acessados, as máquina virtuais dos domínios U têm que acessar através do domínio 0.
Para a virtualização da memória, o Xen reserva para cada máquina virtual uma determinada quantidade de memória, que pode ser alterada a qualquer momento sem a necessidade de terminar ou reiniciar a máquina virtual. Cada máquina virtual pode ter uma ou mais interfaces de rede virtuais. A comunicação entre as interfaces é implementada por dois token rings, um para enviar e outro para receber [7].
Atualmente o Xen conta também com um domínio no qual é feita a virtualização total, o que permite que sistemas operacionais não modificados sejam executados sobre o hypervisor Xen. Inicialmente, a escolha pela paravirtualização justificava-se pelo fato de que o ganho em desempenho era muito maior do que com a virtualização total. No entanto, com o advento das arquiteturas AMD-V e Intel VT, arquitetura que dão o suporte de hardware para a virtualização, a virtualização total passou a obter resultados de desempenho melhores que os da paravirtualização. Vale ressaltar que o domínio de virtualização total disponível no Xen a partir da sua versão 3.0, só pode ser usado nas máquinas hospedeiras que possuam suporte de hardware à virtualização.”
Fonte: UFRJ
UTILIZAÇÃO DO XEN
O Xen pode ser empregado em diversas funções, por exemplo:
- Consolidação de servidores
- Virtualização da Infra-estrutura de TI
- Laboratórios de ensino
- Desenvolvimento de software
Como podemos observar, tem um potencial de uso enorme.
Agora vamos ao que interessa. Mãos à obra!
REQUISITOS E CONSIDERAÇÕES
Distro: Debian Etch (4.0)
Sistema de arquivos: EXT3
Processador: AMD Athlon(tm) 64 X2 Dual Core Processor 4000+
Memória RAM: 1GB
Armazenamento: HD SATA 120 GB
Versão Xen: 3.0.3
VMs a serem criadas: 2
Ter no mínimo 384MB de memória RAM (128 + 256), uma vez que o XEN impõe que sobre, no mínimo, 196MB de RAM para uso da máquina real. Isto é, ainda que use 128MB de RAM na máquina virtual, ainda sobrará 256MB de RAM para sua máquina real.
Na instalação do Debian, crie as partições da seguinte forma:
/ 10GB /boot 128MB swap 1GB LVM todo o espaço restante
Após a instalação do sistema operacional, configure os repositórios padrão com as opções “main” “contrib”. Edite o arquivo sources.listconforme exibido abaixo.
# vim /etc/apt/sources.list
deb-src http://ftp.br.debian.org/debian/ etch main
deb http://security.debian.org/ etch/updates main contrib
deb-src http://security.debian.org/ etch/updates main contrib
INSTALAÇÃO E CONFIGURAÇÃO
# aptitude update
Atualize os pacotes com o comando abaixo:
# aptitude upgrade
Instale os pacotes abaixo, que são requeridos para o Xen:
# aptitude install apmd less lvm2 linuxlogo rcconf bridge-utils iproute xen-hypervisor-3.0.3-1-i386 xen-utils linux-image-2.6.18-6-xen-686 xen-linux-system-2.6.18-6-xen-686
Insira o comando abaixo para criar a imagem initrd do novo kernel xen baixado:
# mkinitramfs -o /boot/initrd.img-2.6.18-6-xen-686 2.6.18-6-xen-686
Obs.: Para saber qual o nome correto do kernel xen, utilize o comando:
# ls /lib/modules
Apenas para constatar, verifique no grub se aparece o novo kernel como opção de boot.
# cat /boot/grub/menu.lst
Renomeie/desabilite o diretório /lib/tls com o comando:
# mv /lib/tls /lib/tls.disabled
Altere as configurações de rede, conforme abaixo, a fim de criar uma bridge que será utilizada pelas VMs. Para tanto, edite o arquivo /etc/network/interfaces e remova ou comente toda a configuração do adaptador de rede da máquina real. Mantenha as configurações do loopback e configure a bridge.
# vi /etc/network/interfaces
auto xen
iface lo inet loopback
#### configuração ip estático ####
allow-hotplug xen
iface xen inet static
address 192.168.1.2
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.0.255
gateway 192.168.1.1
bridge_ports eth0
bridge_maxwait 0
Obs: A linha “bridge_ports eth0” associará a bridge à interface eth0. Com isso, a eth0 passará responder, na rede, pelo endereço IP 192.168.1.81.
Em conseqüência, não deverá haver uma configuração individual da eth0.
Tudo feito, reinicie a máquina e dê boot pelo novo kernel, isto é, o kernel xen.
CONFIGURAÇÃO DA LVM PARA DUAS MÁQUINAS VIRTUAIS
Preparar o suporte LVM com o comando abaixo, considerando que tal partição seja a /dev/sda4:
# pvcreate /dev/sda4
A seguir, crie um grupo lógico, denominado vm, com o comando:
# vgcreate vg /dev/sda4
Agora crie um volume lógico para cada partição necessária para as máquinas virtuais. Considere o exemplo a seguir:
- 01 partição raiz, denominada vm-virt01.raiz, com 20 GB;
- 01 partição de swap, denominada vm-virt01.swap, com 512 MB;
- 01 partição raiz, denominada vm-virt02.raiz, com 20 GB;
- 01 partição de swap, denominada vm-virt02.swap, com 512 MB.
Para criar os citados volumes, utilize os seguintes comandos, respectivamente:
# lvcreate -L20G -n vm-virt01.raiz vg
# lvcreate -L512M -n vm-virt01.swap vg
# lvcreate -L20G -n vm-virt02.raiz vg
# lvcreate -L512M -n vm-virt02.swap vg
Utilize o comando “lvs” para verificar os volumes criados e “pvs” para checar o espaço ocupado. Ao criar os volumes, passarão a existir os seguintes dispositivos:
- /dev/vg/vm-virt01.raiz
- /dev/vg/vm-virt01.swap
- /dev/vg/vm-virt02.raiz
- /dev/vg/vm-virt02.swap
A seguir, formate os dispositivos lógicos:
# mkfs.ext3 /dev/vg/vm-virt01.raiz
# mkswap /dev/vg/vm-virt01.swap
# mkfs.ext3 /dev/vg/vm-virt01.raiz
# mkswap /dev/vg/vm-virt01.swap
CRIAÇÃO DA MÁQUINA MODELO
# mkdir /modelo
Instale o debootstrap:
# aptitude install debootstrap
O debootstrap precisa de uma fonte de dados, que pode ser o CD-ROM do Debian ou uma URL da Internet. Para utilizar o debootstrap uma URL, execute o comando:
# debootstrap etch /modelo http://ftp.us.debian.org/debian
Copie alguns arquivos essenciais para dentro de /modelo:
# cp -a /etc/apt/* /modelo/etc/apt
# cp -a /etc/fstab /modelo/etc
# cp -a /etc/hosts /modelo/etc
# cp -a /etc/network/interfaces /modelo/etc/network
# cp -av /lib/modules/*xen* /modelo/lib/modules
“Enjaule-se” dentro do diretório /modelo com o comando:
# chroot /modelo
Obs.: Uma vez enjaulado, o /modelo passará a ser a raiz do sistema (/). Com isso o administrador estará operando dentro de um novo sistema, que deverá ser reconfigurado. Se a rede estava funcionando fora da jaula, continuará funcionando dentro da mesma e com o mesmo endereço IP.
Execute o comando:
# mount /proc
Obs.: Isso se faz necessário porque a partição /proc é montada pelo sistema durante o boot e não houve boot de sistema e sim enjaulamento.
Execute os comandos:
# aptitude update
# aptitude install locales libc6-xen
Defina as variáveis abaixo:
# export LC_ALL=”pt_BR”
# export LC_CTYPE=”pt_BR”
# export LANGUAGE=”pt_BR”
# export LANG=”pt_BR”
# export LC_MESSAGES=”pt_BR”
Execute o comando abaixo para reconfiguração do locales:
# dpkg-reconfigure locales
Nas opções exibidas na tela, selecione “pt_BR ISO-8859-1” e clique em OK. Em seguida confirme a opção “pt_BR” e clique em OK.
Execute o comando a seguir para otimizar o sistema:
# aptitude install apmd less linuxlogo ntpdate rcconf
Instale o pacote module-init-tools:
# aptitude install module-init-tools
Atualize o sistema com o comando:
# aptitude upgrade
Remova os arquivos .deb utilizados até o momento para que a máquina modelo não fique muito grande:
# apt-get clean
Converta o arquivo de senhas de /etc/passwd para /etc/shadow com o comando:
# pwconv
Edite o arquivo /etc/hostname e altere o nome da máquina para “modelo”.
Edite o arquivo /etc/hosts e altere o nome para “modelo” e ip da máquina para 192.168.1.3.
Edite o arquivo /etc/network/interfaces e altere o nome xen por eth0 para que as máquinas virtuais possam utilizar corretamente os adaptadores de rede. Ainda, remova as entradas bridge_ports e bridge_maxwait.
Renomeie o diretório /lib/tls para desabilitá-lo. Utilize o comando:
# mv /lib/tls /lib/tls.disabled
Edite o arquivo /etc/inittab e desabilite os terminais locais de 2 a 6 (lembra do que eu disse no início sobre só ter um terminal). A situação final será a seguinte:
#2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6
Obs.: O Xen só utiliza um terminal. Assim sendo, a não desabilitação dos terminais excedentes causará mensagens de erro na tela.
Edite o arquivo /etc/profile e insira as linhas (no final):
export TMOUT=1200
Obs.: A linha “alias” proverá a facilidade de colorização dos resultados do comando ls. A linha export irá declarar a variável TMOUT. Com isso, após 1200 segundos (20 minutos) de inatividade no teclado, haverá um auto-logout. Isso aumentará o nível de segurança.
Edite o arquivo /etc/fstab e altere as entradas existentes para que fiquem compatíveis com as máquinas virtuais a serem criadas. Esse arquivo deverá referir-se a uma nova máquina que, normalmente, terá um esquema de partições próprio, começando em /dev/hda1. A seguir, um exemplo de configuração para a máquina modelo:
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev/hda1 / ext3 defaults 0 1
/dev/hda2 none swap sw 0 0
Obs.: Não se preocupe com o fato de ter utilizado /dev/hda1 e /dev/hda2 e não saber o porque disso. Isto em nada tem haver com seus dispositivos físicos (reais), até mesmo se acaso tivesse, nós usaríamos algo como /dev/sd*, o que não é o caso. Na verdade, no momento em que a máquina virtual for configurada para ir ao ar, serão atribuídas ligações entre os dispositivos em questão e os volumes lógicos criados anteriormente. Assim sendo, no caso da máquina vm1, /dev/hda1 será correlacionado com /dev/vm/vm-virt01.raiz ou /dev/vm/vm-virt02.raiz. Já o /dev/hda2 será correlacionado com /dev/vm/vm-virt01.swap ou /dev/vm/vm-virt02.swap. Isso será configurado posteriormente.
Desmonte o diretório /proc com o comando:
# umount /proc
Saia da jaula com o comando:
# exit
CRIAÇÃO DAS MÁQUINAS VIRTUAIS
CRIAÇÃO DA MÁQUINA VIRTUAL PARA VIRT01
Deverá ser configurada a máquina virt01 (composta pelos volumes /dev/vm/vm-virt01.raiz e /dev/vm/vm-virt01.swap).
Para criar a VM do VIRT01, monte o dispositivo /dev/vm/vm-virt01.raiz em /mnt/vm-virt01 com o comando:
# mkdir /mnt/vm-virt01
# mount /dev/vm/vm-virt01.raiz /mnt/vm-virt01
Copie o conteúdo de /modelo para /mnt/vm-virt01 com o comando:
# cp -a /modelo/* /mnt/vm-virt01
Para evitar erros, enjaule-se dento do diretório /mnt/vm-virt01 com o comando:
# chroot /mnt/vm-virt01
Dentro da jaula, revise o arquivo /etc/fstab, verificando se o mesmo encontra-se de acordo com a realidade da máquina virtual que irá ao ar. A seguir, um exemplo de configuração para a máquina virt01:
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev/hda1 / ext3 defaults 0 1
/dev/hda2 none swap sw 0 0
Dentro da jaula, ajuste o nome da máquina virtual modificando o arquivo /etc/hostname para virt01.
Dentro da jaula, ajuste o nome e o endereço IP da máquina virtual modificando o arquivo /etc/hosts. A seguir, como deve ficar a configuração da máquina:
127.0.0.1 localhost.localdomain localhost 192.168.1.4 virt01.dominio.com.br virt01
Dentro da jaula, ajuste as configurações de rede da máquina virtual. O endereço IP deverá ser diferente do atribuído à máquina real. Um exemplo de configuração:
auto eth0
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.1.4
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
Desenjaule-se com o comando:
# exit
Desmonte a partição /mnt/vm-virt01 com o comando:
# umount /mnt/vm-virt01
Agora criaremos a VM para o VIRT02.
Monte o dispositivo /dev/vm/vm-virt02.raiz em /mnt/vm-virt02 com o comando:
# mkdir /mnt/vm-virt02
# mount /dev/vm/vm-virt02.raiz /mnt/vm-virt02
Copie o conteúdo de /modelo para /mnt/vm-virt02 com o comando:
# cp -a /modelo/* /mnt/vm-virt02
Para evitar erros, enjaule-se dento do diretório /mnt/vm-virt02 com o comando:
# chroot /mnt/vm-virt02
Dentro da jaula, revise o arquivo /etc/fstab, verificando se o mesmo encontra-se de acordo com a realidade da máquina virtual que irá ao ar. A seguir, um exemplo de configuração para a máquina vm-virt02:
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev/hda1 / ext3 defaults 0 1
/dev/hda2 none swap sw 0 0
Dentro da jaula, ajuste o nome da máquina virtual modificando o arquivo /etc/hostname para virt02.
Dentro da jaula, ajuste o nome e o endereço IP da máquina virtual modificando o arquivo /etc/hosts. A seguir, como deve ficar a configuração da máquina:
127.0.0.1 localhost.localdomain localhost 192.168.1.5 virt02.omni.com.br virt02
Dentro da jaula, ajuste as configurações de rede da máquina virtual. O endereço IP deverá ser diferente do atribuído à máquina real. Um exemplo de configuração:
auto eth0
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.1.5
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
Desenjaule-se com o comando:
# exit
Desmonte a partição /mnt/vm-virt02 com o comando:
# umount /mnt/vm-virt02
CONFIGURAÇÃO DAS MÁQUINAS VIRTUAIS
Crie o arquivo /etc/xen/vm-virt01 com o conteúdo abaixo. Essas instruções serão a referência para inicialização da máquina virt01 (VIRT01):
ramdisk=”/boot/initrd.img-2.6.18-6-xen-686″
memory=128
root=”/dev/hda1 ro”
disk=[ ‘phy:/dev/vm/vm-virt01.raiz,hda1,w’, ‘phy:/dev/vm/vm-virt01.swap,hda2,w’ ]
vif=[ ‘bridge=xen’ ]
Crie agora o arquivo /etc/xen/vm-virt02 com o conteúdo abaixo. Essas instruções serão a referência para inicialização da máquina virt02 (VIRT02):
ramdisk=”/boot/initrd.img-2.6.18-6-xen-686″
memory=128
root=”/dev/hda1 ro”
disk=[ ‘phy:/dev/vm/vm-virt02.raiz,hda1,w’, ‘phy:/dev/vm/vm-virt02.swap,hda2,w’ ]
vif=[ ‘bridge=xen’ ]
A linha kernel refere-se ao kernel que será utilizado pela máquina virtual. Esse kernel encontra-se no diretório /boot da máquina real.
A linha ramdisk refere-se ao arquivo initrd, que também poderá ser encontrado no diretório /boot da máquina real.
A linha memory irá limitar a quantidade de memória RAM, em megabytes, que será disponibilizada para a máquina virtual. É importante notar que a máquina real necessita de, pelo menos, 196 MB de RAM (imposição do Xen).
A linha root especifica qual será a partição raiz da máquina virtual.
A linha disk especifica quais volumes lógicos serão utilizados pela máquina virtual. No caso, o volume /dev/vm/vm-virt01.raiz será utilizado como hda1 (dentro da máquina virtual) e o volume /dev/vm/vm-virt01.swap será utilizado como hda2. É importante notar que essa linha deve obedecer às especificações inseridas anteriormente em /mnt/vm-virt01/etc/fstab.
A linha vif definirá a bridge que será utilizada para prover a comunicação com a rede.
Ainda, na linha vif é possível fixar um endereço MAC a ser atribuído à VM, porém não é necessário, pois serão gerados MACs aleatórios para as VMs.
Para declarar o MAC, utilize a entrada mac, como no exemplo mostrado a seguir:
INICIALIZANDO E GERENCIANDO AS VMS
# xm create -c vm-virt01
Obs.: Após realizar o primeiro login, altere a senha de root com o comando “passwd root”. A chave -c força a disponibilização de um console durante o boot e após o mesmo. Para realizar um “boot em background”, omita a chave -c.
Para voltar para a máquina real, sem retirar a virtual do ar, utilize teclas “Ctrl + ]”.
A partir da máquina real, para retornar à máquina virtual, utilize o comando:
# xm console vm-virt01
Para inicializar a segunda máquina virtual, utilize o comando:
# xm create -c vm-virt02
Obs.: Após realizar o primeiro login, altere a senha de root com o comando “passwd root”. A chave -c força a disponibilização de um console durante o boot e após o mesmo. Para realizar um “boot em background”, omita a chave -c.
Para voltar para a máquina real, sem retirar a virtual do ar, utilize teclas “Ctrl + ]”.
A partir da máquina real, para retornar à máquina virtual, utilize o comando:
# xm console vm-virt02
Dentro das VMs é possível emitir os comandos “halt” e “reboot”.
COMANDOS ÚTEIS DO XEN
# xm shutdown -H vm1
Reboot sem estar dentro da máquina virtual:
# xm reboot vm1
Desligar a máquina virtual, bruscamente, sem sincronizar ou desmontar discos:
# xm destroy vm1
ATENÇÃO: Esse comando é equivalente a um kill -9 ou a um desligamento abrupto de uma máquina real. Só utilize em casos extremos. Exemplo: perda de controle da máquina virtual. O uso desse comando poderá causar danos, como o corrompimento de filesystem e a perda de dados.
Listar as máquinas que estão sendo executadas:
# xm list
Obs.: Ao listar as máquinas poderão aparecer algumas letras que indicam o estado das mesmas. As principais são:
- r (running): indica que a máquina está executando alguma tarefa;
- b (blocked): indica um bloqueio de atividade, geralmente causado por espera para acesso a dispositivos;
- p (paused): indica que a VM sofreu pausa (veja a seguir como estabelecer pausa na execução);
- s (shutdown): indica que a máquina está em processo de shutdown;
- c (crashed): indica que máquina sofreu um “crash”. Essa situação deve ser do conhecimento do hypervisor para que o estado “c” seja listado;
- d (dying): indica que a máquina está saindo do ar mas ainda não terminou por algum motivo temporário. Esse estado geralmente ocorre durante shutdown ou crash da máquina.
Top do sistema e das máquinas:
# xm top
Pausa na execução de uma máquina:
# xm pause vm1
Retirar pausa na execução de uma máquina:
# xm unpause vm1
Redefinir a quantidade de memória RAM utilizada por uma máquina em execução:
# xm mem-set vm1 256
DESLIGAMENTO DA MÁQUINA REAL
Caso a máquina real seja desligada ou reiniciada por um comando regular (ex: reboot, halt -p, shutdown -(h|r) now, init 0), o estado de execução de cada máquina virtual será salvo automaticamente, dispensando a necessidade de retirá-las do ar previamente. No momento da reinicialização da máquina real, as máquinas virtuais serão recolocadas no ar com base nos dados salvos no momento do desligamento.
Os dados das máquinas são salvos em /var/lib/xen/save e, basicamente, consistem em um dump de memória. Assim sendo, cada arquivo terá o tamanho da quantidade de memória atribuída a cada máquina.
Em caso de erros, verifique o log /var/log/xend.log.