Archive for the Xen Category

O script anterior foi atualizado contando com algumas melhorias sugeridas pelos seus usuários, como:

- Agora ele é escrito em Inglês, para maior portabilidade com outros usuários do xen ao redor do mundo;

- Você pode fazer backup de somente uma máquina específica, não é mais necessário esperar todo o laço terminar para ver o resultado do mesmo;

- Script parametrizado e funcões sub-divididas e

- Pequenos problemas corrigidos.

#!/bin/bash
# Backup of Xen VM's
# Tiago Cruz - tiagocruz@everlinux.com
# v 1.0	Mar/2008 - Initial version, just backup all VM's
# v 1.1 May/2008 - Now we have functions and parameters
 
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
BACK="_snap"
LOG=/var/log/backup.`date +%Y%m%d`
# root partition to backup ("/")
# usually the second it's swap
ROOT="1"
 
[ ! -d "/mnt/back" ] &&  mkdir -p /mnt/back
[ ! -d "/data/backup" ] &&  mkdir -p /data/backup
 
function showHelp() {
        echo " "        
        echo "Use the following parameters: "
        echo "          help   = Show this help"
        echo "          all    = Backup of all VM's"
        echo "          list   = List all VM's from this domain"
        echo "          <vm>   = Backup one specific VM"
        echo " "
	echo "ex: back_xen.sh tomcat_shop"
        echo " "
	exit 1
}
 
function listVM() {
	echo "List of VM's avaliables:"
	/usr/sbin/xm list | awk '{print $1}' | egrep -v '(Name|Domain-0)'
	echo " "
}
 
function backXen () {
	echo "Backuping machine $i..."
	echo "Please, look the progress on $LOG"
	listVM | grep $i >/dev/null
	if [ $? -ne 0 ]; then
		echo "Machine $i does not exist, aborting!"
		exit 2
	fi	
	backup
	if [ $? -eq 0 ]; then
                echo "Backup of $i completed successfully!!!"
		echo "Backup finalized on `date` with load `cat /proc/loadavg | cut -c 1-14`" >> $LOG
		echo "==============================================" >> $LOG
		echo "==============================================" >> $LOG
        fi
}
 
function backAll () {
	VMS=`xm list | awk '{print $1}' | egrep -v '(Name|Domain-0)'`
	for i in $VMS; do
		backup
	done
	echo "Backup finalized on `date` with load `cat /proc/loadavg | cut -c 1-14`" >> $LOG
	echo "==============================================" >> $LOG
	echo "==============================================" >> $LOG
}
 
function backup () {
	echo "==============================================" >> $LOG
	echo "Backup $i started on `date` with load `cat /proc/loadavg | cut -c 1-14`" >> $LOG
	DEVICE=`grep ^disk /etc/xen/$i | awk -F "Vol_LVM" '{print $2}' | cut -d / -f 2 | cut -d , -f 1`
	echo "Virtual Machine $i uses $DEVICE as storage device" >> $LOG
 
	lvcreate --snapshot -L 15G -n $i$BACK /dev/Vol_LVM/$DEVICE >> $LOG 2>&1
	[ $? -ne 0 ] && echo "Error $i: creating LVM $i$BACK" >> $LOG 
 
	kpartx -a /dev/mapper/Vol_LVM-$i$BACK >> $LOG 2>&1
	mount /dev/mapper/Vol_LVM-$i$BACK$ROOT /mnt/back/ >> $LOG 2>&1
	[ $? -ne 0 ] && echo "Error $i: mounting $i$BACK$ROOT" >> $LOG 
 
	SIZE1=`df -hP /mnt/back/ | awk '{print $3}' | grep -v Used`
	SIZE2=`df -hP /mnt/back/ | awk '{print $2}' | grep -v Size`
	echo "Backup of /dev/mapper/Vol_LVM-$i$BACK$ROOT - $SIZE1 of $SIZE2 used" >> $LOG
	tar zcf /data/backup/$i-xen.tar.gz /mnt/back >> $LOG
	[ $? -ne 0 ] && echo "Error $i: creating /LVM/backup/$i.tar.gz" >> $LOG 
 
	SIZE3=`ls -lh /LVM/backup/$i-xen.tar.gz  | awk '{print $5}'`
	echo "Created /LVM/backup/$i-xen.tar.gz with $SIZE3" >> $LOG
 
	sleep 1
	umount /mnt/back/ >> $LOG 2>&1
	[ $? -ne 0 ] && echo "Error $i: umounting $i$BACK" >> $LOG 
	kpartx -d /dev/mapper/Vol_LVM-$i$BACK >> $LOG 2>&1
	[ $? -ne 0 ] && echo "Error $i: deleting partition mappings $i$BACK" >> $LOG 
 
	echo "Removing snapshot already backuped $i$BACK" >> $LOG
	lvremove /dev/Vol_LVM/$i$BACK -f >> $LOG 2>&1
}
 
