HOWTO Xen 3 – Debian Etch

Esta contribuição está participando do sorteio da Mochila Targus Matrix. Envie seu texto e participe você também, você contribui com outros usuários e ainda pode faturar uma mochila novinha em folha para o seu laptop. Saiba mais sobre como participar.

Sobre o Autor:

Fabricio Vaccari Constanski (fvc) || Linux User 295747
fabriciovc[em]gmail.com || http://www.fabriciovc.eti.br

Introdução

Xen é um monitor de máquinas virtuais de código aberto. Ele foi desenvolvido com a capacidade de executar até 100 (cem) sistemas operacionais em um único computador. Ele segue o conceito de para-virtualização, onde um mesmo hardware (fisico) é compartilhado entre várias instalações de linux, onde as mesmas trabalham de maneira totalmente individual, apenas utilizando o mesmo kernel da máquina real em todas as máquinas virtuais.

Aproveito também para indicar a leitura do tutorial de João Eriberto Mota Filho (1), que ajuda bastante o entendimento do uso do XEN, incluindo opções de uso com LVM (item que eu não abordo aqui). Vamos às etapas:

Instalação do Debian

Crie uma instalação limpa (vanilla) do Debian Etch. Selecione apenas os pacotes básicos do sistema ou outros pacotes que lhe sejam necessários.

Caso você tenha duvidas neste processo, poderá consultar o manual oficial de instalação do Debian Etch GNU/Linux em http://www.debian.org/releases/stable/i386/.

Atualizando o sistema

Antes de continuarmos vamos atualizar o sistema recém instalado.

Configure seu apt (sources.list) da seguinte forma:

# /etc/apt/sources.list

deb ftp://ftp.br.debian.org/debian etch main contrib non-free
deb ftp://ftp.br.debian.org/debian etch-proposed-updates main contrib non-free
deb http://security.debian.org/ etch/updates main contrib non-free

Salve o arquivo, atualize a lista de pacotes do repositório e atualize a distro.

root@maq_etch_real:~# apt-get update
root@maq_etch_real:~# apt-get dist-upgrade

Instalando alguns pacotes extras

Instale os seguinte pacotes extras:

* apmd
* less
* ntpdate
* rcconf
* vim
* vim-scripts
* ctags

root@maq_etch_real:~# apt-get install

Outras configurações

Precisamos renomear o diretório /lib/tls para que o mesmo permaneça desabilitado. O TLS (Thread Local Storage) pode causar lentidão no XEN. É por isso que o desabilitamos.

root@maq_etch_real:~# mv /lib/tls /lib/tls.disabled

Instalação do Xen

Instale os seguintes pacotes:

* xen-hypervisor-3.0.3-1-i386
* xen-utils-3.0.3-1
* xen-docs-3.0
* xen-tools

root@maq_etch_real:~# apt-get install

Instalação do Kernel XEN

Após o sistema e o XEN prontos, precisamos agora preparar o kernel XEN para o boot. Para isso, vamos instalar o kernel XEN disponível no repositório do debian. Atualmente, o pacote está disponível para a versão 2.6.18-5 (686), versão atual do kernel linux do Debian Etch.

* linux-image-2.6.18-5-xen-686
* linux-modules-2.6.18-5-xen-686

Note que esta versão, disponível no repositório, é para processadores 686 e compatíveis, caso você possua um processador AMD (K7), essa versão do kernel não irá funcionar.

Existe um repositório backport com algumas outras versões de kernel, inclusive o XEN, incluindo AMD. Claro, por serem pacotes backports, não estão disponíveis no repositório oficial. Caso esse seja sua situação, com a minha, acrescente o repositório backport no sources.list e atualize a lista de pacotes.

# /etc/apt/sources.list
deb http://puga.vdu.lt/debian etch main
deb-src http://puga.vdu.lt/debian etch main

root@maq_etch_real:~# apt-get update

Neste repositório, você vai encontrar vários pacotes do kernel linux disponíveis para 686 e para K7. Recomendo instalar os pacotes oficiais para 686, mas para a K7, os pacotes disponíveis atualmente no repositório backport, que inclusive estão funcionando perfeitamente aqui são:

* linux-image-2.6.18-3-xen-k7
* linux-modules-2.6.18-3-xen-k7

