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
- Xen On Ubuntu Binary Install: https://help.ubuntu.com/community/XenOnUbuntuBinaryInstall
- The Perfect Xen 3.0.1 Setup For Debian: http://www.howtoforge.com/perfect_setup_xen3_debian
- Create a Debian VM with debootstrap: http://www.option-c.com/xwiki/Create_a_Debian_VM_with_debootstrap
Marcelo Veiga Neves < marcelo.veiga at gmail.com >
