HOWTO Xen 3 - Debian Etch
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 (físico) é compartilhado entre várias instalações de GNU/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, 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:
root@maq_etch_real:~# cd /etc/apt root@maq_etch_real:/etc/apt# mv sources.list sources.list.bkp root@maq_etch_real:/etc/apt# wget -c http://downloads.fabriciovc.eti.br/apt/sources.list root@maq_etch_real:/etc/apt# aptitude update root@maq_etch_real:/etc/apt# aptitude dist-upgrade root@maq_etch_real:/etc/apt# aptitude install vim vim-scripts ctags ntpdate nmap tcpdump bzip2 less links
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:~# aptitude install <pacotes_listados>
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.25-2 (686), versão atual do kernel linux do Debian Etch utilizando repositórios backports.
- linux-image-2.6.25-2-xen-686
- linux-modules-2.6.25-2-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 backports com algumas outras versões de kernel XEN, incluindo suporte processadores 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.
root@maq_etch_real:~# vi /etc/apt/sources.list deb http://puga.vdu.lt/debian etch main deb-src http://puga.vdu.lt/debian etch main
Agora atualize a lista de pacotes.
root@maq_etch_real:~# aptitude 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 backports, 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:~# aptitude install <pacotes_listados>
Nota: Aqui na minha máquina, possuo 1G de memória RAM, porém 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.
root@maq_etch_real:~# vi /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.
root@maq_etch_real:~# vi /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:
root@maq_etch_real:~# vi /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:
root@maq_etch_real:~# vi /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. Ele 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.
root@maq_etch_real:~# vi /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.
root@maq_etch_real:~# vi /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 a 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.
root@maq_mdv_chroot: vi $raizvirtual/etc/sysconfig/network NETWORKING=yes
root@maq_mdv_chroot: vi $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.
root@maq_mdv_chroot: vi $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 /etc/xen para que a máquina virtual do mandriva possa ser carregada de maneira correta.
root@maq_mdv_real: vi /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 <pacotes>
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
root@maq_etch_real: vi /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