xen-debian
Debian Sarge + Xen 3.0 + LVM + ReiserFS

(via Debian Backports)

Versão 1.5 - 15 de setembro de 2006

By João Eriberto Mota Filho
(eriberto a eriberto pro br)
(www.eriberto.pro.br)





1. Introdução


    O objetivo deste site é disponibilizar um tutorial personalizado e que realmente funcione. Por favor, caso encontre algum erro, entre em contato comigo por e-mail. Mas adianto: não tenho disponibilidade para tornar-me suporte técnico do Xen. Caso precise de suporte, por favor, verifique o item final deste site.

    Existem dois tipos básicos de virtualização de máquinas: a virtualização total (full virtualization) e a paravirtualização (paravirtualization). Na virtualização total, há uma virtualização dos elementos básicos de hardware e de software (processador, memória, kernel etc). Na paravirtualização, apenas alguns elementos são virtualizados. O VMware, por exemplo, trabalha com virtualização total. Isso faz com que ele virtualize máquinas que são capazes de executar o GNU/Linux, o MS Windows, o Novel NetWare e o Solaris x386. Já o Xen (pronucia-se zêin) utiliza a técnica de paravirtualização, chegando a utilizar o mesmo kernel para a máquina real e para a máquina virtual. Assim sendo, o Xen, atualmente, está preparado para operar sobre Linux e NetBSD.

    São vantagens do Xen:

- a utilização de um único kernel base e de um micro kernel (apenas dois elementos) para a máquina real e todas as virtuais ao mesmo tempo;
- a rapidez e a leveza, por realizar pouca virtualização, ao aproveitar a maior parte dos recursos existentes na máquina real;
- a estabilidade e a confiabilidade;
- a segurança, em virtude de isolar totalmente as máquinas virtuais (só há comunicação por rede);
- o perfeito controle sobre o uso da memória e do processador por parte de cada máquina virtual;
- a não escravização de terminais dedicados para cada uma das máquinas virtuais;
- é software livre com versão gratuita.

    São desvantagens do Xen:

- a limitação a poucos sistemas operacionais;
- a quantidade de passos necessários para executar toda a instalação e configuração;
- a obrigatoriedade de utilizar um kernel modificado e um micro kernel para estabelecer a máquina real e as máqunas virtuais.

    O Xen, na verdade, é um monitor de máquinas virtuais. As máquinas serão construídas artesanalmente e o monitor irá mantê-las em execução sobre um sistema operacional principal (sistema operacional da máquina real). Assim, serão estabelecidos os chamados "domínios". A máquina real é conhecida como domínio0, domain0 ou xen0. Cada máquina virtual é conhecida como guest, domínioU, domainU ou xenU. Um micro kernel, denominado hypervisor, faz a ligação entre o xen0 e as xenU. As máquinas virtuais não possuirão kernel (utilizarão o mesmo da máquina real).

    Este tutorial irá trabalhar com base nos seguintes procedimentos e premissas:


2. Instalação do Xen na máquina real (xen0)
- 01 partição para o Debian principal (cerca de de 2 GB, desconsiderando a utilização de ambiente gráfico). Este tutorial irá utilizar a partição primária /dev/hda1;
- 01 partição para o swap. Este tutorial irá utilizar a partição primária /dev/hda2;
- 01 partição para as máquinas virtuais (dê qualquer nome para essa partição no momento da instalação, como /vms). Este tutorial irá utilizar a partição lógica /dev/hda5.
# apt-get install apmd less linuxlogo ntpdate rcconf sendmail mc

Obs: Caso o Sendmail apresente problemas de dependência no momento da instalação, instale o pacote sendmail-bin antes do pacote sendmail. O Sendmail será executado localmente, sem abrir portas para "o mundo", servido apenas como smtp para o próprio sistema (a não ser que você altere isso). É normal aparecer um erro referente a uma entrada FEATURE fora de ordem, em relação a uma entrada MAILER, durante a inicialização do Sendmail.
# umount /dev/hda5
deb http://www.backports.org/debian sarge-backports main
Package: *
Pin: release a=sarge-backports
Pin-Priority: 200