root@maq_etch_real:~# apt-get install

Nota: Aqui na minha máquina, possuo 1G de memória RAM, porem depois que reiniciei a máquina com o kernel XEN, foi detectado apenas 712M. Isso é por questões de uso de memória entra a máquina real e a XEN. De acordo com a documentação oficial, a memória utilizada pela máquina real não pode ser utilizada pelas virtuais, com isso, temos
aproximadamente 384M de memória disponível para as duas máquinas virtuais que iremos criar.

Configurando o Grub

Bom, instalado a versão do kernel linux com suporte a XEN, podemos conferir se o grub foi atualizado com sucesso. Normalmente ele é atualizado automaticamente.

Veja exemplo do /boot/grub/menu.lst a seguir.

# /boot/grub/menu.lst

default 0
timeout 5
color cyan/blue white/blue

title Debian GNU/Linux, kernel 2.6.18-3-xen-k7 / Xen 3.0.3-1-i386
root (hd0,0)
kernel /xen-3.0.3-1-i386.gz
module /vmlinuz-2.6.18-3-xen-k7 root=/dev/hda3 ro console=tty0
module /initrd.img-2.6.18-3-xen-k7
savedefault

title —-
root (hd0,0)

title Debian GNU/Linux, kernel 2.6.18-5-k7
root (hd0,0)
kernel /vmlinuz-2.6.18-5-k7 root=/dev/hda3 ro
initrd /initrd.img-2.6.18-5-k7
savedefault

Com isso, a instalação e a configuração do grub está concluída. Reinicie a máquina e carregue o kernel linux com o suporte ao XEN que você acabou de adicionar.

Como citado anteriormente, aqui estaremos com uma limitação de memória RAM devido a reserva da mesma para as máquinas virtuais. De acordo com pesquisas, encontrei essas possibilidades a seguir a serem colocanas no grub, porém, não foram testadas.

# /boot/grub/menu.lst

kernel /xen-3.0.3-1-i386.gz dom0_mem=131072
module /vmlinuz-2.6.18-3-xen-k7 root=/dev/hda3 ro console=tty0 mem=1G

Configurando a rede

Outro item importante é configurar a rede do seu sistema real para que possa atender a rede da máquina virtual. Para isso, altere o arquivo /etc/network/interfaces e o deixe da seguinte maneira:

# /etc/network/interfaces

auto lo
iface lo inet loopback

auto xen
iface xen inet static
address 10.0.15.2
netmask 255.255.255.0
network 10.0.15.0
broadcast 10.0.15.255
gateway 10.0.15.120
bridge_ports eth0
bridge_maxwait 0

Note que no parâmetro bridge_ports estamos relacionando a bridge de rede com a placa eth0. Caso você possua mais placas de rede, relacione à placa correspondente.

Caso esta placa de rede trabalhe com endereçamento dinâmico (dhcp), a configuração fica da seguinte maneira:

# /etc/network/interfaces

auto lo
iface lo inet loopback

auto xen
iface xen inet dhcp
bridge_ports eth0
bridge_maxwait 0

Criando a máquina virtual XEN

Aqui iremos mostrar os passos da criação de uma máquina virtual Debian Etch GNU/Linux e um Mandriva 2007 Spring, ou seja, após a conclusão dessas etapas, estaremos com três máquinas operando simultânemanente. Uma máquina real e duas máquinas virtuais.
Criando a máquinas virtual XEN Debian 4.0

O comando a seguir está incluso no pacote xen-tools. Elel irá criar uma máquina virtual Debian etch em um arquivo local (.img) para ser iniciado pelo XEN. Crie um arquivo script com as informações a seguir. Altere as opções desejadas e execute o mesmo para que a máquina seja criada.

Este comando irá criar a máquina virtual em um arquivo, juntamente com um arquivo swap. Essas duas imagens serão criadas em /home/xen/domains/etch/arquivos.img já configuradas com nome de máquina, ip, tamanho, etc.

# /etc/xen/xen-create-image.sh

xen-create-image \
–initrd /boot/initrd.img-2.6.18-3-xen-k7 \
–kernel /boot/vmlinuz-2.6.18-3-xen-k7 \
–memory 128Mb \
–swap 256Mb \
–size 2Gb \
–image sparse \
–fs xfs \
–dist etch \
–debootstrap \
–mirror ftp://ftp.br.debian.org/debian \
–ip 192.168.0.10 \
–netmask 255.255.255.0 \
–gateway 192.168.0.10 \
–dir /home/xen \
–passwd \
–hostname etch

