Uma introdução ao Xen

Uma introdução ao Xen

O Xen é um monitor de máquinas virtuais paravirtualizador (VMM) livre ou “hypervisor”, para a arquitetura de processadores x86. O Xen pode executar múltiplas máquinas virtuais com segurança em uma única máquina física, com performance próxima à nativa.

Sua função é virtualizar uma máquina física para um sistema real. Ou seja, os sistemas clientes são reais, mas rodando sobre uma máquina simulada, virtual.

O Xen oferece também funcionalidades a nível empresarial:

  • Máquinas virtuais com performance próxima à do hardware nativo;

  • Migração em tempo real de máquinas virtuais, mesmo em funcionamento, entre hosts físicos;

  • Até 32 CPUs virtuais por máquina virtual, com hotplug de VCPUs;

  • Suporte às plataformas x86/32, x86/32 PAE (Physical Address Extension) e x86/64;

  • Suporte às tecnologias de virtualização Intel VT-x e AMD Pacifica para máquinas virtuais sem modificações (incluindo Microsoft Windows);

  • Excelente suporte de hardware, suportando a maioria dos drivers de dispositivos Linux.

Cenários de uso

Cenários de uso para o Xen incluem

  • Consolidação de servidores: mover múltiplos servidores para um único host físico, com performance e isolamento de falhas garantidos pelas fronteiras de cada máquina virtual;

  • Independência de hardware: permite executar aplicações e sistemas operacionais fora de linha em hardware moderno;

  • Múltiplas configurações de SO: executar múltiplos sistemas operacionais simultaneamente, para propósitos de teste ou desenvolvimento;

  • Desenvolvimento de Kernel: testar e efetuar debug de modificações ao kernel em uma máquina virtual isolada, sem a necessidade de uma máquina de testes adicional;

  • Computação em Cluster: gerenciamento na granularidade de máquina virtual provê maior flexibilidade do que o gerenciamente individual de cada host, particularmente pelo uso de migrações em tempo real para balanceamento de carga;

  • Suporte de Hardware para SOs customizados: permite o desenvolvimento de novos sistemas operacionais com o benefício do amplo suporte de hardware de sistemas operacionais atuais como o Linux.

Suporte a Sistemas Operacionais

Sistemas Unix-like hospedeiros:

O Xen roda, principalmente, com Linux e NetBSD modificados como hospedeiros. A maioria das distruibuições Linux hoje incluem os pacotes do Xen.

No Linux o Xen atualmente roda em x86 (compatível com processadores a partir do Pentium Pro), em sistemas x86-64 assim como em IA-64 e em PowerPC. O Xen também está sendo portado para a plataforma SPARC.

Além disso o Xen oferece um live CD que roda Debian GNU/Linux assim como outras distribuições Linux gratuitas que permite os usuários experimentarem o Xen em seus sistemas sem o instalar no disco.

O Debian incluirá os pacotes do Xen na versão 4.0 instável.

Sistemas Unix-like clientes