Obs: esse bloco de configuração fará com que o repositório do Debian Backports somente seja utilizado caso essa necessidade seja expressamente declarada no apt-get com a opção -t sarge-backports.
# apt-get install bridge-utils iproute
# apt-get install -t sarge-backports xen-hypervisor-3.0-i386 xen-utils-3.0 linux-image-2.6.16-2-xen-686

Obs1: caso seja solicitado, não execute os procedimentos referentes à instalação do LILO (apenas clique em OK). Ainda, o pacote
xen-hypervisor-3.0-i386 contém o arquivo /boot/xen-3.0-i386.gz, que é o hypervisor.

Obs2: foi utilizado o kernel 2.6.16-2-xen-686. Para procurar por kerneis mais novos utilize o comando apt-cache search xen|grep linux-image.

Obs3: o kernel 2.6.16-2-xen-686 tem apresentado problemas na inicialização em alguns hardwares. Esse problema está fazendo com que a máquina sofra infinitos reboots no momento da inicialização. Caso isso ocorra, utilize o kernel 2.6.16-1-xen-686.

# mkinitramfs -o /boot/initrd.img-2.6.16-2-xen-686 2.6.16-2-xen-686

Obs: o número 2.6.16-2-xen-686 foi obtido com o comando # ls /lib/modules.
title        Debian GNU/Linux, kernel 2.6.16-2-686 XEN
root        (hd0,0)
kernel     /boot/xen-3.0-i386.gz
module    /boot/vmlinuz-2.6.16-2-xen-686 root=/dev/hda1 ro
module    /boot/initrd.img-2.6.16-2-xen-686
savedefault
boot

Obs: a linha root deverá referir-se à partição que contém o diretório /boot. Em caso de dúvida, verifique como o Debian principal fez essa associação nos demais blocos de configuração. Ainda, é interessante que o bloco acima seja o primeiro de todos dentro, do arquivo de configuração, para que o kernel Xen seja o primeiro a dar boot por default.
# mv /lib/tls /lib/tls.disabled
auto lo
iface lo inet loopback

auto br-xen

iface br-xen inet static
        address 10.0.0.20
        netmask 255.0.0.0
        network 10.0.0.0
        broadcast 10.255.255.255
        gateway 10.0.0.200
        bridge_ports eth0
        bridge_maxwait 0

Obs: a linha "
bridge_ports eth0" irá associar a bridge à interface eth0. Com isso, a eth0 passará responder, na rede, pelo endereço IP 10.0.0.20. Em conseqüência, não deverá haver uma configuração individual da eth0. Caso a sua rede possua DHCP, a configuração ficará assim:

auto lo
iface lo inet loopback

auto br-xen

iface br-xen inet dhcp
        bridge_ports eth0
        bridge_maxwait 0


3. Configuração dos volumes lógicos (LVM)
# apt-get install lvm2
# pvcreate /dev/hda5
# vgcreate vm /dev/hda5
- 01 partição raiz, denominada vm1.raiz, com 15 GB, para a 1ª VM;
- 01 partição de swap, denominada vm1.swap, com 200 MB, para a 1ª VM;
- 01 partição raiz, denominada vm2.raiz, com 5 GB, para a 2ª VM;
- 01 partição para spool de e-mail, denominada vm2.mail, com 30 GB, para a 2ª VM;
- 01 partição de swap, denominada vm2.swap, com 300 MB, para a 2ª VM.

Obs: os valores utilizados são meramente ilustrativos. Os tamanhos reais das partições irão depender da necessidade de cada serviço a ser instalado em cada máquina virtual.

Para criar os citados volumes, utilize os seguintes comandos, respectivamente:

# lvcreate -L15G -n vm1.raiz vm
# lvcreate -L200M -n vm1.swap vm
# lvcreate -L5G -n vm2.raiz vm
# lvcreate -L30G -n vm2.mail vm
# lvcreate -L300M -n vm2.swap vm

Caso deseje criar um volume fracionário, utilize vírgula. Exemplo:

# lvcreate -L5,5G -n vm1.raiz vm

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ão os seguintes dispositivos:

/dev/vm/vm1.raiz
/dev/vm/vm1.swap
/dev/vm/vm2.mail
/dev/vm/vm2.raiz
/dev/vm/vm2.swap
Cabe ressaltar que o Ext3 já vem instalado na grande maioria dos GNU/Linux.
# mkfs.reiserfs /dev/vm/vm1.raiz
# mkswap /dev/vm/vm1.swap



