Virtualização · 8 min read · Nov 30, 2025

Virtualização Com Xen No CentOS 6.2 (x86_64) (Paravirtualização & Virtualização de Hardware)

Virtualização Com Xen No CentOS 6.2 (x86_64) (Paravirtualização & Virtualização de Hardware)

Versão 1.0
Autor: Falko Timme
Siga-me no Twitter

Este tutorial fornece instruções passo a passo sobre como instalar o Xen (versão 4.1.2) em um sistema CentOS 6.2 (x86_64).

O Xen permite que você crie sistemas operacionais convidados (sistemas operacionais nix como Linux e FreeBSD*), chamados de “máquinas virtuais” ou domUs, sob um sistema operacional host (dom0). Usando o Xen, você pode separar suas aplicações em diferentes máquinas virtuais que são totalmente independentes umas das outras (por exemplo, uma máquina virtual para um servidor de e-mail, uma máquina virtual para um site de alto tráfego, outra máquina virtual que atende os sites de seus clientes, uma máquina virtual para DNS, etc.), mas ainda usar o mesmo hardware. Isso economiza dinheiro e, o que é ainda mais importante, é mais seguro. Se a máquina virtual do seu servidor DNS for invadida, isso não terá efeito sobre suas outras máquinas virtuais. Além disso, você pode mover máquinas virtuais de um servidor Xen para outro.

Usarei o CentOS 6.2 (x86_64) tanto para o sistema operacional host (dom0) quanto para o sistema operacional convidado (domU).

Este guia é destinado a ser um guia prático; não cobre os fundamentos teóricos. Eles são tratados em muitos outros documentos na web.

Este documento vem sem garantia de qualquer tipo! Quero dizer que este não é o único jeito de configurar tal sistema. Existem muitas maneiras de alcançar esse objetivo, mas este é o caminho que eu sigo. Não dou nenhuma garantia de que isso funcionará para você!

1 Nota Preliminar

Este guia explicará como configurar máquinas virtuais baseadas em imagem e também máquinas virtuais baseadas em LVM.

Certifique-se de que o SELinux esteja desativado ou permissivo:

vi /etc/sysconfig/selinux

| # Este arquivo controla o estado do SELinux no sistema. # SELINUX= pode ter um destes três valores: # enforcing - A política de segurança do SELinux é aplicada. # permissive - O SELinux imprime avisos em vez de aplicar. # disabled - O SELinux está totalmente desativado. SELINUX=disabled # SELINUXTYPE= tipo de política em uso. Os valores possíveis são: # targeted - Apenas daemons de rede direcionados são protegidos. # strict - Proteção total do SELinux. SELINUXTYPE=targeted |

Se você teve que modificar /etc/sysconfig/selinux, reinicie o sistema:

reboot

2 Criando Uma Ponte de Rede

Precisamos configurar uma ponte de rede em nosso servidor para que nossas máquinas virtuais possam ser acessadas de outros hosts como se fossem sistemas físicos na rede.

Para fazer isso, instalamos o pacote bridge-utils…

yum install bridge-utils

… e configuramos uma ponte. Crie o arquivo /etc/sysconfig/network-scripts/ifcfg-br0 (por favor, use os valores IPADDR, PREFIX, GATEWAY, DNS1 e DNS2 do arquivo /etc/sysconfig/network-scripts/ifcfg-eth0); certifique-se de usar TYPE=Bridge, não TYPE=Ethernet:

vi /etc/sysconfig/network-scripts/ifcfg-br0

| DEVICE="br0" NM_CONTROLLED="yes" ONBOOT=yes TYPE=Bridge BOOTPROTO=none IPADDR=192.168.0.100 PREFIX=24 GATEWAY=192.168.0.1 DNS1=8.8.8.8 DNS2=8.8.4.4 DEFROUTE=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no NAME="System br0" |

Modifique /etc/sysconfig/network-scripts/ifcfg-eth0 da seguinte forma (comente BOOTPROTO, IPADDR, PREFIX, GATEWAY, DNS1 e DNS2 e adicione BRIDGE=br0):

vi /etc/sysconfig/network-scripts/ifcfg-eth0

| DEVICE="eth0" NM_CONTROLLED="yes" ONBOOT=yes HWADDR=00:1E:90:F3:F0:02 TYPE=Ethernet #BOOTPROTO=none #IPADDR=192.168.0.100 #PREFIX=24 #GATEWAY=192.168.0.1 #DNS1=8.8.8.8 #DNS2=8.8.4.4 DEFROUTE=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no NAME="System eth0" UUID=5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03 BRIDGE=br0 |

Reinicie a rede…

/etc/init.d/network restart

… e execute

ifconfig

Agora deve mostrar a ponte de rede (br0):