Nota: Para maiores informações sobre os parâmetros do comando xen-create-image, execute:

root@maq_etch_real:~# xen-create-image –help

Executando o script recém criado para a criação da máquina virtual.

root@maq_etch_real:~# chmod u+x /etc/xen/xen-create-image.sh
root@maq_etch_real:~# /etc/xen/xen-create-image.sh

Ajustes necessários

Após a instalação, teremos as imagens em /home/xen (como já falado) e ainda o arquivo com as configurações da máquina virtual para que a mesma funcione corretamente. Este arquivo está no diretório /etc/xen/etch.cfg.

Um exemplo do mesmo esta mostrado a seguir, já com as alterações necessárias para que a máquina funcione perfeitamente.

# /etc/xen/etch.cfg

kernel = ‘/boot/vmlinuz-2.6.18-3-xen-k7’
ramdisk = ‘/boot/initrd.img-2.6.18-3-xen-k7’

memory = ‘128’

root = ‘/dev/sda1 ro’
disk = [ ‘file:/home/xen/domains/etch/disk.img,sda1,w’,
‘file:/home/xen/domains/etch/swap.img,sda2,w’ ]

name = ‘etch’

# Altere esta opção
vif = [ ‘bridge=xen’ ]

on_poweroff = ‘destroy’
on_reboot = ‘restart’
on_crash = ‘restart’

Criando a máquinas virtual XEN Mandriva 2007 Spring

Esta parte do howto foi baseado no manual oficial da Mandriva descrito no wiki da mesma (2).

Nota: É necessário estar em uma máquina do mandriva 2007 spring para que esses passos possam realizados de maneira correta, pois o sistema base é usado para a geração da máquina virtual.

Primeiramente precisamos criar um arquivo .img que irá armazenar a nossa instalação virtual do Mandriva 2007 Spring. Netsa etapa, iremos criar dois arquivos. O primeiro será o arquivo que conterá o sistema instaldo (raiz – /) e o outro, a área de swap.

Criando e formatandos os arquivos de imagem

Iniciamos então com a criação dos arquivos de imagens.

root@maq_mdv_real:~# mkdir -p /home/xen/domains/mdv2007.1
root@maq_mdv_real:~# dd if=/dev/zero
of=/home/xen/domains/mdv2007.1/disk.img bs=1024 count=2097152
root@maq_mdv_real:~# dd if=/dev/zero
of=/home/xen/domains/mdv2007.1/swap.img bs=1024 count=262144

E claro, não podemos esquecer de formatá-las.

root@maq_mdv_real:~# mkfs.ext3 /home/xen/domains/mdv2007.1/disk.img
root@maq_mdv_real:~# mkfs.swap /home/xen/domains/mdv2007.1/swap.img

Preparando o ambiente

Primeiramente vamos criar uma variável de ambiente para que possamos usá-la no decorrer do processo.

root@maq_mdv_real:~# export raizvirtual=/mnt/disk.img

Agora vamos criar o ponto de montagem e montar o arquivo de imagem que será utilizada para a instalação da máquina virtual.

root@maq_mdv_real:~# mkdir -p $raizvirtual
root@maq_mdv_real:~# mount -o loop
/home/xen/domains/mdv2007.1/disk.img $raizvirtual

Instalando a máquina virtual com Urpmi

Primeiramente, vamos criar um repositório RPM na máquina local:

Um exemplo desta criação é:

root@maq_mdv_real:~# urpmi.removemedia -a
root@maq_mdv_real:~# urpmi.addmedia main
ftp://mirror.cricyt.edu.ar/MandrivaLinux/official/2007.1/i586/media/main/release
root@maq_mdv_real:~# urpmi.addmedia –update main_updates
ftp://mirror.cricyt.edu.ar/MandrivaLinux/official/2007.1/i586/media/main/updates
root@maq_mdv_real:~# urpmi.addmedia contrib
ftp://mirror.cricyt.edu.ar/MandrivaLinux/official/2007.1/i586/media/contrib/release
root@maq_mdv_real:~# urpmi.addmedia –update contrib_updates
ftp://mirror.cricyt.edu.ar/MandrivaLinux/official/2007.1/i586/media/contrib/updates