if [ "$#" -eq 0 ]; then
	showHelp
 
fi
 
case "$1" in 
	list)	listVM	;;
	all )	backAll	;;
	help)	showHelp ;;
	 *  )  	i=$1; backXen ;;
esac

Caso tenha problemas com o copy-past, você pode pegar o mesmo aqui: back_xen.sh.txt.

Se você usa o Xen, usa Storage Devices sob LVM, e acha importante ter um backup das mesmas, você pode utilizar/ adaptar este pequeno script que tira um snapshot e em seguida faz um “tar.gz” de todo o “/” da sua VM, e a guarda em um local para que você possa restaura-lo caso necessário. :-D

#!/bin/bash
# Backup das VM's do Xen
# Tiago Cruz - tiagocruz@everlinux.com
# Mar/2008
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 
VMS=`xm list | awk '{print $1}' | egrep -v '(Name|Domain-0)'`
BACK="_snap"
LOG=/var/log/backup
# Particao root, geralmente a segunda eh swap
ROOT="1"
 
[ ! -d "/mnt/back" ] &&  mkdir -p /mnt/back
[ ! -d "/dados/backup" ] &&  mkdir -p /dados/backup
 
for i in $VMS; do
        echo "=================================================================" >> $LOG
        echo "Backup $i iniciado em `date` com load de `cat /proc/loadavg`" >> $LOG
        DEVICE=`grep disk /etc/xen/$i | awk -F "Vol_LVM" '{print $2}' | cut -d / -f 2 | cut -d , -f 1`
        echo "Maquina Virtual $i usa $DEVICE como storage device" >> $LOG
 
        lvcreate --snapshot -L 15G -n $i$BACK /dev/Vol_LVM/$DEVICE >> $LOG
        [ $? -ne 0 ] && echo "Erro $i: criando LVM $i$BACK" >> $LOG
 
        kpartx -a /dev/mapper/Vol_LVM-$i$BACK >> $LOG
        mount /dev/mapper/Vol_LVM-$i$BACK$ROOT /mnt/back/ >> $LOG
        [ $? -ne 0 ] && echo "Erro $i: montando $i$BACK$ROOT" >> $LOG
 
        SIZE1=`df -hP /mnt/back/ | awk '{print $3}' | grep -v Used`
        SIZE2=`df -hP /mnt/back/ | awk '{print $2}' | grep -v Size`
        echo "Backup de /dev/mapper/Vol_LVM-$i$BACK$ROOT - $SIZE1 de $SIZE2 usados" >> $LOG
        tar zcf /dados/backup/$i-xen.tar.gz /mnt/back >> $LOG
        [ $? -ne 0 ] && echo "Erro $i: criando /dados/backup/$i.tar.gz" >> $LOG
 
        SIZE3=`ls -lh /dados/backup/$i-xen.tar.gz  | awk '{print $5}'`
        echo "Criado /dados/backup/$i-xen.tar.gz com $SIZE3" >> $LOG
 
        umount /mnt/back/ >> $LOG
        [ $? -ne 0 ] && echo "Erro $i: desmontando $i$BACK" >> $LOG
        kpartx -d /dev/mapper/Vol_LVM-$i$BACK >> $LOG
        [ $? -ne 0 ] && echo "Erro $i: desmapeando $i$BACK" >> $LOG
 
        echo "Removendo snapshot ja backupeado $i$BACK" >> $LOG
        lvremove /dev/Vol_LVM/$i$BACK -f >> $LOG
done
 
