quinta-feira, 31 de março de 2011

Gentoo paravirtualizado (domU) no XenServer

Olá pessoas, conforme prometido anteriormente, estou disponibilizando agora um howto de como instalar um Gentoo paravirtualizado, rodando sob o XenServer, com xs-tools instalado. :)

Para tal vamos precisar de:
- Um servidor com XenServer
- Um cd com o Gentoo (aqui estou usando o minimal)
- Conhecimento prévio sobre o processo de instalação do Gentoo.
- Um pouco de paciência (mas só um pouco)
- Uma máquina com windows (tá, tá, eu sei...) rodando o XenCenter.

Vou demonstrar apenas os passos mínimos para ter o SO rodando, sem me preocupar com o restante dos pacotes que vocês já devem estar acostumados a instalar nesta distro.

Então, vamos lá, o primeiro passo é criar a máquina virtual lá no XenCenter, para isto basta clicar no botão New VM (ou digitar Ctrl-N).
Abrirá uma tela para você configurar esta máquina virtual. Preencha de acordo com o exemplo abaixo (sinta-se à vontade para configurar de maneira diferente).

Primeiro item, Template: Escolha Other install media;
Name: Preencha com 'Gentoo Exemplo', sem descrição;
Installation Media: Deixe selecionado a unidade de CD/DVD do servidor;
Home Server: Selecione em qual servidor esta máquina irá residir;
CPU & Memory: Ajuste de acordo com suas necessidades;
Storage: Crie um disco para conter o seu SO, como exemplo, criei um com 8 GB.
Networking: Aceite o padrão.
Finish: Lembre-se de colocar o CD do Gentoo no drive do servidor, desmarque a opção para ele iniciar a máquina virtual e clique em Finish.

Aguarde a máquina ser criada, e logo após, selecione-a. Vá para a aba storage e verifique se o dispositivo (HD criado) está na posição 0. Caso não esteja, a forma mais rápida de colocá-lo como 0 é desanexando e reanexando em seguida (Detach, Attach).
Clique agora em Start e logo o boot será efetuado. Acompanhe o processo de boot pelo XenCenter (selecione a máquina virtual à esquerda, e no painel da direita, abra a aba console).

Após o prompt ser apresentado, vamos instalar efetivamente o nosso Gentoo. A instalação é praticamente igual ao que faríamos num Gentoo normal.

Para isso, vamos começar com o particionamento do disco. Neste exemplo, criarei 2 partições apenas, o / e o swap.

dê um fdisk -l para saber qual dispositivo foi criado para você, no meu caso, o HD foi reconhecido como /dev/sda:
# fdisk -l
.
.
Disk /dev/sda doesn't contain a valid partition table
 Com o disco reconhecido, vamos particioná-lo, no esquema comentado acima (uma partição com 7GB para o / e o restante para swap). As duas partições como primárias.

Na sequência, formatamos elas:
# mkfs.ext3 /dev/sda1
# mkswap /dev/sda2
e as montamos
# mount /dev/sda1 /mnt/gentoo
# swapon /dev/sda2
Com isso, agora basta baixar e descompactar o stage3 e o portage, conforme o usual.
# cd /mnt/gentoo
# wget stage3_do_seu_mirror_preferido
# wget portage_do_seu_mirror_preferido
# # Pessoalmente, eu faço o download pelo links :)
# tar xpf stage3_baixado
# cd usr
# tar xf ../portage_baixado
Como você pode ter percebido, até aqui, nada além do mínimo esperado na instalação. A partir daqui a coisa começa a ficar interessante. Após a descompactação dos arquivos baixados, entramos no sistema propriamente dito, com o chroot.
Não instalaremos todos os pacotes que normalmente são instalados (syslog, cron, etc...), vamos apenas baixar o que realmente é necessário para fazer o gentoo funcionar. Mas, se preferir, sinta-se à vontade para fazê-lo.
Então, mãos à obra:
# mount -t proc none /mnt/gentoo/proc
# cp /etc/resolv.conf /mnt/gentoo/etc
# chroot /mnt/gentoo /bin/bash
# env-update
# source /etc/profile
# emerge --sync
# # Pra mim, acusou atualização no portage, recomendável fazê-lo.
# emerge portage
# emerge gentoo-sources
# cd /usr/src/linux
# make menuconfig
# # O que ? Eu não uso o genkernel? Hehe, não.
Configure o kernel como de costume, mas, obrigatoriamente você deve selecionar as seguintes opções:

Processor type and features --->
    [*] Paravirtualized guest support --->
        [*] Xen guest support
