GNU/Linux
 
 
Xen + Debian GNU/Linux
(Paravirtualização com Xen e o Debian GNU/Linux)

Neste artigo será mostrado como paravirtualizar um Debian GNU/Linux com Xen. Para isso, o exemplo adotado neste artigo será de uma máquina com 120GB de HD que será particionado da seguinte forma: hda1=swap=100MB ; hda2=raiz=reisersfs=50GB ; o restante do HD será para as máquinas paravirtuais.


A princípio, o particionamento deverá ficar como figura a seguir:
Dica: este particionamente pode ser conseguido durante a instalação do GNU/Linux ou pelo comando "fdisk".

Instalando um novo kernel para suportar o Xen
# apt-get update ; apt-cache search xen | grep -i linux-image(uma lista de Kernel irá aparecer. Escolha o mais atual)
# apt-get install linux-image-2.6.18-6-xen-686(este foi o Kernel escolhido de acordo com a busca acima)

Também é necessário instalar dois pacotes do Xen, então digite o comando a seguir para instalar os mesmos
# apt-get install xen-hypervisor-3.0.3-1-i386-pae xen-utils-3.0.3-1 bridge-utils iproute(sempre escolha o hypervisor que tiver o "pae", se o Kernel do Xen o suportar. Assim, se terá suporte ao PAE "Phisical Address Extension". Com o PAE, se pode ultrapassar o limite de memória RAM imposto pela arquitetura de 32 bits que é de 4GB. Com esse recurso, se pode alcaçar até 64GB de RAM. Vale ressaltar que o Kernel usado terá que suportar o "PAE. Digite "cat /proc/cpuinfo | grep -i pae", se aparecer alguma linha, então o Kernel o suporta. Lembre-se que este comando "cat /proc/cpuinfo | grep -i pae" deverá ser usada mais a frente quando reiniciar o computar, pois ainda não se está usando o Kernel Xen.
Obs: em vez de utilizar "cat /proc/cpuinfo | grep -i pae", use "cat /boot/config-2.6.18-6-xen-686 | grep -i pae". Com isso, não haverá a necessidade de reiniciar o equipamento. Se aparecer "CONFIG_X86_PAE=y", então o Kernel do Xen tem suporte ao PAE)
# vi /etc/sysctl.conf(insira ou descomente a linha abaixo)
kernel.printk = 4 4 1 7(evita o surgimento de erros quando a RAM for menor que 4GB)
Salve e sai do arquivo
# sysctl -p(no Debian GNU/Linux também pode usar "/etc/init.d/procps.sh start")
# mv /lib/tls /lib/tls.disabled(evita que o Xen fique lento)




Interfaces de rede Xen

Alterando as configurações de IP fixo da rede para inserir uma bridge entre a maquina real e a paravirtual
# vi /etc/network/interfaces(arquivo de configuração das interfaces rede. Abaixo tem um exemplo de como est arquivo deve ficar)
auto lo
iface lo inet loopback
allow-hotplug br-xen (caso ocorra algum problema de rede troque "allow-hotplug" por "auto")
iface br-xen inet static (informa que a interface br-xen vai ter um IP fixo)
address 10.1.1.254 (endereço IP)
netmask 255.0.0.0 (máscara de subrede)
network 10.0.0.0 (endereço de subrede)
bradcast 10.255.255.255 (endereço de broadcast)
gateway 10.1.1.1 (gateway padrão)
bridge_ports eth0 (associa a ponte à interface eth0)
bridge_maxwait 0
Salve e saia do arquivo

Caso o endereço IP seja obtido de maneira automática através de um DHCP Server, utilize os procedimentos a seguir:
# vi /etc/network/interfaces (arquivo que configura as interfaces de rede)
auto lo
iface lo inet loopback
allow-hotplug br-xen (caso ocorra algum problema de rede troque "allow-hotplug" por "auto")
iface br-xen inet dhcp (informa que a interface br-xen vai ser um cliente DHCP)
bridge_ports eth0 (associa a ponte à interface eth0)
bridge_maxwait 0
Salve e saia do arquivo