[root@server1 ~]# ifconfig  
br0       Link encap:Ethernet  HWaddr 00:1E:90:F3:F0:02  
          inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0  
          inet6 addr: fe80::21e:90ff:fef3:f002/64 Scope:Link  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
          RX packets:17 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:29 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0  
          RX bytes:1196 (1.1 KiB)  TX bytes:2794 (2.7 KiB)  
  
eth0      Link encap:Ethernet  HWaddr 00:1E:90:F3:F0:02  
          inet6 addr: fe80::21e:90ff:fef3:f002/64 Scope:Link  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
          RX packets:4554 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:3020 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:1000  
          RX bytes:6249612 (5.9 MiB)  TX bytes:254928 (248.9 KiB)  
          Interrupt:25 Base address:0x6000  
  
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0  
          inet6 addr: ::1/128 Scope:Host  
          UP LOOPBACK RUNNING  MTU:16436  Metric:1  
          RX packets:3 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0  
          RX bytes:1304 (1.2 KiB)  TX bytes:1304 (1.2 KiB)  
  
[root@server1 ~]#

3 Instalando o Xen

Primeiro verifique se sua CPU suporta virtualização de hardware - se este for o caso, o comando

egrep '(vmx|svm)' --color=always /proc/cpuinfo

deve exibir algo, por exemplo:

[root@server1 ~]# egrep '(vmx|svm)' --color=always /proc/cpuinfo  
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall  
 nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy misalignsse  
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall  
 nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy misalignsse  
[root@server1 ~]#

Se nada for exibido, então seu processador não suporta virtualização de hardware. Isso significa que você pode usar apenas paravirtualização com o Xen, mas não virtualização de hardware.

Como o CentOS 6 é baseado no RedHat 6, e o RedHat descontinuou o suporte ao Xen na versão 6, precisamos obter o Xen de um repositório de terceiros. Podemos habilitar o repositório da seguinte forma:

yum install wget
yum install http://au1.mirror.crc.id.au/repo/kernel-xen-release-6-3.noarch.rpm

Para instalar o Xen, agora simplesmente executamos

yum install kernel-xen xen

Isso instala o Xen e um kernel Xen em nosso sistema CentOS.

Antes de podermos inicializar o sistema com o kernel Xen, verifique a configuração do seu carregador de inicialização GRUB. Abrimos /boot/grub/menu.lst:

vi /boot/grub/menu.lst

O primeiro kernel listado deve ser o kernel Xen que você acabou de instalar:

| [...] title CentOS (2.6.32.54-1.el6xen.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32.54-1.el6xen.x86_64 ro root=/dev/mapper/VolGroup00-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=VolGroup00/LogVol01 rd_LVM_LV=VolGroup00/LogVol00 rd_NO_DM initrd /initramfs-2.6.32.54-1.el6xen.x86_64.img [...] |

Precisamos modificar essa seção para que o hipervisor Xen seja carregado primeiro. Na linha kernel /vmlinuz…, substitua a primeira palavra kernel por module. Faça o mesmo na próxima linha - substitua a primeira palavra initrd por module na linha initrd /initramfs…. Em seguida, adicione a linha kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=1 dom0_vcpus_pin após a linha root e antes da primeira linha module (se você tiver mais de um núcleo de CPU, pode especificar um número diferente de 1 para dom0_max_vcpus). A seção do kernel final deve ficar assim:

| [...] title CentOS (2.6.32.54-1.el6xen.x86_64) root (hd0,0) kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=1 dom0_vcpus_pin module /vmlinuz-2.6.32.54-1.el6xen.x86_64 ro root=/dev/mapper/VolGroup00-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=VolGroup00/LogVol01 rd_LVM_LV=VolGroup00/LogVol00 rd_NO_DM module /initramfs-2.6.32.54-1.el6xen.x86_64.img [...] |

Altere o valor de default para 0 (para que o primeiro kernel (o kernel Xen) seja inicializado por padrão):

| [...] default=0 [...] |

O completo /boot/grub/menu.lst deve parecer algo assim:

| # grub.conf gerado pelo anaconda # # Note que você não precisa rerun grub após fazer alterações neste arquivo # AVISO: Você tem uma partição /boot. Isso significa que # todos os caminhos do kernel e initrd são relativos a /boot/, por exemplo. # root (hd0,0) # kernel /vmlinuz-versão ro root=/dev/mapper/VolGroup00-LogVol00 # initrd /initrd-[genérico-]versão.img #boot=/dev/sde default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.32.54-1.el6xen.x86_64) root (hd0,0) kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=1 dom0_vcpus_pin module /vmlinuz-2.6.32.54-1.el6xen.x86_64 ro root=/dev/mapper/VolGroup00-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=VolGroup00/LogVol01 rd_LVM_LV=VolGroup00/LogVol00 rd_NO_DM module /initramfs-2.6.32.54-1.el6xen.x86_64.img title CentOS (2.6.32-220.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=/dev/mapper/VolGroup00-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=VolGroup00/LogVol01 rd_LVM_LV=VolGroup00/LogVol00 rd_NO_DM initrd /initramfs-2.6.32-220.el6.x86_64.img |

Antes de reiniciarmos, instalamos os pacotes libvirt e python-virtinst (que contém a ferramenta virt-install que usaremos mais tarde para instalar VMs Xen):

yum install libvirt python-virtinst

Como o pacote libvirt do CentOS 6/RedHat 6 não tem suporte para Xen, devemos reconstruí-lo com suporte ao Xen. Para fazer isso, instalamos alguns pré-requisitos agora:

yum groupinstall 'Development Tools'
yum install python-devel xen-devel libxml2-devel xhtml1-dtds readline-devel ncurses-devel libtasn1-devel gnutls-devel augeas libudev-devel libpciaccess-devel yajl-devel sanlock-devel libpcap-devel libnl-devel avahi-devel libselinux-devel cyrus-sasl-devel parted-devel device-mapper-devel numactl-devel libcap-ng-devel netcf-devel libcurl-devel audit-libs-devel systemtap-sdt-devel

Vamos descobrir nossa versão do libvirt:

rpm -qa | grep libvirt
[root@server1 ~]# rpm -qa | grep libvirt  
libvirt-client-0.9.4-23.el6_2.4.x86_64  
libvirt-0.9.4-23.el6_2.4.x86_64  
libvirt-python-0.9.4-23.el6_2.4.x86_64  
[root@server1 ~]#

É 0.9.4, então baixamos o pacote src.rpm apropriado para /root/src e o instalamos:

mkdir /root/src  
cd /root/src  
wget http://vault.centos.org/6.2/os/Source/SPackages/libvirt-0.9.4-23.el6.src.rpm  
rpm -i libvirt-0.9.4-23.el6.src.rpm

O último comando mostrará alguns avisos que você pode ignorar:

aviso: usuário mockbuild não existe - usando root  
aviso: grupo mockbuild não existe - usando root

Em seguida, aplicamos o suporte ao Xen nas fontes do libvirt:

wget http://pasik.reaktio.net/xen/patches/libvirt-spec-rhel6-enable-xen.patch  
cd /root/rpmbuild/SPECS  
cp -a libvirt.spec libvirt.spec.orig  
patch -p0 < ~/src/libvirt-spec-rhel6-enable-xen.patch

Agora construímos um novo pacote libvirt:

rpmbuild -bb libvirt.spec

No final do processo de construção, você deve ver algo assim:

Escreveu: /root/rpmbuild/RPMS/x86_64/libvirt-0.9.4-23.el6.x86_64.rpm  
Escreveu: /root/rpmbuild/RPMS/x86_64/libvirt-client-0.9.4-23.el6.x86_64.rpm  
Escreveu: /root/rpmbuild/RPMS/x86_64/libvirt-devel-0.9.4-23.el6.x86_64.rpm  
Escreveu: /root/rpmbuild/RPMS/x86_64/libvirt-lock-sanlock-0.9.4-23.el6.x86_64.rpm  
Escreveu: /root/rpmbuild/RPMS/x86_64/libvirt-python-0.9.4-23.el6.x86_64.rpm  
Escreveu: /root/rpmbuild/RPMS/x86_64/libvirt-debuginfo-0.9.4-23.el6.x86_64.rpm

Vá para o diretório onde os novos pacotes foram criados (neste caso /root/rpmbuild/RPMS/x86_64/)…

cd /root/rpmbuild/RPMS/x86_64/

… e instale os novos pacotes libvirt (com suporte ao Xen) da seguinte forma:

rpm -Uvh --force libvirt-0.9.4-23.el6.x86_64.rpm libvirt-client-0.9.4-23.el6.x86_64.rpm libvirt-python-0.9.4-23.el6.x86_64.rpm

Depois, reiniciamos o sistema:

reboot

O sistema agora deve inicializar automaticamente o novo kernel Xen. Após o sistema ter inicializado, podemos verificar isso executando

uname -r
[root@server1 ~]# uname -r  
2.6.32.54-1.el6xen.x86_64  
[root@server1 ~]#

Então, está realmente usando o novo kernel Xen!

Agora podemos executar

xm list

para verificar se o Xen foi iniciado. Deve listar o Domain-0 (dom0):

[root@server1 ~]# xm list  
Nome                                     ID   Mem VCPUs      Estado   Tempo(s)  
Domain-0                                 0  1024     1      r-----     18.9  
[root@server1 ~]#

Em vez de usar o comando xm, a partir de agora usarei o comando virsh para gerenciar VMs Xen. Esta é a maneira preferida, pois estamos usando libvirt.

virsh list

deve mostrar isso:

[root@server1 ~]# virsh list  
 Id Nome                 Estado  
----------------------------------  
  0 Domain-0             running  
  
[root@server1 ~]#
Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.