Device Drivers --->
    [*] Block devices (NEW) --->
        <*> Xen virtual block device support (NEW)
    [*] Network devices support --->
        <*> xen network device frontend driver (NEW)
    Input device support --->
        <*> Xen virtual keyboard and mouse support
    Graphics support --->
        <*> Xen virtual frame buffer support (NEW)
    Xen driver support --->
        [*] Xen memory balloon driver (NEW)
        [*]    Scrub pages before returning them to system (NEW)
        <*> Xen /dev/xen/evtchn device (NEW)
        <*> Xen filesystem (NEW)
        [*]    Create compatibility mount pount /proc/xen (NEW)
        [*] Create xen entries under /sys/hypervisor (NEW)
        <M> xen platform pci device driver (NEW)
Kernel configurado, é hora de compilar ele e jogá-lo para o diretório padrão:

# make -j2 && make -j2 modules_install
# cp arch/x86/boot/bzImage /boot/kernel-2.6.36-xen
# # Anote o nome do kernel usado aqui.
Importante, não instale o grub. Ele não é necessário.
Criamos então a configuração do grub para que o Xen consiga dar boot nesta nova máquina virtual.
# mkdir /boot/grub
# nano /boot/grub/grub.conf
Jogue o seguinte conteúdo para dentro deste arquivo:
default 0
timeout 10
title Gentoo paravirtualizado - 2.6.36-Xen
    root (hd0,0)
    kernel /boot/kernel-2.6.36-xen root=/dev/xvda1 ro console=hvc0
Ei, espera um pouco, eu to configurando o /dev/sda, e não o /dev/xvda. Sim, exato. Estamos mexendo com sda justamente por que o Gentoo não tá rodando sob o XenServer de forma paravirtualizada. Quando paravirtualizarmos ele, o primeiro disco virará xvda.

Agora, vamos fazer alguns ajustes na configuração:
No arquivo /etc/fstab, elimine a linha /dev/BOOT, e altere as linhas /dev/ROOT e /dev/SWAP para
/dev/xvda1    /    ext3    noatime    0 1
/dev/xvda2    none    swap    sw    0 0
respectivamente e acrescente a seguinte linha
none   /proc/xen    xenfs    defaults   0 0
No arquivo /etc/securetty, acrescente uma linha contendo
hvc0
No arquivo /etc/inittab, adicione a linha
h0:12345:respawn:/sbin/agetty -L 9600 hvc0 screen
Estamos quase lá, troque a senha do root para o que preferir (enquanto estou instalando, eu gosto de usar alguma senha fraca, de fácil digitação, como 'a' ou '123').
Configure também sua rede, e, por precaução, deixe o sshd inicializando no boot (caso o console não funcione por algum motivo).

# nano /et/conf.d/net
# rc-update add sshd default
# rc-update add net.eth0 default
# exit
# cd /
# umount /mnt/gentoo/proc
# umount /mnt/gentoo
# swapoff /dev/sda2
# halt

Assim que a máquina virtual desligar, retire o CD do drive do servidor.
Com isso, acabamos a primeira parte. Instalamos o kernel e configuramos o sistema com os parâmetros necessários para o bom funcionamento sob o XenServer.

Neste ponto, o gentoo está configurado para ser paravirtualizado, mas o XenServer não sabe disso. Configurar o XenServer para que ele funcione da maneira correta é simples, e é aqui que toda a mágica acontece.
Ainda no XenCenter, selecione o servidor XenServer e abra a aba console.
neste prompt de comando, execute:
# xe vm-list
encontre a máquina recém criada e anote o UUID dela, e em seguida:
# xe vm-param-set uuid=UUID_ANOTADO PV-kernel=/boot/kernel-2.6.36-xen PV-bootloader=pygrub HVM-boot-policy=""
Isto ensina o XenServer que esta máquina deve ser paravirtualizada (mais especificamente o parâmetro HVM-boot-policy, onde estamos dizendo que ela não roda mais no modo HVM - o que sobra é a paravirtualização).
Selecione no XenCenter a máquina virtual criada, selecione a primeira aba (General) e clique em Properties.
Selecione a opção Startup Options, e dentro dela, mude o boot de DVD para HD.

Clique em Start novamente, e, se tudo ocorreu como o esperado, sua máquina irá dar boot. :)