echo "Backup finalizado em `date` com load de `cat /proc/loadavg`" >> $LOG
echo "=================================================================" >> $LOG
echo "=================================================================" >> $LOG

Trecho do log:

Backup ora_busca iniciado em Fri Mar 28 05:02:53 BRT 2008 com load de 1.31 1.33 1.21
Maquina Virtual ora_busca usa ora_busca como storage device
Logical volume “ora_busca_snap” created
Backup de /dev/mapper/Vol_LVM-ora_busca_snap1 – 16G de 95G usados
Criado /dados/backup/ora_busca-xen.tar.gz com 4.9G
Removendo snapshot ja backupeado ora_busca_snap
Logical volume “ora_busca_snap” successfully removed

1-) Estou armazenando as VMs no LVM:

# lvcreate -Ay -L 60G -n vm00 Vol_LVM
# lvcreate -Ay -L 60G -n vm01 Vol_LVM
# lvcreate -Ay -L 60G -n vm02 Vol_LVM

2-) Estou usando o “partimage-0.6.7_beta2.tar.bz2″, pois a versão stable não funciona bem em 64 bits:

3-) A primeira VM deve ser instalada/ configurada manualmente/normalmente. Depois você pode tirar uma cópia dela:

# kpartx -a /dev/mapper/Vol_LVM-vm01
# partimage -z1 save /dev/mapper/Vol_LVM-vm01p1 /LVM/vm01p1.partimg.gz

ou
# partimage -z0 -c -d -f0 save /dev/mapper/Vol_LVM-vm01p1 /LVM/vm01p1.partimg
# kpartx -d /dev/mapper/Vol_LVM-vm01

PS: Note que se você usar compressão (-z1) a geração da imagem vai demorar mais para ser criado, porém com o tamanho bem menor (515M vs 3.7GB) . A restauração da mesma também será mais lenta.

4-) Com base na primeira VM:

# fdisk -l /dev/mapper/Vol_LVM-vm00
Disk /dev/mapper/Vol_LVM-vm00: 64.4 GB, 64424509440 bytes
255 heads, 63 sectors/track, 7832 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/mapper/Vol_LVM-vm00p1 * 2 7395 59392305 83 Linux
/dev/mapper/Vol_LVM-vm00p2 7396 7832 3510202+ 82 Linux swap / Solaris

Você poderá preparar um arquivo, por exemplo, /tmp/parttable, com as especificações das demais partições.
1,7394,83,*
7395,,82,-

Estou usando uma partição primária para o raiz “/” (tipo 83) com ~ 60 GB e o restante para swap (tipo 82).

Você poderá usar o sfdisk e especificar os dados em: sectors, blocks, cylinders ou megabytes.

5-) Crie as partições para a segunda VM:

# dd if=/dev/zero of=/dev/mapper/Vol_LVM-vm01 count=1 bs=512
# sfdisk -uC /dev/mapper/Vol_LVM-vm01 < /tmp/parttable

Se preferir, simplesmente faça o processo manualmente:
# fdisk /dev/mapper/Vol_LVM-vm01

6-) Crie a SWAP para o segundo device:

Será necessário usar o "kpartx" para "mapear" as partições que existem dentro do device LVM:

# kpartx -a /dev/mapper/Vol_LVM-vm01
# ll /dev/mapper/Vol_LVM-vm01*
# mkswap /dev/mapper/Vol_LVM-vm01p2

7-) Restaure a imagem da primeira VM:

- Restauração com GZIP:

# partimage restore /dev/mapper/Vol_LVM-vm02p1 /LVM/vm01p1.partimg.gz
Time elapsed: 10m:59sec
Speed: 5.16 GiB/min
Data copied: 56.64 GiB

- Restauração sem GZIP:

# partimage restore /dev/mapper/Vol_LVM-vm03p1 /LVM/vm01p1.partimg.000
Time elapsed: 1m:15sec
Speed: 2.90 GiB/min
Data copied: 3.62 GiB

8-) Monte a VM e troque endereços de IP, hostname e MAC Address:
# mount /dev/mapper/Vol_LVM-vm01p1 /mnt/xen/
# vi /mnt/xen/etc/sysconfig/network-scripts/ifcfg-eth0
# vi /mnt/xen/etc/sysconfig/network
# vi /mnt/xen/etc/hosts