4. Configuração da máquina modelo
# mkdir /modelo

# apt-get 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 com o CD-ROM do Debian, insira o mesmo no leitor de CD e monte a mídia com o comando:

# mount /dev/cdrom /mnt

Em seguida, emita o comando:

 
# debootstrap sarge /modelo file:/mnt

Por último, remova o CD-ROM com o comando # eject. Para utilizar o debootstrap com uma URL, ao invés do CD, execute o comando:
# debootstrap sarge /modelo http://ftp.us.debian.org/debian
# cp -v /etc/apt/* /etc/apt/sources.list /modelo/etc/apt
# cp -v /etc/fstab /etc/hosts
/modelo/etc
# cp
-v /etc/network/interfaces /modelo/etc/network
# cp -av /lib/modules/*xen* /modelo/lib/modules
# 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.
# 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.
# apt-get update
# apt-get install locales
# apt-get install apmd less linuxlogo ntpdate rcconf sendmail mc
# apt-get install -t sarge-backports module-init-tools
# apt-get install reiserfsprogs

Para a versão 4.0, execute:

# apt-get install reiser4progs

Obs: para XFS utilize o pacote xfsprogs; para JFS utilize o pacote jfsutils.
# apt-get clean
# pwconv
# mv /lib/tls /lib/tls.disabled
1:2345:respawn:/sbin/getty 38400 tty1
#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.
alias ls='ls --color=auto'
export TMOUT=1200

Obs: a linha alias irá 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.
# <file system> <mount point> <type>  <options> <dump> <pass>
proc                     /proc                proc       defaults      0             0
/dev/hda1             /                       reiserfs  notail         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. 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 Nr 1, /dev/hda1 será correlacionado com /dev/vm/vm1.raiz. Já o /dev/hda2 será correlacionado com /dev/vm/vm1.swap.
 # umount /proc



5. Configuração das VMs Xen (xenU)

# mount /dev/vm/vm1.raiz /mnt
# cp -av /modelo/* /mnt

# chroot /mnt

# <file system> <mount point> <type>  <options> <dump> <pass>
proc                     /proc                proc       defaults      0             0
/dev/hda1             /                       reiserfs  notail         0             1
/dev/hda2             none                 swap      sw              0             0
127.0.0.1       localhost.localdomain            localhost
10.0.0.21       antares.minharede.com.br    antares

Um outro exemplo. Neste caso, para máquinas que receberão o IP por intermédio de um servidor DHCP:

127.0.0.1       localhost.localdomain    localhost    antares
auto lo
iface lo inet loopback

auto eth0

iface eth0 inet static
        address 10.0.0.21
        netmask 255.0.0.0
        network 10.0.0.0
        broadcast 10.255.255.255
        gateway 10.0.0.200

Caso deseje que a máquina virtual use DHCP, utilize a seguinte configuração:

auto lo
iface lo inet loopback

auto eth0

iface eth0 inet dhcp



