Criação de um Cluster de Máquinas Virtuais com Xen e Live Migration

De Wiki do Veiga

Tabela de conteúdo

Introdução

Xen é um sistema de virtualização, com suporte a diversas arquiteturas, que permite a criação e execução de múltiplas máquinas virtuais, simultaneamente, sobre um mesmo hardware. Xen foi originalmente desenvolvido como um projeto de pesquisa na Universidade de Cambridge e atualmente é mantido pela empresa Citrix System Inc., com código-fonte aberto. Entre as principais características de Xen, podem-se citar o suporte a migração de máquinas virtuais sem interromper a execução das mesmas, também conhecido como live migration.

Este texto contém os procedimento para criação de um cluster de máquinas virtuais com suporte a migração utilizando Xen. Os procedimentos aqui apresentados foram realizados nos laboratórios do GPPD/UFRGS durante a elaboração da minha dissertação de mestrado.

Instalação

Instalação do Sistema Hospedeiro (Dom0)

Para os testes iniciais foram utilizadas 3 máquinas da sala 207 do GPPD/UFRGS (cascao, tina e sansao) em todos foi instalado Ubuntu 5.10 Breezy Badger com a opção de boot server (para instalar somente um sistema básico sem interface gráfica). A versão do kernel instalado foi a 2.6.12-9-386.

Se o apt não foi corretamente configurado durante a instalação, deve-se editar o arquivo /etc/apt/source.lst (linha que fala sobre cdrom deve ser comentada). Após instalada, foram executados os seguintes comandos para atualizar o sistema.

apt-get update
apt-get upgrade

Instalação do serviço ssh:

apt-get install ssh

O próximo passo foi a instalação de Xen. Primeiramente, é necessário instalar algums pré-requisitos para o Xen:

apt-get install iproute python python-twisted bridge-utils

A última versão de Xen pode ser obtida em http://www.xensource.com/download/ (neste exemplo, utilizou-se a versão binária 3.0.4).

tar xzf xen-3.0.4_1-install-x86_32.tgz
cd dist
sh install.sh

Gerar as dependências de módulos (modules.dep):

ls /lib/modules/ | grep xen
2.6.16.33-xen
/sbin/depmod -a 2.6.16.33-xen

Criar um initrd e configurar o grub para dar boot com o kernel modificado do Xen:

cd /boot
mkinitramfs -o initrd.img-2.6.16.33-xen 2.6.16.33-xen

ls | grep xen
config-2.6.16.33-xen
initrd.img-2.6.16.33-xen
System.map-2.6.16.33-xen
vmlinux-syms-2.6.16.33-xen
vmlinuz-2.6.16.33-xen
vmlinuz-2.6.16-xen
vmlinuz-2.6-xen
xen-3.0.4-1.gz
xen-3.0.gz
xen-3.gz
xen.gz
xen-syms-3.0.4-1

Adicionar as seguintes linhas no /boot/grub/menu.lst:

title           Xen 3.0 / XenLinux 2.6 
kernel          /boot/xen-3.gz dom0_mem=128M
module          /boot/vmlinuz-2.6-xen root=/dev/hda1 ro
module          /boot/initrd.img-2.6.16.33-xen
savedefault
boot

Reboot!

Iniciar os serviços do Xen:

update-rc.d xend defaults 20 21
update-rc.d xendomains defaults 21 20
/etc/init.d/xend start
/etc/init.d/xendomains start

Instalação/Criação das Máquinas Virtuais (DomU):

Criação de dois diretórios, um para armazenar as imagens e outro para servir como ponto de montagem.

mkdir -p /vserver/vm_base
mkdir -p /vserver/images

Criação das imagens de servirão como modelo:

dd if=/dev/zero of=/vserver/images/vm_base.img bs=1024k count=1000
dd if=/dev/zero of=/vserver/images/vm_base-swap.img bs=1024k count=500

Formatar as imagens, uma como ext3 e outra como swap:

mkfs.ext3 /vserver/images/vm_base.img (responder a pergunta com y)
/vserver/images/mail.img is not a block special device.
Proceed anyway? (y,n) <-- y

mkswap /vserver/images/vm_base-swap.img

Montar a imagem para iniciar a instalação com debootstrap:

mount -o loop /vserver/images/vm_base.img /vserver/vm_base

Instalar o sistema básico:

apt-get install debootstrap
debootstrap --arch i386 sarge /vserver/vm_base/ http://ftp.br.debian.org/debian

Utilizar chroot para efetuar as configurações necessárias:

chroot /vserver/vm_base
apt-setup
apt-get update

Configurar locales e time zone:

apt-get install locales
tzconfig

Instalar module-init-tools para permitir o carregamento de módulos (se isso não for feito, não é possível utilizar carregar os módulos do NFS futuramente):