PS: Use o macgen.py para alterar o MAC address:

$ cat macgen.py
#! /usr/bin/python
# macgen.py script generates a MAC address for Xen guests
#
import random
mac = [ 0x00, 0x16, 0x3e,
random.randint(0x00, 0x7f),
random.randint(0x00, 0xff),
random.randint(0x00, 0xff) ]
print ':'.join(map(lambda x: "%02x" % x, mac))

9-) Desmonte a partição, e arrume seu /etc/xen/vm02:

# umount /mnt/xen
# kpartx -d /dev/mapper/Vol_LVM-vm02

Utilize o "uuidgen" para gerar um novo UUID para sua VM.
Não esqueça de trocar também o MAC no campo "vif" e o device LVM, ex:

name = "vm02"
uuid = "82f89076-487e-4de5-ab4a-99ce07c586eb"
maxmem = 1000
memory = 800
vcpus = 1
bootloader = "/usr/bin/pygrub"
on_poweroff = "destroy"
on_reboot = "restart"
on_crash = "restart"
vfb = [ "type=vnc,vncunused=1,keymap=en-us" ]
disk = [ "phy:/dev/Vol_LVM/vm01,xvda,w" ]
vif = [ "mac=00:16:3e:5a:02:a6,bridge=xenbr0" ]

10-) Inicie a VM e corra para o abraço:

# xm create vm02 -c

Em caso de problemas, consulte este artigo: Xen: Dicas rápidas e problemas resolvidos

1-) Problemas com o reconhecimento do disco durante o boot:

“Booting from Hard Disk
Boot from Hard Disk failed: coud not read the boot disk
FATAL: No bootable device”

Verifique qual é o device utilizado em seu arquivo de configuração. Máquinas Para-Virtualizadas geralmente utilizam ‘xvda’:

disk = [ 'phy:/dev/Vol_LVM/xen_01,xvda,w', ]

Máquinas Full-Virtualizadas (HVM) geralmente utilizam-se de ‘hda’ ou ’sda’.

disk = [ 'phy:/dev/Vol_LVM/xen_01,hda,w', ]

Para saber mais sobre os tipos de virtualizações existentes, consulte este post: Falando um pouco sobre Virtualização

2-) Se a sua placa de rede não é reconhecida depois do boot:

Experimente alterar o config da VM de
vif = [ 'mac=00:xx:xx:xx:xx:bc, bridge=xenbr0', ]

Para:
vif = [ 'type=ioemu, mac=00:xx:xx:xx:xx:bc, bridge=xenbr0', ]

Utilizando uma virtualização de um Red Hat 7.2, deu certo e apareceu a tal da Realtek :)

3-) Se o ‘xm console’ não funcionar…

- Altere o /etc/inittab (do guest) da seguinte forma:
...
# Console do Xen
co:2345:respawn:/sbin/agetty xvc0 9600 vt100-nav

# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
...

- Dê um reload no inittab:
# /sbin/init q

- Altere o /etc/securetty para permitir o login de root via console:
...
tty11
xvc0

- Se o device não existir, crie-o:
# mknod /dev/xvc0 c 250 187

4-) Para gerar um UUID para uma nova máquina virtual:

# uuidgen

5-) Para gerar um MAC-ADDRESS para outra máquina virtual:

#! /usr/bin/python
# macgen.py script generates a MAC address for Xen guests
#
import random
mac = [ 0x00, 0x16, 0x3e,
random.randint(0x00, 0x7f),
random.randint(0x00, 0xff),
random.randint(0x00, 0xff) ]
print ':'.join(map(lambda x: "%02x" % x, mac))

Acredite: Seu roteador não vai gostar de encontrar duas máquinas com IP’s diferentes e MAC-ADDRESS iguais… 8-)

Este é um trabalho acadêmico realizado pelos meus alunos do 3 Semestre do curso de Tecnologia em Redes de Computadores, da FAENAC em São Caetano do Sul.

Os alunos fizeram algo muito interessante: Em um notebook P4 com 512 MB de RAM rodando Windows XP, instalaram o Ubuntu Feisty 7.04 dentro de um Vmware, e dentro desta máquina virtual configuraram um Xen para rodar uma para-virtualização do Ubuntu Edgy 6.10.