Além dos sistemas citados a cima que podem todos serem virtualizados, os seguintes sistemas hoje podem ser operados como clientes Xen:

  • Minix;

  • Plan 9 from Bell Labs;

  • NetBSD;

  • OpenBSD;

  • FreeBSD;

  • OpenSolaris;

  • NetWare;

  • GNU/Hurd/Mach;

  • Microsoft Windows (utilizando virtualização de hardware com Vanderpool (Intel) ou Pacifica (AMD).

Suporte a Hardware

O Xen atualmente roda na arquitetura x86, requerendo um P6 ou mais novos processadores (Pentium Pro, Celeron, Pentium II, Pentium III, Pentium IV, Xeon, AMD Athlon, AMD Duron). Máquina com multiprocessadores são suportadas e há suporte para HyperThreading (SMT). Além disso, o Xen está sendo portado para as arquiteturas IA64 e Power.

O Xen 32-bit padrão suporta até 4GB de memória. Entretanto, o Xen 3.0 tem suporte à Physical Addressing Extensions (PAE) da Intel, que permite máquinas x86/32 endereçarem até 64GB de memória física. O Xen 3.0 também suporta plataformas x86/64 como a Intel EM64T e AMD Opteron que atualmente endereça até 1TB de memória física.

Estrutura de um sistema Xen

Um sistema Xen tem múltiplas camadas, das quais a mais baixa e a mais alta são o próprio Xen. O Xen pode hospedar vários SOs clientes, cada um dos quais executado dentro de uma máquina virtual segura – na terminologia do Xen, um domínio. Domínios são programados pelo Xen para fazer uso efetivo das CPUs fisicamente disponíveis. Esse gerenciamento inclui a responsabilidade de programar cada aplicação dentro do tempo reservado à máquina virtual pelo Xen.

O primeiro domínio, o domínio 0, é criado automaticamente quando o sistema se inicia e tem privilégios especiais de controle. O domínio 0 constrói outros domínios e gerencia seus dispositivos virtuais. Também administra tarefas como suspender, retomar e migrar outras máquinas virtuais.

Para tanto, a instalação do Xen envolve disponibilizar um kernel especial (XenKernel), que deverá ser escolhido no boot ( com o GRUB ) e inciado para colocar o domínio 0 rodando.

Dentro do domínio 0, um processo chamado xend roda para gerenciar o sistema. O xend é responsável por gerenciar máquinas virtuais e prover acesso aos seus consoles. Os comandos são lançados ao xend por uma interface HTTP através de uma ferramenta de linha-de-comando.

Instalação

Métodos de Instalação do Xen

Como de praxe, existem algumas diferentes formas de se instalar o Xen. Podemos instalá-lo tanto a partir de pacotes específicos pré-compilados (RPM) quanto a partir do código fonte ou de tarball. Vamos cobrir, neste curso, a instalação deste último método.

A seguir é apresentada uma lista de pré-requisitos completa para a instalação do Xen.

Pré-requisitos

O que segue é uma lista completa de pré-requisitos que cobre todos os métodos de instalação listados na página anterior. Ou seja, nem todos os ítens listados aqui precisam ser satisfeitos por todo mundo. Ítens marcados com ** são requeridos pelas ferramentas de controle do xend e, portanto, necessárias se você quer rodar mais que uma máquina virtual. Ítens marcados com * são requeridos somente se você for compilar a partir do código fonte e, portanto, desnecessários para os métodos que serão apresentados aqui.

  • Um sistema Linux funcional que utilize o boot-loader GRUB rodando com um processador do tipo P6 ou mais novo.

  • O pacote iproute2.

  • O utilitários Linux bridge-utils (e.g., /sbin/brctl) – disponível em http://bridge.sourceforge.net.

  • O sistema hotplug do Linux (e.g., /sbin/hotplug) – disponível em http://linux-hotplug.sourceforge.net/. Em distribuições novas ele é incluído junto com o sistema udev.

  • Build tools (gcc v3.2.x ou v3.3.x, binutils, GNU make).

  • Instalação de desenvolvimento do zlib (e.g., zlib-dev).

  • Instalação de desenvolvimento do Python v2.2 ou mais recente (e.g., python-dev).

  • LATEX e transfig são necessários para montar a documentação.

Instalando com tarball

Tarballs pré-compilados estão disponíveis para download em http://xen.org/download/.
Tendo em mãos o tarball, simplismente o descompacte e instale:

# tar zxvf xen-(versão)-install.tgz
# cd xen-(versão)-install
# sh ./install.sh

Criando um modules.dep

Confira a versão do XenKernel no diretório /lib/modules e execute o seguinte comando:

# /sbin/depmod -a 2.6.(versão)-xen

Criando um initrd

Utilizando o mesmo nome do XenKernel, execute o seguinte comando:

# cd /boot && mkinitramfs -o initrd.img-2.6.(versão)-xen 2.6.(versão)-xen

Outras adequações

Usuários do kernel XenLinux 2.6 devem desabilitar o TLS (Thread Local Storage)
antes de tentar inciar um kernel XenLinux. Pode-se fazer isso com um comando
simples como:

# mv /lib/tls /lib/tls.desabilitado

Edite o arquivo /etc/mkinitramfs/modules e inclua uma linha como a seguinte:

loop max_loop=64

(valor alterável se necessário, tendo depois que refazer o initrd)

Edite o arquivo /etc/init.d/xendomains e altere a linha LOCKFILE para:

LOCKFILE=/var/lock/xendomains

Configurando o GRUB

Precisamos configurar o GRUB para que ele possa inciar o Xen. Basicamente, precisamos adicionar um bloco ao arquivo de configuração do GRUB, para usuários do Debian, que priorizamos aqui é o /boot/grub/menu.lst. Em outros casos este arquivo pode ser grub.conf, podendo estar no diretório /boot ou /boot/grub.

O bloco, que deve ser inserido antes dos outros gerados automaticamente, deve ser como o seguinte:

title Xen 3.0 / XenLinux 2.6
kernel /boot/xen-3.0.gz dom0_mem=262144
module /boot/vmlinuz-2.6-xen0 root=/dev/sda4 ro console=tty0

A linha do kernel diz ao GRUB onde procurar o Xen e que parâmetros de boot devem ser passados para ele.

A linha do módulo descreve a localização do kernel XenLinux que o Xen deve iniciar e os parâmetros que serão passados a ele. Esses são parâmetros padrões do Linux, identificando o dispositivo root e o especificando para ser montado inicialmente como somente-leitura e solicitando que a saída do console seja enviada para a tela.

Para utilizar um initrd, adicione outra linha module à configuração, como a seguinte:

module /boot/my_initrd.gz

É bom manter o(s) antigo(s) bloco(s) presente(s) no arquivo de configuração que aponta(m) para o(s) kernel(s) antes utilizado(s), tendo em vista que pode ocorrer algum erro de configuração.

Lição 3 – Inicializando um sistema Xen

Inicialização do dom0

Depois que a instalação e a configuração de boot estiver completa, reinicie o sistema e escolhe, na lista de sistemas do GRUB, a opção do Xen recém-criada.

O que se segue deve parecer como um boot convencional de um Linux. A primeira parte do output é do próprio Xen, informando sobre ele mesmo e sobre o hardware de base. A última parte do output vem do XenLinux.

Quando o boot terminar, você deve logar no sistema normalmente. Se não conseguir logar, você ainda deve ser capaz de reiniciar o seu kernel original o selecionando no prompt do GRUB.

Iniciar o sistema do Xen nos leva ao domínio de gerenciamente privilegiado, o domínio0. Neste ponto estamos prontos para criar domínios clientes e “bootá-los” utilizando o comando xm create.

Criação de domínios clientes

Estamos querendo instalar um sistema cliente, afinal. O primeiro passo em criar um novo domínio é preparar um sistema de arquivos raíz, de base (root filesystem). Esse sistema de arquivos pode ser armazenado de várias formas diferentes, inclusive da forma mais evidente, que é instalando o sistema normalmente em uma partição própria. Existem alternativas, então, aqui segue uma lista das possibilidades mais usuais:

  • Em uma partição própria regular;

  • Em uma partição LVM ou de outros gerenciador de volumes;

  • Em um servidor NFS (Network File System);

  • Em um arquivo de disco.

Quem não souber as soluções das instalações alternativas pode simplesmente pegar o CD de instalação de sua distribuição, bootá-lo e instalá-lo em uma partição separada como de praxe.

De volta ao sistema Xen, para inciar o (daemon de controle) xend, digite:

# xend start

Arquivo de configuração do domínio

Antes de inciar um domínio adicional, devemos criar um arquivo de configuração – o myvmconf, no diretório do xen em /etc/xen. São providos, pelo manual do Xen 3.0, dois arquivos de exemplo que se pode usar como ponto de partida:

  • /etc/xen/xmexample1 é um modelo simples de configuração que descreve uma única VM (máquina virtual);

  • /etc/xen/xmexample2 é um modelo com uma descrição com o propósito de ser reutilizada para múltiplas VMs. file is a template description that is intended to be reused for multiple virtual machines (setar o valor da variável vmid no comando xm satisfaz partes deste modelo).

Existem outros exemplos que podem se mostrar úteis. Copie um deles e os edite apropriadamente. Os valores que provavelmente se gostaria de editar são:

kernel: Atribua a ele o caminho (path) do kernel compilado a ser utilizado com o Xen (e.g. kernel = “/boot/vmlinuz-2.6-xenU”), no caso de ter compilado o código do Xen e personalizado o Kernel.

memory: Atribua a ele o tamanho da memória do domínio em megabytes (e.g. memory = 64).

disk: Coloque o primeiro valor desta lista para calcular o offset da partição raiz do domínio baseado no ID do domíno. Atribua ao segundo a localização do /usr, caso a esteja compartilhando entre os domínios (e.g. disk = [‘phy:your_hard_drive%d,sda1,w’ % (base_partition_number + vmid), ‘phy:your_usr_partition,sda6,r’ ] )

dhcp: Descomente a variável dhcp para que o domínio receba seu IP de um servidor DHCP (e.g. dhcp=“dhcp”).

vif : Edite esta variável para determinar o endereço MAC da placa ethernet virtual, se quiser. Caso não sete esta variável, o xend vai, automaticamente, gerar um endereço MAC aleatório na faixa 00:16:3E:xx:xx:xx, designado pela IEEE ao XenSource como um OUI (Organizationally Unique Identifier)

(e.g. vif = [‘mac=00:16:3E:F6:BB:B3’] )

Inicialização do domínio cliente

A ferramenta xm provê uma variedade de comandos para gerenciar domínios. Utilize o comando create para inicar novos domínios. Assumindo que você já criou o arquivo de configuração myvmconf baseado no o /etc/xen/xmexample2, para iniciar uma máquina virtual com ID 1, você deve digitar:

# xm create -c myvmconf vmid=1

O parâmetro -c faz o xm se tornar o console do domínio após a criação. O vmid=1 seta a variável vmid utilizada no arquivo myvmconf.

Você deve ver as mensagens no console de boot do novo domínio aparecendo no terminal em que digitou o comando, culminando em um prompt de login.

É possível fazer certos domínios inciarem automaticamente na hora do boot e fazer o dom0 esperar todos os domínios ativos desligarem antes de desligar o sistema.

Para fazer um domínio se iniciar na hora do boot, coloque seu arquivo de configuração (ou link para ele) no diretório /etc/xen/auto/.

Eles também podem ser inicializados manualmente, já neste caso, através do comando service:

# service xendomains start

E finalizados manualmente:

# service xendomains stop

Lição 4 – Gerenciamento

Xend

O daemon do Xen (Xend) realiza as funções de controle relativas às VMs. Ele forma um centro de controle para um máquina e pode ser controlado através de um protocolo baseado em HTTP. O Xend deve estar rodando para que se inicie e monitore VM.

O Xend deve ser rodado como root por precisar acessar funções de gerenciamento de sistema privilegiadas. Um pequeno conjunto de comandos pode ser executado na linha de comando do Xend, que se executa com ‘xend’:

# xend start
inicia o xend se não estiver rodando;
# xend stop
para o xend se estiver rodando;
# xend restart
reinicia o xend se rodando, senão o inicia;
# xend status
apresenta o status do xend.

Um script de inicialização SysV chamado xend é provido para iniciar o xend na hora do boot, make install instala este script em /etc/init.d. Para habilitá-lo, você deve fazer links simbólicos nos diretórios dos runlevels apropriados ou utilizar a ferramenta chkonfig, se disponível. Uma vez rodando o xend, a administração pode ser feita com a ferramenta xm.

Enquanto o xend roda, os eventos são logados em /var/log/xend.log e em /var/log/xend-debug.log. Estes arquivos, juntamente com os arquivos do syslog, são úteis para solucionar possíveis problemas.

Gerenciamento xm

Xm é a principal ferramenta de gerenciamento do Xen via console. O formato geral de um comando xm é:

# xm comando [switches][argumentos][variáveis]

Os switches e argumentos disponíveis dependerão do comando escolhido. As variáveis podem ser setadas utilizando declarações na forma variável=valor. Declarações de linha de comando sobreescrevem quaisquer valores dos arquivos de configuração utilizado, incluindo as variáveis descritas acima e quaisquer variáveis padrões (por exemplo, o arquivo xmdefconfig utiliza a variável vmid).

Para ajuda sobre os comandos disponíveis, digite:

# xm help

Isto listará os comandos mais utilizados. A lista completa pode ser obtida com o comando a seguir:

# xm help –long

Também podemos digitar

# xm help <command>

para nos infomarmos sobre um comando específico.

list: Um comando importante é aquele que lista os domínios que estão ativos atualmente:

# xm list

Sua saída possui o seguinte formato:

name domid memory vcpus state cputime

O significado de cada campo é descrito a seguir:

name: O nome descritivo da VM.

domid: O número do ID do domínio em que esta VM está rodando.

memory: O tamanho da memória em megabytes.

vcpus: O número de CPUs virtuais que este domínio tem.

state: O estado do domínio.

O estado do domínio consiste em 5 campos:

r rodando
b bloqueado
p pausado
s desligado
c quebrado (crashed)

cputime: O tempo de CPU (em segundos) que o domínio utilizou até então.

O comando xm list também suporta um formato de output longo (no formato do xend, o SXP), para tanto se utiliza o switch -l.

console: Podemos ter acesso ao console de um domínio específico utilizando o comando console, por exemplo:

# xm console nomeVM

Segurança e Parâmetros de boot do Xen

Segurança

Quando implementando um sistema Xen, deve-se tornar o domínio de gerência (domínio0) ao máximo. Se este domínio estiver comprometido, todos os outros domínios estão também vulneráveis. As seguintes práticas são uma seleção das melhores práticas de segurança para o domínio0.

  1. Rode o menor número possível de serviços necessários. Quanto menos coisas presentes em uma partição de gerência melhor. Lembre-se, um serviço rodando como root no dom0 tem acesso a todos outros domínios no sistema.

  2. Utilize um firewall para restringir o tráfego ao dom0. Um firewall com uma política padrão de rejeição de pacotes ajudará a prevenir ataques.

  3. Não permita que usuários acessem o domínio0. O kernel do Linux, como se sabe, pode ser vulnerável a explorações de usuário local. Se permitimos que usuários normais acessam o dom0 (mesmo que como usuários não-privilegiados), corremos o risco de sermos explorados e termos todos os domínios comprometidos.

Parâmetros de boot do Xen

Essas opções abaixo são as utilizadas para configurar o comportamento do Xen na hora do boot. Elas devem ser anexadas à linha de comando do Xen, ou manualmente ou editando o grub.conf. Esta lista serve como ilustração de algumas possibilidades.

noreboot : Não reinicia a máquina automaticamente em caso de erros. Isto é útil para capturar a saída do debug.

nosmp: Desabilita suporte a SMP. A opção é indicada por `ignorebiostables’.

watchdog : Habilita o NMI watchdog que pode reportar algumas falhas.

noirqbalance : Desabilita balanceamento e afinidade IRQ de software. Isto pode ser utilizado em sistemas como o Dell 1850/2850 que contornam, em hardware, problemas de IRQ-routing.

badpage=<número da página>,<page da página> …: Especifica uma lista de páginas que não devem ser alocadas para uso porque elas contém bad bytes. Por exemplo, se o testador de memória indicar defeito no byte 0x12345678, você colocaria `badpage=0x12345′ na linha de comando do Xen.

mem=xxx : Seta a quantidade de memória a ser alocada para o domínio0. No Xen 3.x o parâmetro pode ser especificado com os sufixos B, K, M ou G, representando, respectivamente, bytes, kilobytes, megabytes e gigabytes. A unidade padrão é kilobytes.

dom0_mem=xxx : Seta a quantidade de memória a ser alocada para o domínio0. No Xen 3.x o parâmetro pode ser especificado com os sufixos B, K, M ou G, representando, respectivamente, bytes, kilobytes, megabytes e gigabytes. A unidade padrão é kilobytes.

sched=xxx : Seleciona o planejador (scheduler) de CPU que o Xen deve usar. As opções, atualmente, são `sedf’ (padrão) e `bvt’.

apic_verbosity=debug,verbose : Apresenta mais informação sobre a ACIP local e configuração da IOAPIC.

lapic : Força uso da APIC local mesmo quando desabilitada por uma BIOS de uniprocessamento.

nolapic : Ignora a APIC local em um sistema de uniprocessamento, mesmo se habilitada pela BIOS.

Existem outras opções apresentadas no manual do Xen 3.0.

Imagem de exemplo (Internet):

bba2958

Por Bruno Macagnani <brunomacagnani [at]gmail.com>

Veja também:

Ferramentas de virtualização
Nos últimos anos, com a evolução da informática, o poder de processamento dos computadores aumentou drasticamente. Entretanto, existem casos em que todo esse processamento não está sendo utilizado pelas máquinas, fazendo com que exista uma subutilização dos recursos computacionais. Preocupados em procurar soluções que visam à diminuição dessa ociosidade de processamento, os administradores de redes tem utilizado a técnica da virtualização. O uso da virtualização representa a ilusão de várias máquinas virtuais (VMs) independentes, cada uma rodando uma instância de um sistema operacional virtualizado. Esta técnica não é nova, iniciou-se pela IBM nos mainframes na década de 60, mas seu uso foi difundido nos anos 80, tendo em vista a resolução de problemas a um custo relativamente baixo.
https://www.hardware.com.br/artigos/ferramentas-virtualizacao/

Sobre o Autor

Redes Sociais:

Deixe seu comentário

X