apt-get install module-init-tools

Editar hostname e hosts: </pre> echo vm01 > /etc/hostname echo "127.0.0.1 localhost.localdomain localhost" > /etc/hosts </pre>

Editar /etc/fstab (deve parecer com isso):

/dev/hda1               /               ext3    defaults        1       2
/dev/hda2               none            swap    sw            0       0
/dev/pts                devpts          gid=5,mode=620    0       0
none                    /dev/shm        tmpfs   defaults     0       0

Editar /etc/network/interfaces para usar DHCP (deve parecer com isso):

auto lo
iface lo inet loopback
        address 127.0.0.1
        netmask 255.0.0.0

auto eth0
iface eth0 inet dhcp

Obs: mesmo que a máquina dom0 use eth1, a imagem deve conter eth0.

Copiar os módulos do kernel para a imagem:

exit
cp -dpR /lib/modules/`uname -r` /vserver/vm_base/lib/modules/
umount /vserver/vm_base/

Copiar as imagens modelo para ser utilizada:

cp -pf /vserver/images/vm_base.img /vserver/images/vm01.img
cp -pf /vserver/images/vm_base-swap.img /vserver/images/vm01-swap.img

Criar um arquivo de descrição da imagem:

name="vm01"
kernel="/boot/vmlinuz-2.6-xen"
root="/dev/hda1"
memory=64
disk=['file:/vserver/images/vm01.img,hda1,w','file:/vserver/images/vm01-swap.img,hda2,w']

# network
vif=[ '' ]
#vif=['bridge=br-xen1']
dhcp="off"
ip="192.168.0.101"
netmask="255.255.255.0"
gateway="192.168.0.1"
hostname="vm01.example.com"

extra="3"

Obs: os discos devem ter os mesmos nomes utilizados no /fstab da imagem.

Iniciar a máquina virtual:

xm create -c /vserver/images/vm01.sxp

Caso ocorra o segunte erro durante a inicialização, utilizar a solução apresentada em http://wiki.xensource.com/xenwiki/DebianSarge:

INIT: Entering runlevel: 5
INIT: Id "1" respawning too fast: disabled for 5 minutes
...
INIT: Id "6" respawning too fast: disabled for 5 minutes
INIT: no more processes left in this runlevel

Solução do erro anterior:

mount -o loop /vserver/images/vm01.img /vserver/vm_base
cd /vserver/vm_base/dev
./MAKEDEV tty1 tty2 tty3 tty4 tty5 tty6
cd /
umount /vserver/vm_base

Após a inicialização correta da máquina virtual, basta logar como root (não é necessário senha), instalar o ssh e alterar a senha:

apt-get update
apt-get install ssh
passwd

Criação de um Cluster de Máquinas Virtuais

Configuração de Nomes

Como as máquinas virtuais foram configuradas com DHCP e podem ter IPs diferentes cada vez que forem reiniciadas é necessário configurar os nomes das máquinas na rede. Para isso, deve-se alterar o arquivo /etc/dhclient.conf (ou etc/dhcp3/dhclient.conf) para enviar o hostname, por exemplo:

send host-name "vm01";

Configuração do NFS

Xen não possui migração de sistemas de arquivos, desta forma, é necessário ter NFS (ou outro sistema de arquivos distribuido) para permitir que o sistema possa ser migrado e os arquivos estejam automaticamente em outra máquina.

Instalar o NFS no servidor (neste caso, utilizou-se um servidor Gentoo):

emerge net-fs/nfs-utils

Criar o diretório home a ser exportado, por exemplo:

mkdir -p /export/home/veiga
chown veiga /export/home/veiga

Editar o arquivo /etc/exports:

/export/home vm01.inf.ufrgs.br(rw,no_root_squash,sync)
/export/home vm02.inf.ufrgs.br(rw,no_root_squash,sync)
/export/home vm03.inf.ufrgs.br(rw,no_root_squash,sync)
...

Reiniciar o serviço:

/etc/init.d/nfs restart

Nos clientes (virtuais machines), deve-se instalar o nfs:

apt-get install nfs-common

Editar o /etc/fstab para sobre escrever o /home, incluir a linha (neste exemplo, jupiter é o nome do servidor nfs):

jupiter:/export/home    /home    nfs  rsize=1024,wsize=1024 0    0

Configurar SSH

Configurar SSH para funcionar sem senha. Isso é necessário para o MPI funcionar corretamente. Em uma das máquinas virtuais, fazer (como usuário normal):

$ ssh-keygen -t rsa (dar ENTER em tudo)
$ ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

Instalação de LAM/MPI

A última versão de LAM/MPI pode ser obtida em http://www.lam-mpi.org/download (neste exemplo, utilizou-se a versão 7.1.2). Antes de instalar LAM/MPI é necessário instalar alguns pre-requisitos:

apt-get install bzip2 gcc g77 libc6-dev g++ make

A instalação básica de LAM/MPI pode ser feita do seguinte modo:

tar xjf lam-7.1.2.tar.bz2
cd lam-7.1.2
./configure --without-fc --with-threads=posix
make all
make install

Instalação da HPL

Antes de instalar a HPL é necessário ter a Atlas:

apt-get install atlas3-base-dev

A última versão de HPL pode ser obtida em http://www.netlib.org/benchmark/hpl (neste caso, utilizou-se a versão HPL 1.0a). O procedimento de instalação é descrito a seguir.

Descompactar o pacote:

tar -xzf hpl.tgz
cd hpl

Copiar um dos makefiles do diretório ./setup e modificar de acordo com ambiente:

cp setup/Make.Linux_PII_CBLAS .

Editar o Makefile para funcionar com as bibliotecas MPI a Atlas instaladas na máquina virtual:

MPdir        = /usr/local/
MPinc        = -I$(MPdir)/include
MPlib        = $(MPdir)/lib/libmpi.a \
$(MPdir)/lib/liblam.a \
/usr/lib/libdl.so \
/usr/lib/libpthread.so

...

LAdir        = /usr/lib
LAinc        =
LAlib        = $(LAdir)/libcblas.a $(LAdir)/libatlas.a

Migração de Máquinas Virtuais

Para permitir que máquinas sejam migragadas é necessário que as imagens .img estejam disponíveis em todas as máquinas por NFS. Então, foram copiadas todas para o diretorio /export/home/veiga/vmdisks/ do servidor NFS. Depois, os arquivos de descrição das máquinas virtuais (.sxp) foram modificados para acessar correamente as imagens, por exemplo:

...
disk=['file:/home/veiga/vmdisks/vm01.img,hda1,w','file:/home/veiga/vmdisks/vm01-swap.img,hda2,w']
...

O próximo passo foi editar o arquivo /etc/xen/xend-config.sxp para permitir ativar o servidor de migração. Os campos modificados foram:

(xend-relocation-server yes)
(xend-relocation-port 8002)
(xend-relocation-address '')
(xend-relocation-hosts-allow '')

Para migrar um VM para outro nó:

xm migrate --live vm01 sansao

Instalação no Debian

Após a instalação do sistema, deve-se incluir o suporte a pacotes //testing// no /etc/apt/source.list:

deb ftp://ftp.br.debian.org/debian/ testing main
deb-src ftp://ftp.br.debian.org/debian/ testing main

E atualizar o sistema:

apt-get update
apt-get upgrade

Instalação:

apt-get install xen-linux-system-2.6.18-3-xen-686 xen-utils-3.0.3-1 xen-ioemu-3.0.3-1 xen-docs-3.0 bridge-utils libc6-xen file

Caso ocorra o erro "Error 13 : Invalid or unsupported Executed Format" durante boot com o novo kernel Xen instalado, deve-se incluir o xen-3.0.3-1-i386.gz na entrada do kernel Xen no /boot/grub/menu.lst. A entrada do kernel Xen deve se parecer com isso:

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

Criar uma ponte para ethX chamada br-xen no /etc/network/interfaces:

# The loopback network interface
auto lo
iface lo inet loopback

# This is a list of hotpluggable network interfaces.
# # They will be activated automatically by the hotplug subsystem.
mapping hotplug
       script grep
       map eth1

# The primary network interface
#auto eth1
#iface eth1 inet dhcp

auto br-xen
iface br-xen inet dhcp
      bridge_ports eth1
      brigde_maxwait 0

Isso também é a solução para o erro "Error: Device 0 (vif) could not be connected. Backend device not found.".

As imagens utilizadas foram as mesmas da instalação anterior. Deve-se apenas alterar o nome do kernel no arquivo.sxp.

Dminuir o tamanho de memória reservada para o Dom0 no arquivo /etc/xen/xend-config.sxp.

(dom0-min-mem 64)

Isso também corrige o seguinte erro de inicalização de VM:

Error: I need 131072 KiB, but dom0_min_mem is 200704 and shrinking to 200704 KiB
would leave only 39380 KiB free.

Após cada ajuste no /etc/xen/xend-config.sxp, deve-se reinicar o xend:

/etc/init.d/xend restart

Caso ocorra o erro "Device 769 (vbd) could not be connected. Hotplug scripts not working." ou "Error: Device 769 (vbd) could not be connected. Backend device not found." é necessário criar novos //loop devices//:

for i in $(seq 0 7) ;  do mknod /dev/loop$i b 7 $i ;done
chmod 664 /dev/loop* 
chown 0.disk /dev/loop*

Referências


Marcelo Veiga Neves < marcelo.veiga at gmail.com >

Ferramentas pessoais