Agora podemos criar a estrutura de instalação RPM para a máquina virtual.

root@maq_mdv_real:~# mkdir -p $raizvirtual/var/lib/rpm
root@maq_mdv_real:~# rpm –initdb –root $raizvirtual

Em seguida, o comando para a instalação do mandriva na máquina virtual.

root@maq_mdv_real:~# urpmi –root $raizvirtual basesystem urpmi

Copiando e criando arquivos necessários

Instalado o sistema base na máquina virtual, vamos copiar mais alguns arquivos necessários para que a máquina virtual funcione corretamente.

root@maq_mdv_real:~# cp /etc/resolv.conf $raizvirtual/etc
root@maq_mdv_real:~# cp /etc/fstab $raizvirtual/etc
root@maq_mdv_real:~# cp /etc/sysconfig/network-scripts/ifcfg-eth0
$raizvirtual/etc/sysconfig/network-scripts

Em seguida, alteramos a raiz do sistema para a raiz do sistema virtual

root@maq_mdv_real:~# chroot $raizvirtual

E criamos alguns arquivos necessários

root@maq_mdv_chroot:~# touch /etc/mtab /etc/urpmi/urpmi.cfg
/var/lib/urpmi/MD5SUM

Agora criamos o arquivo de senha do sistema e setamos uma senha para o usuario root.

root@maq_mdv_chroot:~# pwconv
root@maq_mdv_chroot:~# passwd root

Em seguida habilite a rede na máquina virtual editando o arquivo /etc/sysconfig/network e configure a rede da máquina virtual no arquivo /etc/sysconfig/network-scripts/ifcfg-eth0.

# $raizvirtual/etc/sysconfig/network

NETWORKING=yes

# $raizvirtual/etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=static
IPADDR=10.0.15.4
NETMASK=255.255.255.0
NETWORK=10.0.15.0
BROADCAST=10.0.15.255
GATEWAY=10.0.15.120
DNS1=10.0.15.120
ONBOOT=yes
METRIC=10
MII_NOT_SUPPORTED=yes

Antes de finalizarmos, precisamos alterar o arquivo /etc/fstab da máquina virtual para que a mesma seja carregada de maneira correta no XEN.

# $raizvirtual/etc/fstab

/dev/sda1 / ext3 defaults 0 2
proc /proc proc rw,nodev,nosuid,noexec 0 0
/dev/sda2 none swap sw 0 0

Por fim, saia do ambiente chroot e desmonte o arquivo de imagem.

root@maq_mdv_chroot:~# exit
root@maq_mdv_real:~# umount $raizvirtual
Ajustes necessários

Por fim, precisamos criar o arquivo de configuração em /etv/xen para que a máquina virtual do mandriva possa ser carregada de maneira correta.

# /etc/xen/mdv2007.1.cfg

kernel = ‘/boot/vmlinuz-2.6.18-3-xen-k7’
ramdisk = ‘/boot/initrd.img-2.6.18-3-xen-k7’

memory = ‘128’

root = ‘/dev/sda1 ro’
disk = [ ‘file:/home/xen/domains/mdv2007.1/disk.img,sda1,w’,
‘file:/home/xen/domains/mdv2007.1/swap.img,sda2,w’ ]

name = ‘mdv2007.1’

# Altere esta opção
vif = [ ‘bridge=xen’ ]

on_poweroff = ‘destroy’
on_reboot = ‘restart’
on_crash = ‘restart’

Problemas com módulos no Mandriva

Um problema que acontece com esse método de instalação do mandriva, é em relação aos módulos do kernel. Como o kernel executado na máquina virtual e na real é o mesmo, o mandriva não terá os módulos do kernel da máquina real. Para isso, você precisa copiar os módulos da máquina real para a virtual. Vamos ao processo.

Primeiramente inicie a máquina virtual do mandriva. Mesmo com erros de módulos, ela será iniciada normalmente. Agora você precisa configurar os repositórios Urpmi na máquina
virtual, como já realizado na máquina mandriva real (explicado anteriormente).

Instale os seguintes pacotes:

* openssh
* openssh-server
* openssh-clients