Uma pena que eles esqueceram de colocar as fontes das consultas, mas eu sei que uma delas foi retirada do Wiki do Ubuntu, a qual eu mesmo escrevi. E antes que eu esqueça, sim eles serão penalizados por esquecerem de citar a fonte! :-)

A apresentação deles está bem recheada de ScreenShoots das configurações, mas você pode usar o Wiki se quiser fazer algo parecido (está mais legível).

Alunos:
Cezimar Nascimento / Diego Carvalho / Jose Wilter Frazão / Josiel Borges e Rodolfo Domingues

Link para download: Apresentação Acadêmica sobre o XEN

Abraços a todos

Uma dica rápida, colaboração do meu amigo Deny C. Luchetti:

Um problema de usar o virt-manager da Red Hat (também presente no Mandriva 2007.1!) para criar e administrar máquinas virtuais é o fato de que você simplesmente não consegue trocar de CD durante a instalação do guest OS, conforme eu havia comentado no artigo anterior sobre o Xen no Red Hat ES 5 :(

O que acontece é uma pequena salada: O Xen não faz a instalação, ele executa uma versão modificada do qemu para faze-lo. E para trocar os CD’s pelo qemu existe um pequeno truque, bem documentado por sinal. O que não bem estava documentado era que o Xen da Red Hat chama o VNC por padrão quando você pede o console da máquina, e infelizmente, as teclas de atalho do qemu não funcionam dentro do VNC. Entendeu? Se não, leia de novo :-p

Para resolver isso, basta desabilitar o VNC no arquivo de configuração gerado pelo virt-manager (nota: o console gráfico continua funcionando, e até mais rápido!), mais ou menos assim:

name = “suse93″
builder = “hvm”
memory = “500″
disk = [ 'phy:/dev/lvm/xen_suse93,hda,w', 'file:/home/dluchetti/suse93.iso,hdc:cdrom,r',]
vif = [ 'type=ioemu, mac=00:16:3e:36:5b:9b, bridge=xenbr1',]
uuid = “e4e85bc7-b244-9d85-ec7a-b06728e6c70c”
device_model = “/usr/lib64/xen/bin/qemu-dm”
kernel = “/usr/lib/xen/boot/hvmloader”
vnc=0
vncunused=0
apic=0
acpi=0
pae=1
vcpus=1
boot=”d”
ne2000=1
serial = “pty”
on_reboot = ‘restart’
on_crash = ‘restart’

E, finalmente, para trocar a ISO do qemu e continuar a instalação, basta fazer assim:

Teclar “CRTL+ALT+2″ (atenção, não é F2!) e digitar:

(qemu) eject cdrom
(qemu) change cdrom /caminho/para/a/segunda/iso/arquivo.iso

Facinho né?
Abraços e boas virtualizações para vocês ;-)

Existe um pequeno truque para instalar corretamente o Windows XP ou o Windows 2003 sob um Hypervisor do Xen (na versão 3.0.3, pelo menos). Na verdade existem dois truques:

- O primeiro é logo na primeira etapa da Instalação, quando ele ainda está na tela de “Detectando Hardware”, algo assim… é logo a primeira tela depois do boot com o CD ou imagem de instalação. Nesse momento, o Xen ainda não entrou em cena, é apenas uma versão modificada do Qemu iniciando a instalação. Mas de qualquer forma, não sei porque raios, a instalação trava em uma tela preta (black screen) e não sai de lá.

Bom, é necessário apertar a tecla F6 e escolher um tipo de computador diferente para o Qemu se ligar e continuar a instalação. Na verdade, devido a um pau do Qemu/Xen, a tecla F6 não funciona e você deve teclar F5 no lugar (mesmo com o windão pedindo a tecla F6!!!).

Na lista que aparece, você deverá escolher “Standard PC” e mandar continuar, como você pode ver na imagem abaixo:

Instalação XEN

Depois a instalação vai continuar normalmente… até a VM reiniciar e não encontrar mais o CD para continuar a instalação… isso porque não é mais o Qemu, e sim o XEN que entra em ação e pode ser que você (ou alguma GUI como o virt-manager na Red Hat) não tenha colocado a linha do CD-ROM no arquivo de configuração do xen, portanto adicione-a:

O arquivo deve ter uma entrada parecida com essa:

disk = [ 'file:/dados/winxp.img,hda,w' ]

Deverá ficar mais ou menos assim:

disk = [ 'file:/dados/winxp.img,hda,w','file:/tmp/winxp.iso,hdc:cdrom,r', ]

Instalação Windows 2003

Depois você pode criar sua máquina novamente para continuar a instalação do seu Windão :)

# xm create winxp

O Red Hat Enterprise Server 5, assim como o Fedora Core 6 tem agora suporte a virtualização “nativo de fábrica”, com a garantia pela produtora do mesmo.

A documentação está muito bem feita, conforme você pode ver nesses links Virtualization e aqui RHEL-5-manual Virtualization

Para fazer a instalação do RH AS 5 como guest do XEN, para-virtualizado ou com a virtualização full, o melhor caminho é você descompactar todas as ISO’s do RH e copiar tudo para uma único diretório acessível via http ou NFS.

# mkdir /mnt/redhat
# mount -o loop /iso/rhel-5-server-x86_64-disc1.iso /mnt/redhat
# cp -av /mnt/redhat /var/www/html/redhat

(algo assim, para todas as ISO’s)

A interface gráfica do red hat pergunta direto a URL caso o sistema seja para-vitualizado, caso não seja, passe o parâmetro abaixo para o instalador para que você possa continuar a instalação via web (isso é necessário porque não é possível alterar as ISO’s durante a instalação — o que deverá ser corrigido no próximo release do RH AS 5)

linux askmethod

Como nem tudo são flores, para iniciar a máquina virtual você pode pegar esse erro:

# xm create -c vm02

I get the following error:
Using config file “/etc/xen/xm02″.
Traceback (most recent call last):
File “/usr/bin/pygrub”, line 26, in ?
import grub.fsys
ImportError: No module named fsys

Este workaround pode te ajudar:
# cp -va /usr/lib64/python2.4/site-packages/grub/ /usr/lib/python/
# ls -l /usr/lib/python/grub/
total 44
drwxr-xr-x 3 root root 4096 Apr 27 17:16 fsys
-rw-r--r-- 1 root root 7733 Oct 15 2006 GrubConf.py
-rw-r--r-- 1 root root 8785 Mar 8 13:35 GrubConf.pyc
-rw-r--r-- 1 root root 8785 Mar 8 13:35 GrubConf.pyo
-rw-r--r-- 1 root root 0 Oct 15 2006 __init__.py
-rw-r--r-- 1 root root 131 Mar 8 13:35 __init__.pyc
-rw-r--r-- 1 root root 131 Mar 8 13:35 __init__.pyo

Um exemplo do arquivo de configuração gerado:

# cat vm02
# Automatically generated xen config file
name = “vm02″
memory = “1024″
disk = [ 'phy:/dev/vol_lvm/xen_vm02,xvda,w', ]
vif = [ 'mac=00:16:3e:64:5c:e9, bridge=xenbr1', ]
vfb = ["type=vnc,vncunused=1"]
uuid = “cf3861bd-9174-b58c-af84-768e251af31a”
bootloader=”/usr/bin/pygrub”
boot=”/dev/xvda2″
vcpus=1
on_reboot = ‘restart’
on_crash = ‘restart’

É isso ae!
Boa sorte com as VM’s :)

Recentemente instalei o Ubuntu Feisty beta em uma máquina Dell Optiplex GX620 (Pentium D 2.80 GHz e 1 GB RAM), infelizmente sem o suporte a virtualização via hardware, mas mesmo assim uma máquina realmente muito potente.

Aproveitei a experiência para atualizar o Wiki do Ubuntu com os procedimentos para subir uma VM rodando a última versão estável do mesmo, no caso a edgy. É impressionante notar como o projeto Xen está amadurecendo e ficando cada vez mais integrado as distribuições Linux como um todo.

Caso você esteja interessado, pode seguir o link
do passo-a-passo postado no Wiki do Ubuntu, mas infelizmente ainda tem muita para fazer por lá, esse é apenas uma atualização do tutorial antigo que falava sobre o Edgy.