Dica: no exemplo deste artigo as máquinas paravirtuais estarão na mesma rede da máquina real, ou seja, na rede 10.0.0.0/8. Mas em algumas situações pode ser necessário que as máquinas paravirtuais estejam numa rede diferente (ex: 192.168.1.0/24). Isso pode ser conseguido de duas maneiras:
A primeira maneira é a criação de uma interface virtual para a "br-xen" chamanda de "br-xen:0". Nesta interface virtual se definiria um IP de acordo com a nova rede (ex: 192.168.1.254). A desvantagem seria que o tráfego de rede não seria separado nas interfaces de rede "br-xen" e "br-xen:0", apesar das redes serem totalmente diferentes (br-xen=10.0.0.0/8 e br-xen:0=192.168.1.0/24). Outra desvantagem é a utilização de comandos como o "IPTABLES" que não reconhece interfaces virtuais e na hora de permitir ou impedir um determinado tráfego na "br-xen", impediria também na "br-xen:0". O inverso também aconteceria.
A segunda maneira é a colocação de mais uma placa de rede. Onde essa nova placa seria configurada a "br-xen", não necessitando de uma interface virtual "br-xen:0". Vantagem é que o tráfego de rede estaria totalmente separado e independente, principalmente na hora de implementar regras de filtragem de pacotes com o "IPTABLES" Outra vantagem é que se pode controlar o tráfego (por exemplo com o IPTABLES) entre os equipamentos da mesma rede como se eles estivessem conectados num SWITCH gerenciável. Para que o tráfego circule como se existisse um switch comum de camada 2, implemente as seguintes regras: "iptables -t filter -A FORWARD -i br-xen -o br-xen -s 10.0.0.0/8 -d 10.0.0.0/8 -j ACCEPT" e "iptables -t nat -A POSTROUTING -o br-xen -s 10.0.0.0/8 -d 10.0.0.0/8 -j ACCEPT", mas isso só será necessário se a política de FORWARD da FILTER e de POSTROUTING da NAT estiverem DROP. A desvantagem seria a necessidade de colocar mais um placa de rede.


Reinicie o sistema para que o novo Kernel do Xen entre em ação
# init 6(ao reiniciar o sistema, um novo Kernel aparecerá, conforme figura a seguir)

ATENÇÃO: ao iniciar o sistema com o novo Kernel Xen poderá ocorrer um "Kernel Panic" relacionado ao recurso PAE ou ACPI. Se for relacionado ao PAE, desinstale o hypervisor-pae (apt-get remove xen-hypervisor-3.0.3-1-i386-pae) e instale o hypervisor (apt-get install xen-hypervisor-3.0.3-1-i386). O inverso também é verdadeiro. Reinicie o equipamento.

Agora, se o "Kernel Panic" estiver relacionado ao ACPI, entre no "SETUP" do computador ou edite o "GRUB", desabilitando o recurso de ACPI (acpi=off). Se mesmo assim não resolver e se seu processador for um AMD-K7, instale um Kernel Xen para essa arquitetura (linux-image-2.6.18-6-xen-k7), colocando os repositórios "deb http://puga.vdu.lt/debian etch main" e "deb-src http://puga.vdu.lt/debian etch main" em "/etc/apt/sources.list"). Se nenhum desses procedimentos derem certo, desinstale o Xen (apt-get remove --purge linux-image-2.6.18-6-xen-k7 linux-image-2.6.18-6-xen-686 xen-hypervisor-3.0.3-1-i386-pae xen-hypervisor-3.0.3-1-i386 xen-utils-3.0.3-1 xen-utils-common) e clique aqui para saber como instalar o Xen de acordo com o manual oficial. Para maiores informações sobre "Kernel Panic" e "ACPI" clique aqui




Instalando um GNU/Linux em um diretório