root@maq_mdv_virtual:~# urpmi

Agora realize a cópia do módulos da máquina real para a virtual.

root@maq_mdv_virtual:~# scp -r
ip_maquina_real:/lib/modules/2.6.18-3-xen-k7/ /lib/modules

Agora apenas reinicie a máquina virtual.

Comando de gerenciamento das máquinas virtuais

Para iniciar uma máquina virtual, execute:

root@maq_etch_real:~# xm create -c maquina_virtual.cfg

A opção “-c” habilita o tty1 após o boot da máquina virtual. Caso você opte por carregar a máquina virtual em background, execute o mesmo comando sem a opção “-c”.

Caso você tenha optado por carregar a máquina com console, para sair desta console sem desabilitá-la, utilize a combinação de teclas: “Ctrl]”.

Para voltar da máquina real para a máquina virtual carregada em background, execute:

root@maq_etch_real:~# xm console maquina_virtual

Nota: Sua máquina virtual é idêntica a uma máquina real. Todos os comandos, arquivos de configuração, etc, funcionam normalmente. A única diferença é que o kernel que está sendo utilizado pela máquina virtual é o mesmo kernel que está sendo utilizado pela máquina real. É ele que possibilita o gerenciamento do mesmo hardware pelas várias
máquinas estanciadas.

Para desligar uma máquina virtual, execute:

root@maq_etch_real:~# xm shutdown -H maquina_virtual

Para reiniciar uma máquina virtual em execução, execute:

root@maq_etch_real:~# xm reboot maquina_virtual

Para desligar uma máquina virtual em execução sem realizar o
sincronismo dos discos, execute:

root@maq_etch_real:~# xm destroy maquina_virtual

Cuidado: Este comando é similar ao uso do “kill -9 PID”, ou seja este comando poderá causar danos à máquina virtual, portanto, só o utilize em casos extremos.

Para listar as máquina(s) virtual(is) em execução, execute:

root@maq_etch_real:~# xm list

Obs: Você vai notar que serão mostradas letras de identificação de estado das máquinas listadas. Essas letras identificam:

* b (blocked): máquina bloqueada
* c (crashed): máquina sofreu um “crash”
* d (dying): máquina saindo do ar. Normalmente ocorre em um desligamento ou “crash”.
* p (paused): máquina pausada
* r (running): máquina em execução
* s (shutdown): máquina em processo de desligamento

Para verificar o uso de recursos de uma máquina virtual em execução, execute:

root@maq_etch_real:~# xm top

Para paralizar uma máquina virtual em execução, execute:

root@maq_etch_real:~# xm pause maquina_virtual

Para desparalizar uma máquina virtual paralizada, execute:

root@maq_etch_real:~# xm unpause maquina_virtual

Para redefinir a quantidade de memória de uma máquina virtual em execução, execute:

root@maq_etch_real:~# xm mem-set maquina_virtual 256

Midias removíveis na máquina virtual

Para isso, apenas acrescente a entrada da unidade removível (ex: cdrom) no /etc/fstab e altere o arquivo de configuração do xen (/etc/xen/maquina.cfg) informando o dispositível móvel a ser disponibilizado.

# /etc/fstab
/dev/sda1 / ext3 defaults 0 2
proc /proc proc rw,nodev,nosuid,noexec 0 0
/dev/sda2 none swap sw 0 0
/dev/hdc /mnt iso9660 ro,user,noauto 0 0

# /etc/xen/maquina_virtual.cfg
disk = [ ‘file:/home/xen/domains/etch/disk.img,sda1,w’,
‘file:/home/xen/domains/etch/swap.img,sda2,w’, ‘phy:/dev/hdc,hdc,ro’ ]

Carregando máquinas virtuais automaticamente

Para carregar as máquinas virtuais automaticamente junto ao boot da máquina real, realize os seguintes comando para cada máquina virtual:

root@maq_etch_real:~# mkdir /etc/xen/auto
root@maq_etch_real:~# cd /etc/xen/auto
root@maq_etch_real:~# ln -s /etc/xen/maquina.cfg

Hardware Utilizado

* Processador: AMD Athlon™ XP 1700+ (1.46 Ghz)
* Memória RAM: 1GB
* Placa Mãe: Asus A7V266 MX
* Disco: 40 GB 7200 RPM Seagate