Virtualização com XEN no Debian Etch
Posted by Paulo Arruda | Posted in Linux | Posted on 19-07-2008
Tags:xen debian etch virtualização maquina virtual hyperviso
0
O objetivo deste tutorial é mostrar as instruções passo a passo para instalar o XEN em um Debian Etch pré instalado (sistema básico) e com os repositórios corretamente configurados. Todos os programas utilizados se encontram no repositório do Etch, logo, não será feito uso de arquivos externos, tão pouco será necessário compilar alguma coisa.
Antes de começarmos, vamos a algumas definições utilizadas neste tutorial:
Dom0 -> Máquina hospedeira (host), onde será instalado o Xen Hypervisor
DomU -> Máquinas virtuais, abreviando Unprivileged Domain
LVM -> Acrônimo para a expressão inglesa Logical Volume Management para designar um padrão de gerenciamento de partições em disco IDE/SCSI/FC. Foi desenvolvido inicialmente pela IBM, seguindo-se outras empresa e instituições, como HP e a Open Group.
Ao contrário do método tradicional de particionamento, a implementação LVM cria um grande disco virtual, que pode inclusive ter mais de um dispositivo de armazenamento, e divide em partições virtuais. A grande vantagem é permitir o redimensionamento das áreas de modo dinâmico, ou seja, com o sistema operacional sendo utilizado. (fonte Wikipédia http://pt.wikipedia.org/wiki/LVM)
- INSTALAÇÃO
Depois de se logar em um console (modo texto) como ROOT, vamos começar com o Kernel, libc e todas as ferramentas necessárias para o funcionamento do XEN:
lab04est011:~# apt-get install linux-image-2.6-xen-vserver-686 xen-hypervisor-3.0.3-1-i386-pae xen-tools xen-linux-system-2.6.18-4-xen-vserver-686 linux-headers-2.6-xen-vserver-686 libc6-xen bridge-utils lvm2
Agora já temos o XEN Hypervisor instalado, assim como o seu Kernel “patcheado”.
Antes de dar o boot no novo Kernel é necessário alterar algumas configurações em /etc/xen/xend-config.sxp para que a rede das máquinas virtuais funcionem em modo bridge
lab04est011:~# vim /etc/xen/xend-config.sxp
Altere a linha
(network-script network-dummy)
para
(network-script network-bridge)
Agora vamos reiniciar o sistema pelo Kernel do XEN.
lab04est011:~# reboot
Dentro do novo sistema, vamos conferir como ficaram as interfaces de rede pelo comando ifconfig:
lab04est011:~# ifconfig
eth0 Encapsulamento do Link: Ethernet Endereço de HW 00:E0:7D:FB:DA:26
inet end.: 172.16.1.66 Bcast:172.16.1.255 Masc:255.255.255.0
endereço inet6: fe80::2e0:7dff:fefb:da26/64 Escopo:Link
UP BROADCASTRUNNING MULTICAST MTU:1500 Métrica:1
RX packets:345 errors:0 dropped:0 overruns:0 frame:0
TX packets:111 errors:0 dropped:0 overruns:0 carrier:0
colisões:0 txqueuelen:0
RX bytes:37628 (36.7 KiB) TX bytes:15052 (14.6 KiB)lo Encapsulamento do Link: Loopback Local
inet end.: 127.0.0.1 Masc:255.0.0.0
endereço inet6: ::1/128 Escopo:Máquina
UP LOOPBACKRUNNING MTU:16436 Métrica:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
colisões:0 txqueuelen:0
RX bytes:560 (560.0 b) TX bytes:560 (560.0 b)peth0 Encapsulamento do Link: Ethernet Endereço de HW FE:FF:FF:FF:FF:FF
endereço inet6: fe80::fcff:ffff:feff:ffff/64 Escopo:Link
UP BROADCASTRUNNING NOARP MTU:1500 Métrica:1
RX packets:492 errors:0 dropped:0 overruns:0 frame:0
TX packets:122 errors:0 dropped:0 overruns:0 carrier:0
colisões:0 txqueuelen:1000
RX bytes:47544 (46.4 KiB) TX bytes:16658 (16.2 KiB)
IRQ:19 Endereço de E/S:0xe400vif0.0 Encapsulamento do Link: Ethernet Endereço de HW FE:FF:FF:FF:FF:FF
endereço inet6: fe80::fcff:ffff:feff:ffff/64 Escopo:Link
UP BROADCASTRUNNING NOARP MTU:1500 Métrica:1
RX packets:111 errors:0 dropped:0 overruns:0 frame:0
TX packets:345 errors:0 dropped:0 overruns:0 carrier:0
colisões:0 txqueuelen:0
RX bytes:15052 (14.6 KiB) TX bytes:37628 (36.7 KiB)xenbr0 Encapsulamento do Link: Ethernet Endereço de HW FE:FF:FF:FF:FF:FF
endereço inet6: fe80::200:ff:fe00:0/64 Escopo:Link
UP BROADCASTRUNNING NOARP MTU:1500 Métrica:1
RX packets:202 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
colisões:0 txqueuelen:0
RX bytes:20653 (20.1 KiB) TX bytes:0 (0.0 b)lab04est011:~#
peth0 -> interface utilizada para fazer o bridge entre as interfaces virtuais e a interface real
vif0.0 -> interfacel utilizada para que o Dom0 se comunque com a rede.
xenbr0 -> bridge que contém peth0 e vifX.Y
Cada interface de rede de cada máquina virtual criada terá uma interface correspondente no Dom0, chamada de vifX.Y, onde X representa o domínio e Y o número da placa de rede da máquina virtual. Resumindo, a primeira interface de rede da terceira máquina virtual se chamaria vif2.0 no Dom0. A segunda interface de rede da primeira máquina virtual se chamaria vif1.1 no Dom0. E por aí vai… lembre-se que a contagem começa com 0 (zero).
- CRIANDO O SISTEMA BASE (MODELO)
Vamos gerar um sistema base do Debian e usá-lo como modelo para esta e futuras máquinas virtuais que venham a ser criadas. Para fazer isso, utilizamos a ferramenta debootstrap.
O debootstrap cria uma instalação do Debian (apenas sistema base) em um diretório. Vamos criar uma pasta para receber este sistema base.
lab04est011:~# mkdir base
O debootstrap precisa de uma fonte para baixar os arquivos do sistema básico do debian. Podemos usar o próprio CD1 de instalação do Debian, ou até mesmo um repositório online. Neste tutorial vamos utilizar o CD1 do Debian.
Insira o CD1 do Debian Etch na unidade de cdrom e monte-o em /mnt:
lab04est011:~# mount /dev/cdrom /mnt
Agora vamos criar o sistema base na pasta “base”. Esta operação pode demorar um pouco:
lab04est011:~# debootstrap etch base file:/mnt
E desmontamos o cdrom
lab04est011:~# umount /dev/cdrom
Precisamos configurar alguns arquivos da base que não veem configurados pelo debootstrap. Vamos utilizar os arquivos do Dom0, copiando-os para a base e alterá-los quando necessário, na hora de copiar a base para a partição da máquina virtual:
lab04est011:~# cp /etc/fstab base/etc
lab04est011:~# cp /etc/hosts base/etc
lab04est011:~# cp /etc/apt/* base/etc/apt/
lab04est011:~# cp /etc/network/interfaces base/etc/network/
É preciso copiar os módulos do Kernel do XEN para o sistema base:
lab04est011:~# cp -arpv /lib/modules/2.6.18-6-xen-vserver-686 base/lib/modules/
- CRIANDO AS MÁQUINAS VIRTUAIS
O primeiro passo é criar os volumes lógicos que vão abrigar as máquinas virtuais. Desmonte a partição que vai receber os volumes lógicos, caso ela esteja montada. Neste exemplo é /dev/hda3.
lab04est011:~# umount /dev/hda3
Obs.: Não podemos esquecer de remover eventuais entradas desta pastição no arquivo /etc/fstab !
Preparando a partição para receber os volumes lógicos:
lab04est011:~# pvcreate /dev/hda3
Criando o grupo lógico chamado VM:
lab04est011:~# vgcreate vm /dev/hda3
Agora vamos criar as partições que vão abrigar nossa primeira máquina virtual (vou chamá-la de VM1). Por questões didáticas de simplificação, criarei a máquina virtual utilizando todos os arquivos em uma única partição. Logo, teremos apenas duas partições: / e SWAP.
Criando a partição “/” com 2Gb em /dev/vm/vm1.raiz:
lab04est011:~# lvcreate -L2G -n vm1.raiz vm
Criando a partição SWAP, com 512Mb em /dev/vm/vm1.swap:
lab04est011:~# lvcreate -L512M -n vm1.swap vm
Criando o sistema de arquivos EXT3 na partição “/”:
lab04est011:~# mkfs.ext3 /dev/vm/vm1.raiz
Setando a partição /dev/vm/vm1.swap como swapspace:
lab04est011:~# mkswap /dev/vm/vm1.swap
Agora vamos montar a partição raiz da máquina virtual em /mnt
lab04est011:~# mount /dev/vm/vm1.raiz /mnt
E copiar o sistema base para a partição
lab04est011:~# cp -arpv base/* /mnt/
Precisamos configurar alguns arquivos na máquina virtual. Mas antes, vamos dar um chroot em /mnt
lab04est011:~# chroot /mnt
Agora vamos atualizar o sistema
lab04est011:~# apt-get update
lab04est011:~# apt-get upgrade
Instalar o pacote libc6-xen, que resolve o bug das mensagens do kernel
lab04est011:~# apt-get install libc6-xen
Agora vamos configurar o /etc/fstab
lab04est011:~# vim /etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev/hda2 / ext3 defaults,errors=remount-ro 0 1
/dev/hda1 none swap sw 0 0
/dev/hdb /media/cdrom0 udf,iso9660 user,noauto 0 0
/dev/fd0 /media/floppy0 auto rw,user,noauto 0 0
Este é o arquivo é uma cópia do /etc/fstab do Dom0, lembra? Precisámos editá-lo para que se adeque à realidade da nossa máquina virtual, que possui apenas 2 partições (raiz e swap). Altere o arquivo para que ele fique como o abaixo:
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev/hda2 / ext3 defaults,errors=remount-ro 0 1
/dev/hda1 none swap sw 0 0
Porque escolhemos /dev/hda1 para swap e /dev/hda2 para raiz?? As partições criadas não eram /dev/vm/vm1.raiz e /dev/vm/vm1.swap???
Calma… isso será explicado no passo de criação do arquivo de inicialização da máquina virtual.
Agora vamos configurar a interface de rede da máquina virtual. edite o arquivo /etc/network/interfaces
lab04est011:~# vim /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 eth0
iface eth0 inet dhcp
Neste tutorial utilizaremos um IP atribuído por um servidor DHCP. Neste caso, a configuração acima está adequada. No caso de usarmos IP fixo, devemos configurar este arquivo conforme abaixo:
# 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 eth0
iface eth0 inet static
address xxx.xxx.xxx.xxx # ip desejado
netmask xxx.xxx.xxx.xxx # máscara de rede
gateway xxx.xxx.xxx.xxx # ip do gateway
No caso de IP fixo, não podemos esquecer de configurar o arquivo /etc/resolv.conf
lab04est011:~# echo nameserver xxx.xxx.xxx.xxx > /etc/resolv.conf
Onde xxx.xxx.xxx.xxx é o IP do servidor DNS.
Agora vamos configurar o arquivo /etc/hosts
lab04est011:~# vim /etc/hosts
127.0.0.1 localhost
127.0.1.1 lab04est011.local lab04est011# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
Altere-o para que fique como abaixo:
127.0.0.1 localhost
127.0.1.1 vm1# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
E por último, vamos definir o hostname com o comando
lab04est011:~# echo vm1 > /etc/hostname
E configurar o locales
lab04est011:~# apt-get install locales
lab04est011:~# dpkg-reconfigure locales
Selecione os locales que desejar. Neste caso utilizaremos os listados abaixo por questão de compatibilidade:
[*] pt_BR ISO-8859-1
[*] pt_BR.UTF-8 UTF-8
Depois escolha como padrão “pt_BR.UTF-8″.
Agora saímos do ambiente chroot e desmontamos a partição /dev/vm/vm1.raiz
lab04est011:~# exit
lab04est011:~# umount /dev/vm/vm1.raiz
Vamos agora criar o script de inicialização da máquina virtual.
Os scripts devem ficar na pasta /etc/xen. Vamos criar um para a nossa “vm1″
lab04est011:~# vim /etc/xen/vm1
name = “vm1″
kernel = “/boot/vmlinuz-2.6.18-6-xen-vserver-686″
ramdisk = “/boot/initrd.img-2.6.18-6-xen-vserver-686″
memory = 128
root = “/dev/hda2 ro”
disk = [ 'phy:/dev/vm/vm1.raiz,hda2,w', 'phy:/dev/vm/vm1.swap,hda1,w' ]
vif = [ 'mac=00:00:00:00:00:01' ]
E finalmente chegou o momento de ligarmos a máquina virtual.
lab04est011:~# xm create -c vm1
Entre com o usuário root. O sistema não vai pedir senha porque a mesma ainda nao foi criada, então criá-la:
vm1:~# passwd
E converter o passwd para shadow
vm1:~# pwconv
E pronto!
Para sair do console da máquina virtual, use a sequência de teclas CTRL+].
Para que a máquina virtual inicia automaticamente a cada boot do Dom0, crie a pasta /etc/xen/auto
lab04est011:~# mkdir /etc/xen/auto
E crie links simbólicos apontando para o script de inicialização da máquina:
lab04est011:~# ln -s /etc/xen/vm1 /etc/xen/auto/vm1
- ADMINISTRAÇÃO DAS MÁQUINAS VIRTUAIS
Abaixo segue uma lista com alguns comandos para administrar as máquinas virtuais:
Desligando uma máquina virtual:
lab04est011:~# xm shutdown -H vm1
Reiniciando uma máquina virtual:
lab04est011:~# xm reboot vm1
Desligando abruptamente uma máquina virtual:
lab04est011:~# xm destroy vm1
ATENÇÃO: Este comando é equivalente ao desligamento abrupto de uma máquina real (ex faltar luz). Só utilize-o em casos extremos, por exemplo, perda de controle da máquina virtual. O uso deste comando poderá causar danos como o corrompimento do filesystem e a perda de dados.
Listando as máquinas virtuais que estão ligadas:
lab04est011:~# xm list
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 durate shutdown ou crash da máquina.
Um TOP do sistema e das máquinas virtuais:
lab04est011:~# xm top
Pausar uma máquina virtual:
lab04est011:~# xm pause vm1
Tirar a pausa:
lab04est011:~# xm unpause vm1
Mudar a quantidade de memória da máquina virtual em “tempo de execução”:
lab04est011:~# xm mem-set vm1 512
Para maiores informações, e mais comandos, consulte a documentação do XEN, ou digite:
lab04est011:~# man xm
- COMANDOS ÚTEIS PARA MANIPULAR VOLUMES LÓGICOS
Listar volumes físicos:
lab04est011:~# pvs
Remover volumes físicos
lab04est011:~# pvremove /dev/hda3
Listar os grupos e as suas informações:
lab04est011:~# vgs
Remover um grupo de volumes:
lab04est011:~# vgremove vm
Listar os volumes lógicos definidos:
lab04est011:~# lvs
Remover um volume lógico:
lab04est011:~# lvremove /dev/vm/vm1.raiz
Renomear um volume lógico:
lab04est011:~# lvrename /dev/vm/vm1.taiz /dev/vm/vm2.raiz
Redimensionar um volume lógico:
lab04est011:~# lvresize -L -5G /dev/vm/vm1.raiz
Obs: Ao redimensionar um volume lógico, parte do sistema de arquivos (caso exista) será perdido. Se não houver dados ou sistema de arquivos, bastará formatar o volume lógico (mkfs.ext3 /dev/vm/vm1.raiz, por exemplo). Caso haja dados, a primeira opção será fazer um backup dos mesmos para um posterior retorno. A segunda opção será redimensionar o sistema de arquivos. Para cada tipo de sistema de arquivos haverá um comando próprio para esta ação. É importante ressaltar que o redimensionamento do sistema de arquivos também poderá causar perda de dados.