# apt-get update ; apt-get install debootstrap
# mkdir /modelo (diretório onde será instalado um GNU/Linux. O conteúdo deste diretório servirá como modelo para a criação das máquinas paravirtuais)
# debootstrap etch /modelo http://ftp.br.debian.org/debian (instala o Debian GNU/linux dentro do diretório "/modelo". Aguade, pois irá demorar. Poderia usar um CDROM do Debian em vez do 'http://", bastanto montar o drive de CD em "/media/cdrom" e usar o comando "debootstrap etch /modelo file:/media/cdrom". Caso se tenha um proxy "apt-get" como "APT-CACHER" ou " APT-PROXY", use-os dessa maneira: debootstrap etch /modelo http://172.16.200.1:3142/ftp.br.debian.org/debian . Onde o IP e Porta de tal proxy é 172.16.200.1 e 3142, respectivamente)
# cp -av /etc/apt/* /modelo/etc/apt/
# cp -v /etc/fstab /etc/hosts /modelo/etc/
# cp -v /etc/network/interfaces /modelo/etc/network/
# chroot /modelo/
# mount /proc/
# apt-get update ; apt-get install linux-modules-$(uname -r) w3m w3m-img tz-brasil ntpdate vim locales less rcconf mailx module-init-tools reiserfsprogs ("linux-modules-$(uname -r)" instala os arquivos "/boot/System.map-$(uname -r)", "/boot/config-$(uname -r)" e o diretório "/lib/modules/$(uname -r)". Onde "$(uname -r)" será substituido pela versão do Kernel atual)
# tzconfig (siga as instruções e escolha a zona que você está)
# dpkg-reconfigure locales (selecione "pt_BR ISO-8859-1" e "pt_BR.UTF-8 UTF-8". Depois escolha "pt_BR.UTF-8")
# pwconv (cria o "shadow" a partir do "passwd")
# vi /etc/hosts (altere o nome de host para modelo e o IP)
# vi /etc/hostname (altere o nome de host para modelo)
# vi /etc/network/interfaces (troque "br-xen" por "eth0". Apague as linhas "bridge_ports" e "bridge_maxwait". Mude o endereço IP caso esteja usando IP fixo, assim na primeira vez que a máquina paravirtual iniciar pela primeira vez, não entre em conflito com a máquina real)
# vi /etc/fstab (deixe conforme figura a seguir)

# vi /etc/inittab

# vi /etc/sysctl.conf(insira ou descomente a linha abaixo)
kernel.printk = 4 4 1 7(evita o surgimento de erros quando a RAM for menor que 4GB)
Salve e sai do arquivo
# mv /lib/tls /lib/tls.disabled(evita que o Xen fique lento)
# export TMOUT=1200
# apt-get dist-upgrade (caso apareça alguma messagem, basta apertar "Enter")
# apt-get clean
# umount /proc/
# exit
# Obs: o diretório "/modelo" que contém um Debian GNU/Linux têm somente 245MB






ANTES DE PROSSEGUIR LEIA O TEXTO A SEGUIR

Nas etapas abaixo, se fará a criação das partição para as máquinas paravirtuais. Assim, deverá ser escolhido entre a "OPÇÃO 1" e "OPÇÃO 2". A "OPÇÃO 2" é a mais díficil, pois será necessário aprender a trabalhar com LVM (Logical Volume Manager), mas é a que tem um maior flexibilidade. Já a "OPÇÃO 1" é a mais simples, pois se utilizará o comando "fdisk", mas haverá algumas limitações relacionadas ao próprio sistema de particionamento, também será necessário reiniciar o sitema sempre que mudar a tabela de partições. Então, para prosseguir se deve escolher entre a "OPÇÃO 1" e a "OPÇÃO 2".

O interssante em qualquer uma das opções, caso haja a necessidade de formatar a partição da máquna real (hda2), as máquinas paravirtuais já criadas não serão prejudicadas. Basta não formatar as partições das máquinas paravirtuais ;-)







OPÇÃO 1
(FDISK)

Criando partições que serão usadas pela máquina para virtual
# fdisk /dev/hda(o ambiente do "fdisk" se abrirá)
Digite "m" e aperte "Enter"(um lista de opções aparecerá. Assim, de acordo com esta lista se deve cria uma partição estentida "/dev/hda4", uma partição lógica de 40MB "/dev/hda5" e uma outra partição lógica de 4GB "/dev/hda6")
De acordo com esta lista e com o que foi dito na linha acima, faça partições de acordo com a figura a seguir:

# init 6(para que a modificação na tabela de partições tenha efeito)