6. Configuração da máquina real (xen0) para inicializar as VMs
kernel="/boot/vmlinuz-2.6.16-2-xen-686"
ramdisk="/boot/initrd.img-2.6.16-2-xen-686"
memory=128
root="/dev/hda1 ro"
disk=[ 'phy:/dev/vm/vm1.raiz,hda1,w', 'phy:/dev/vm/vm1.swap,hda2,w' ]
vif=[ 'bridge=br-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 exemplo em pauta, o volume /dev/vm/vm1.raiz será utilizado como hda1 (dentro da máquina virtual) e o volume /dev/vm/vm1.swap será utilizado como hda2. É importante notar que essa linha deve obedecer às especificações inseridas anteriormente em /mnt/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 (não deverá existir outro igual dentro da rede). É interessante utilizar o endereço ac:de:48:XX:XX:XX (trocando-se os XX), uma vez que essa é uma faixa reservada para uso privado, conforme especificado pelo IEEE (http://standards.ieee.org/regauth/oui/oui.txt). Também é possível utilizar o endereço MAC 00:16:3e:XX:XX:XX, que é reservado para a Xensource Inc (também conforme o IEEE). Para declarar o MAC, utilize a entrada mac, como no exemplo mostrado a seguir:

vif=[ 'mac=ac:de:48:00:00:01, bridge=br-xen' ]

Caso não seja definido um endereço MAC, uma seqüência aleatória (
00:16:3e:XX:XX:XX) será gerada quando a máquina virtual inicializar.



7. Inicialização das VMs Xen (xenU)
# xm create -c vm1

Obs: após realizar o primeiro login, altere a senha de root com o comando # passwd root. A chave -c força a disponibiização de um console durante o boot e após o mesmo. Para realizar um "boot em background", omita a chave -c.
# xm console vm1



8. Disponibilização de mídias removíveis para o DomU
# <file system> <mount point> <type>  <options>         <dump> <pass>
proc                     /proc                proc       defaults             0             0
/dev/hda1             /                       reiserfs  notail                0             1
/dev/hda2             none                 swap      sw                     0             0
/dev/hdc               /mnt                 iso9660  ro,user,noauto  0             0
kernel="/boot/vmlinuz-2.6.16-2-xen-686"
ramdisk="/boot/initrd.img-2.6.16-2-xen-686"
memory=128
root="/dev/hda1 ro"
disk=[ 'phy:/dev/vm/vm1.raiz,hda1,w', 'phy:/dev/vm/vm1.swap,hda2,w', 'phy:/dev/hdc,hdc,ro' ]
vif=[ 'bridge=br-xen' ]



9. Automatização do boot das VMs
# cd /etc/xen/auto
# ln -s /etc/xen/vm1



10. Comandos úteis para manipular as VMs (xenU)
# xm shutdown -H vm1
# xm reboot vm1
# 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 porderá causar danos, como o corrompimento de filesystem e a perda de dados.
# 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 durate shutdown ou crash da máquina.
# xm top
# xm pause vm1
# xm unpause vm1
# xm mem-set vm1 256



11. Comandos úteis para manipular grupos e volumes lógicos

# pvs
# pvremove /dev/hda5
# vgs
# vgremove vm
# lvs
# lvremove /dev/vm/teste2
# lvrename /dev/vm/teste /dev/vm/teste2
# lvresize -L -5G /dev/vm/vm1.raiz

Obs: ao redimensionar um volume lógico, parte do filesystem (caso exista) será perdido. Se não houver dados ou filesystem, bastará formatar o volume lógico (# mkreiserfs /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á redimensinar o filesystem. Para cada tipo de filesystem, haverá um comando próprio para essa ação. No caso do ReiserFS, o comando será # resize_reiserfs -s 5G /dev/vm/vm1.raiz. É importante ressaltar que o redimensionamento do filesystem também poderá provocar a perda de dados.



12. Erros comuns
Obs: em caso de erros, verifique o log /var/log/xend.log.



13. Checagem e correção de filesystem nas VMs
# reiserfsck /dev/<volume lógico>

Exemplo:

# reiserfsck /dev/vm/vm1.raiz

Obs: utilize o comando de checagem específico para cada tipo de filesystem.



14. Desligamento da máquina real



15. Bugs observados



17. Referências e suporte técnico
# lvm help
# xm help
Xen v3.0 User's Manual
Debian Sid gets Xen 3.0
Xen 3 for Debian
Xen, the virtual machine monitor
Xen - Site oficial
Paravirtualization
Xen FAQ
Xen: enterprise grade open source virtualization (white paper)
Xen: enterprise grade open source virtualization (vídeo on-line)
LVM2 Resource Page
LVM HowTo
Entendendo e configurando o LVM manualmente
Digital Hermit - LVM
Logical Volume Manager
Xen-Announce
Xen-Users
Xen-BR
LVM (Lista da RedHat)
Servidor: news.gmane.org

Grupos disponíveis:

- gmane.comp.emulators.xen.announce
- gmane.comp.emulators.xen.user
- gmane.linux.lvm.general

Servidor: irc.freenode.net

Canais disponíveis:

- ##xen (obs: é com duas cerquilhas mesmo...)
- #xen-br (obs: canal brasileiro)
- #lvm




Desde 31 Mai 06:

Free Hit Counter
Free Hit Counter


Descobrindo o Linux
Conheça o livro
Descobrindo o Linux
de João Eriberto Mota Filho

"Ideal para universitários e autodidatas"


isca-digital@yahoogrupos.com.br