Agora, vamos nos preocupar em instalar o XenTools para podermos usufruir de tudo que o XenServer nos proporciona.
Na aba Console, selecione em DVD Drive 1 a imagem xs-tools.iso.
Faça login como root na sua nova máquina (às vezes, o console não funciona como esperado, mas, se você configurou a rede, você deve acesso SSH).
Instale o pacote rpm2targz e
# emerge rpm2targz
# mount /dev/xvdd /mnt/cdrom
# cp /mnt/cdrom/Linux/xe-guest-utilities-xenstore-5.6.100-647.x86_64.rpm .
# cp /mnt/cdrom/Linux/xe-guest-utilities-5.6.100-647.x86_64.rpm .
# rpm2targz xe-guest-utilities-xenstore-5.6.100-647.x86_64.rpm# rpm2targz xe-guest-utilities-5.6.100-647.x86_64.rpm
# cd /
# tar xf root/xe-guest-utilities-xenstore-5.6.100-647.x86_64.tar.gz
# tar xf root/xe-guest-utilities-5.6.100-647.x86_64.tar.gz
# rc-update add xe-linux-distribution default
# /etc/init.d/xe-linux-distribution start
No final do último comando, você deve ter visto algo como
Detecting Linux distribution version: Failed
Starting xe daemon: OK
A primeira linha não importa muito, já que é apenas para reconhecer a versão do linux instalada.
O importante é a segunda linha, com o OK. Isto quer dizer que a integração com o XenServer está completa. Para ter certeza, basta voltar ao XenCenter, selecionar o servidor XenServer onde a máquina virtual está localizada e selecionar a aba Search.
Note que agora não tem mais a linha dizendo que não tem o xentools instalado. Além desta mudança, você também verá o uso da CPU, memória, disco, rede, endereços IP e o uptime.

Com isto, chegamos ao final deste passo-a-passo de instalação. Espero ter ajudado vocês (e não ter esquecido de nada).

A quem interessar, posso disponibilizar a configuração do kernel que eu tenho aqui. :) Peçam nos comentários.

Uma versão em inglês deste tutorial está a caminho.

Grande abraço

8 comentários:

  1. Luciano, podes mandar teu config do kernel? tentei compilar com o 2.6.36-r8 e não apareciam as opções de Xen .. abraço daniel @ dmnzs.com.br

    ResponderExcluir
  2. Olá Daniel, não to com acesso agora à configuração do kernel (tá na minha máquina de testes em casa).

    Mas, a opção que deve abrir todas as configurações Xen, é a
    Processor type and features --->
    [*] Paravirtualized guest support --->
    [*] Xen guest support

    Assim que eu tiver acesso à máquina, posto pra você via email, pode ser ?

    Em tempo, acho que neste fim de semana prepararei um outro tutorial, um pouco mais fácil, usando outra técnica pra conseguir rodar o Gentoo sob XenServer.

    Abração

    ResponderExcluir
  3. BTW this tutorial helped me along with http://community.citrix.com/display/xs/Configuring+Debian+%28Lenny%29+64-bit+%28v5.04%29+on+XenServer+5.5

    Your tip of re-attaching the drives was the most useful to get the mappings to be xvda instead of xvdb.

    Obviously I used google translate a bit for this, although it incorrectly changed the order of the unix commands.

    ResponderExcluir
  4. Olá Daniel.
    Antes de mais nada, parabéns pela iniciativa e pelo artigo.
    Rapaz eu preciso criar um template para o Open SuSe 12.1 da Novell.
    Será que podes me ajudar ?

    Abraços

    ResponderExcluir
    Respostas
    1. Olá Daniel, tudo bem ?
      Luciano aqui.

      Você já tentou utilizar o template que já vem com o Xen pro Suse ?

      Grande abraço

      Excluir
  5. Caro, muito bom seu artigo.
    Tinha um gentoo aqui no Xen mas não estava paravirtualizado.
    Criei uma nova máquina aqui com suas instruções, funcionou 90%
    O problema é quando dou um boot o / só monta read-only.
    Dou um reboot e monta legal depois que ele faz o check automatico da ext3.
    Bom vou testando aqui e vejo o que pode ser, a não ser que tenha algum truque na manga.
    Parabéns pelo artigo.

    ResponderExcluir
    Respostas
    1. Olá Ricardo, estou com um colega que acabou de me indagar sobre a mesma coisa.

      Estou pesquisando no google pra ver se acho algo.

      Grande abraço

      Excluir
    2. Caros, também tive esse problema e pesquisando encontrei em http://lists.xen.org essa dica para mudar no fstab e para mim funcionou.

      /dev/xvda2 / ext4 noatime,nodiratime,errors=remount-ro,barrier=0 0 1

      abs

      Excluir