Depois de reiniciar faça:
# mkswap /dev/hda5
# mkfs.reiserfs /dev/hda6
# mkdir -p /mnt/vm1/hda5
# mkdir -p /mnt/vm1/hda6
# mount /dev/hda6 /mnt/vm1/hda6/
# df -h(veja as partições montadas, inclusive a "/dev/hda6". Conforme figura a seguir)

cp -av /modelo/* /mnt/vm1/hda6/


Revisando a máquina paravirtual recém criada. Ajuste-a, verificando os arquivos abaixo:
# chroot /mnt/vm1/hda6/
# vi /etc/hostname (mude o nome de host)
# vi /etc/network/interfaces (mude o endereço IP caso esteja usando IP fixo)
# vi /etc/fstab (verifique e memorize, pois mais a frente, ao configurar o arquivo "vm1", será necessário saber quem é a partição "/" e a "swap")

# vi /etc/resolv.conf(verifique)
# vi /etc/hosts (mude o nome de host. Caso o IP seja fixo, mude o IP de acordo com o arquivo "/etc/network/interfaces". A seguir é mostrado o conteúdo do arquivo "/etc/hosts" em um sistema que tem o IP fixo)

(se o endereço IP é automático através de um DHCP, então o conteúdo do arquivo "/etc/hosts" será conforme figura a seguir)

# exit
# umount /dev/hda6

Arquivo de configuração da máquina paravirtual chamada "vm1"
# vi /etc/xen/vm1
kernel="/boot/vmlinuz-2.6.18-6-xen-686" (o mesmo Kernel que a máquina real usa, a paravirtual também vai usar)
ramdisk="/boot/initrd.img-2.6.18-6-xen-686" (o mesmo Initial RAM Drive que a máquina real usa, a paravirtual também vai usar)
memory=128 (quantidade de RAM da máq. paravirtual. Ao iniciar uma máquina paravirtual, a quantidade de memória definida aqui é retirada da máquina real e alocada unicamente para a a virtual. Antes e depois de iniciar uma máq. virtual digite o comando "free -m" na máq. real para ver a diferença. Verifique que a quantidade total e livre de memória diminuiram na mesma proporção do valor definido nesse campo. Assim, fica impossibilitado o uso dessa memória pela máquina real e pelas outras virtuais. Um grande problema depois de iniciada a máquina virtual é que ao desligá-la a quantidade de memória alocada continuará alocada e a máquina real não mais conseguirá utilizá-la. Pelo menos ao reiniciar a máq. virtual novamente não consumirá mais memória do que já está alocada. Uma das maneiras de se resolver isso é reiniciar a máquina real. Existe duas opções interessantes que podem minimizar esse problema que são o "maxmem" e "shadow_memory". No XEN ao alterar a quantidade de memória RAM da máquina virtual, será necessário desligá-la e ligá-la novamente. No VMWare acontece o mesmo, mas será necessário desligá-la para alterar. No XEN pode alterar em qualquer momento, mas só terá efeito despois que desligar e ligar novamente)
name = "vm1"
root="/dev/hda2 ro" (partição raiz, ou seja, o "/" da máq. paravirtual)
disk=[ 'phy:/dev/hda6,hda2,w', 'phy:/dev/hda5,hda1,w' ](esta linha é muito importante, pois explica vários procedimentos já realizados neste artigo. Este linha diz que a partição "/dev/hda6" criada na máq. real será mapeada para a partição "hda2" da máquina paravirtual e o "w" significa que tem permissão de escrita. Também diz que a partição "/dev/hda5" criada na máq. real será mapeada para a partição "hda1" da máquina paravirtual e o "w" significa que tem permissão de escrita. Sempre verificar o arquivo "/etc/fstab" da máq. paravirtual configurado anteriormente)
vif=[ 'bridge=br-xen' ](nome da interface de rede da máquina real que tem o endereço IP para a com comunicação via rede. Em caso de dúvida verifique o arquivo "/etc/network/interfaces" da máq. real. O endereço MAC da máq. paravirtual é criado automaticamente, mas se quiser definir um, então faça "vif=[ 'mac 00:11:2F:6C:DB:B1, bridge=br-xen' ] )
vcpus = 2





OPÇÃO 2
(LVM - Logical Volume Manager)

Agora, reparticione o HD deixando da seguinte forma:
hda1=swap=100MB ; hda2=raiz=reisersfs=50GB ; hda4=extendida ; hda5=LinuxLVM=70GB(utilize o comando "fdisk". O "hda5" é onde as máquinas paravituais serão implementadas)
Depois de reparticionar com o comando "FDISK", reinicie sistema (o reinicio é necessário para que a nova tabela de partições seja reconhecida)

O particionamento deverá ficar como figura a seguir:

Nesta etapa será criado um PV (Physical Volume - Volume Físico), um VG (Volume Group - Grupo de Volume) e um LV (Logical Volume - Volume Lógico)
# apt-get update ; apt-get install lvm2(pacote que provê os recursos para o LVM)
# umount /dev/hda5(a partição que receberá os volumes lógicos deve está desmontada)
# pvcreate /dev/hda5(cria um PV - Physical Volume. Inicializa ou prepara um disco ou uma partição física para trabalha com LVM. Para remover "pvremove /dev/hda5")
# pvs(visualiza o PV criada anteriormente)
# vgcreate vm /dev/hda5(cria um VG - Volume Group chamado "vm". A criação de uma VG é necessária, pois ele tem a função de unir dois ou mais PVs em um único grupo. Por exemplo, se tivéssemos criado uma PV em "/dev/hdc3" e outra em "/dev/hdd6", poderíamos unir os dois com o comando "vgcreate vm /dev/hdc3 /dev/hdd6". Para remover "vgremove vm")
# vgs(visualiza a VG criada anteriormente)
# lvcreate -L4G -n vm1.raiz vm(cria um LV - Logical Volume - de 4GB chamado "vm1.raiz" dentro da VG chamada "vm". Uma LV pode ser entendida com uma partição que neste caso será o "/" do sistema, local onde será instalado o GNU/Linux. Para remover "lvremove vm/vm1.raiz", onde vm é o volume group e o vm1 é logical volume)
Obs: é criado um dispositivo "/dev/vm/vm1.raiz". Digite o comando "lvscan".
# lvcreate -L40M -n vm1.swap vm(cria um LV de 50MB chamado "vm1.swap" dentro da VG chamada "vm". Uma LV pode ser entendida com uma partição que neste caso será o "swap" do sistema. Para remover "lvremove vm/vm1.swap")
Obs: é criado um dispositivo "/dev/vm/vm1.swap". Digite o comando "lvscan".
# lvs(visualiza as LV criada anteriormente)

Agora que foram criadas as LVs, é necessário formatá-las como se fossem partições comuns:
# mkfs.reiserfs /dev/vm/vm1.raiz(formata em reiserfs. Cuidado, pois apagará todo o conteúdo)
# mkswap /dev/vm/vm1.swap(formata em swap)
Obs1: um LV pode ser entendido como um dispositivo de armazenamente igual aos outros. Então tudo o que se faz com partições como "/dev/hda1, /dev/sda1 etc", podem ser feitos nas LVs.
Obs2: o LVM é um serviço e como tal pode ser parado, iniciado e reiniciado ( /etc/init.d/lvm )

Monte a LV chamada "vm1.raiz"
# mkdir /mnt/vm/(cria um diretório)
# mount /dev/vm/vm1.raiz /mnt/vm/(monta a partição LV criada anteriormente)
# df -h(veja as partições montadas, inclusive a "vm1.raiz". Conforme figura a seguir)

cp -av /modelo/* /mnt/vm/

Revisando a máquina paravirtual recém criada. Ajuste-a, verificando os arquivos abaixo:
chroot /mnt/vm/
# vi /etc/hostname (mude o nome de host)
# vi /etc/network/interfaces (mude o endereço IP caso esteja usando IP fixo)
# vi /etc/fstab (verifique e memorize, pois mais a frente, ao configurar o arquivo "vm1", será necessário saber quem é a partição "/" e a "swap")
# vi /etc/resolv.conf(verifique)
# vi /etc/hosts (mude o nome de host. Caso o IP seja fixo, mude o IP de acordo com o arquivo "/etc/network/interfaces". A seguir é mostrado o conteúdo do arquivo "/etc/hosts" em um sistema que tem o IP fixo)

(se o endereço IP é automático através de um DHCP, então o conteúdo do arquivo "/etc/hosts" será conforme figura a seguir)

# exit
# umount /mnt/vm/

Arquivo de configuração da máquina paravirtual chamada "vm1"
# vi /etc/xen/vm1(cria um arquivo "/etc/xen/vm1" referente a máquina paravirtual chamada "vm1")
kernel="/boot/vmlinuz-2.6.18-6-xen-686"(o mesmo Kernel que a máquina real usa, a paravirtual também vai usar)
ramdisk="/boot/initrd.img-2.6.18-6-xen-686"(o mesmo Initial RAM Drive que a máquina real usa, a paravirtual também vai usar)
memory=128(quantidade de RAM para a máq. paravirtual)
name = "vm1"(nome para a máq. paravirtual. É opcional, pois se não existir, o nome do arquivo "/etc/xen/vm1" será dado)
root="/dev/hda2 ro"(partição raiz, ou seja, o "/" da máq. paravirtual)
disk=[ 'phy:/dev/vm/vm1.raiz,hda2,w', 'phy:/dev/vm/vm1.swap,hda1,w' ](esta linha é muito importante, pois explica vários procedimentos já realizados neste artigo. Este linha diz que a partição "/dev/vm/vm1.raiz" criada na máq. real será mapeada para a partição "hda2" da máquina paravirtual e o "w" significa que tem permissão de escrita. Também diz que a partição "/dev/vm/vm1.swap" criada na máq. real será mapeada para a partição "hda1" da máquina paravirtual e o "w" significa que tem permissão de escrita. Sempre verificar o arquivo "/etc/fstab" da máq. paravirtual configurado anteriormente)
vif=[ 'bridge=br-xen' ](nome da interface de rede da máquina real que tem o endereço IP para a com comunicação via rede. Em caso de dúvida verifique o arquivo "/etc/network/interfaces" da máq. real. O endereço MAC da máq. paravirtual é criado automaticamente, mas se quiser definir um, então faça "vif=[ 'mac 00:11:2F:6C:DB:B1, bridge=br-xen' ] )
vcpus = 2(o padrão é "1" se esta linha não existir. Indica quantos processadores a máq. paravirtual terá)





Continuando

Inicialização a máquina paravirtual "vm1" (xenU)
# xm create -c vm1(liga o inicia a máq. paravirtual chamada "vm1". A opção "-c" faz com que o console apareça assim que o sistema inicilizar. Para a inicialização em background não utiliza essa chave)
Digite "root" e aperte "ENTER" quando aparecer a tela de login
Digite "passwd" para mudar a senha de "root"
aperta as teclas "CTRL + ]"(para volta para a máq. real)
# xm console vm1(volta para a máq. paravitual)

Comandos que se pode utilizar dentro da máquina paravirtual
TODOS OS COMANDOS QUE SÃO USADOS NORMALMENTE EM QUALQUER SISTEMA GNU/Linux

Comandos que se pode utilizar na máquina real
# xm list(lista as máqs. paravituais inicializadas)
# xm reboot vm1(reinicia a máq. paravituai chamada vm1)
# xm shutdown -H vm1(desliga a máq. paravituai chamada vm1)
# xm destroy vm1(desliga a máq. paravituai chamada vm1, mas é realizado de forma brusca. Simalar ao "kill -9". Utilize em último caso)
# xm top(uma espécie de "top" para máq. paravituais inicializadas)






Extra

Importante
Caso a máquina real seja desligada e exista uma ou mais máquinas paravirtuais funcionando, elas serão salvas. Sendo que ao reinicar a máquina real, todas as paravirtuais serão restauradas automaticamente ;-)
O XEN cria para cada máquina paravirtual uma regra no IPTABLES(digite: iptables -t filter -L)



Referências Bibliográgicas
MOTA FILHO, J. E. Descobrindo o linux: entenda o sistema operacional GNU/Linux. 2. ed. São Paulo: Novatec, 2007.
 
 




ETI - Especialista em Tecnologia
da Informação