Virtualización · 8 min read · Dec 08, 2025

Virtualización Con Xen En CentOS 6.3 (x86_64) (Paravirtualización & Virtualización de Hardware)

Virtualización Con Xen En CentOS 6.3 (x86_64) (Paravirtualización & Virtualización de Hardware)

Versión 1.0
Autor: Falko Timme
Sígueme en Twitter

Este tutorial proporciona instrucciones paso a paso sobre cómo instalar Xen (versión 4.1.x) en un sistema CentOS 6.3 (x86_64).

Xen te permite crear sistemas operativos invitados (sistemas operativos nix como Linux y FreeBSD*), llamadas “máquinas virtuales” o domU s, bajo un sistema operativo anfitrión (dom0). Usando Xen puedes separar tus aplicaciones en diferentes máquinas virtuales que son totalmente independientes entre sí (por ejemplo, una máquina virtual para un servidor de correo, una máquina virtual para un sitio web de alto tráfico, otra máquina virtual que sirve los sitios web de tus clientes, una máquina virtual para DNS, etc.), pero aún así usar el mismo hardware. Esto ahorra dinero, y lo que es aún más importante, es más seguro. Si la máquina virtual de tu servidor DNS es hackeada, no tiene efecto en tus otras máquinas virtuales. Además, puedes mover máquinas virtuales de un servidor Xen a otro.

Usaré CentOS 6.3 (x86_64) tanto para el sistema operativo anfitrión (dom0) como para el sistema operativo invitado (domU).

Este cómo hacer está destinado como una guía práctica; no cubre los antecedentes teóricos. Estos se tratan en muchos otros documentos en la web.

¡Este documento se proporciona sin garantía de ningún tipo! Quiero decir que este no es el único modo de configurar un sistema así. Hay muchas formas de lograr este objetivo, pero este es el camino que tomo. ¡No emito ninguna garantía de que esto funcione para ti!

1 Nota Preliminar

Esta guía explicará cómo configurar máquinas virtuales basadas en imágenes y también máquinas virtuales basadas en LVM.

Asegúrate de que SELinux esté deshabilitado o en modo permisivo:

vi /etc/sysconfig/selinux

| # Este archivo controla el estado de SELinux en el sistema. # SELINUX= puede tomar uno de estos tres valores: # enforcing - La política de seguridad de SELinux se aplica. # permissive - SELinux imprime advertencias en lugar de aplicar. # disabled - SELinux está completamente deshabilitado. SELINUX=disabled # SELINUXTYPE= tipo de política en uso. Los valores posibles son: # targeted - Solo se protegen los demonios de red dirigidos. # strict - Protección completa de SELinux. SELINUXTYPE=targeted |

Si tuviste que modificar /etc/sysconfig/selinux, por favor reinicia el sistema:

reboot

2 Creando Un Puente de Red

Necesitamos configurar un puente de red en nuestro servidor para que nuestras máquinas virtuales puedan ser accedidas desde otros hosts como si fueran sistemas físicos en la red.

Para hacer esto, instalamos el paquete bridge-utils…

yum install bridge-utils

… y configuramos un puente. Crea el archivo /etc/sysconfig/network-scripts/ifcfg-br0 (por favor usa los valores IPADDR, PREFIX, GATEWAY, DNS1 y DNS2 del archivo /etc/sysconfig/network-scripts/ifcfg-eth0); asegúrate de usar TYPE=Bridge, no 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" |

Modifica /etc/sysconfig/network-scripts/ifcfg-eth0 de la siguiente manera (comenta BOOTPROTO, IPADDR, PREFIX, GATEWAY, DNS1 y DNS2 y añade BRIDGE=br0):

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

| DEVICE="eth0" #BOOTPROTO=none NM_CONTROLLED="yes" ONBOOT=yes TYPE="Ethernet" UUID="73cb0b12-1f42-49b0-ad69-731e888276ff" HWADDR=00:1E:90:F3:F0:02 #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" BRIDGE=br0 |

Reinicia la red…

/etc/init.d/network restart

… y ejecuta

ifconfig

Ahora debería mostrar el puente de red (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:8 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:27 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0  
          RX bytes:460 (460.0 b)  TX bytes:2298 (2.2 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:18455 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:11861 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:1000  
          RX bytes:26163057 (24.9 MiB)  TX bytes:1100370 (1.0 MiB)  
          Interrupt:25 Base address:0xe000  
  
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:5 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0  
          RX bytes:2456 (2.3 KiB)  TX bytes:2456 (2.3 KiB)  
  
[root@server1 ~]#

3 Instalando Xen

Primero verifica si tu CPU soporta virtualización de hardware - si este es el caso, el comando

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

debe mostrar algo, por ejemplo:

[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 ~]#

Si no se muestra nada, entonces tu procesador no soporta virtualización de hardware. Esto significa que solo puedes usar paravirtualización con Xen, pero no virtualización de hardware.

Como CentOS 6 se basa en RedHat 6, y RedHat ha dejado de soportar Xen en la versión 6, necesitamos obtener Xen de un repositorio de terceros. Podemos habilitar el repositorio de la siguiente manera:

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

Para instalar Xen, ahora simplemente ejecutamos

yum install kernel-xen xen

Esto instala Xen y un kernel Xen en nuestro sistema CentOS.

Antes de que podamos iniciar el sistema con el kernel Xen, por favor verifica la configuración de tu cargador de arranque GRUB. Abrimos /boot/grub/menu.lst:

vi /boot/grub/menu.lst

El primer kernel listado debe ser el kernel Xen que acabas de instalar:

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

Necesitamos modificar esa sección para que el hipervisor Xen se cargue primero. En la línea kernel /vmlinuz…, reemplaza la primera palabra kernel con module. Haz lo mismo en la siguiente línea - reemplaza la primera palabra initrd con module en la línea initrd /initramfs…. Luego añade la línea kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=1 dom0_vcpus_pin después de la línea root y antes de la primera línea module (si tienes más de un núcleo de CPU, puedes especificar otro número que no sea 1 para dom0_max_vcpus). La sección del kernel final debería verse así:

| [...] title CentOS (2.6.32.57-2.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.57-2.el6xen.x86_64 ro root=/dev/mapper/vg_server1-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=vg_server1/LogVol01 rd_LVM_LV=vg_server1/LogVol00 rd_NO_DM rhgb quiet module /initramfs-2.6.32.57-2.el6xen.x86_64.img [...] |

Cambia el valor de default a 0 (para que el primer kernel (el kernel Xen) se inicie por defecto):

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

El completo /boot/grub/menu.lst debería verse algo así:

| # grub.conf generado por anaconda # # Nota que no tienes que volver a ejecutar grub después de hacer cambios en este archivo # AVISO: Tienes una partición /boot. Esto significa que # todas las rutas del kernel y initrd son relativas a /boot/, por ejemplo. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/mapper/vg_server1-LogVol00 # initrd /initrd-[generic-]version.img #boot=/dev/sde default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.32.57-2.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.57-2.el6xen.x86_64 ro root=/dev/mapper/vg_server1-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=vg_server1/LogVol01 rd_LVM_LV=vg_server1/LogVol00 rd_NO_DM rhgb quiet module /initramfs-2.6.32.57-2.el6xen.x86_64.img title CentOS (2.6.32-279.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/mapper/vg_server1-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=vg_server1/LogVol01 rd_LVM_LV=vg_server1/LogVol00 rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-279.el6.x86_64.img |

Antes de reiniciar, instalamos los paquetes libvirt y python-virtinst (que contiene la herramienta virt-install que usaremos más adelante para instalar máquinas virtuales Xen):

yum install libvirt python-virtinst

Debido a que el paquete libvirt de CentOS 6/RedHat 6 no tiene soporte para Xen, debemos reconstruirlo con soporte para Xen. Para hacer esto, instalamos algunos requisitos previos ahora:

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 libblkid-devel scrub

Vamos a averiguar nuestra versión de libvirt:

rpm -qa | grep libvirt
[root@server1 ~]# rpm -qa | grep libvirt  
libvirt-client-0.9.10-21.el6_3.3.x86_64  
libvirt-0.9.10-21.el6_3.3.x86_64  
libvirt-python-0.9.10-21.el6_3.3.x86_64  
[root@server1 ~]#

Es 0.9.10, así que descargamos el paquete src.rpm apropiado en /root/src e instalamos:

mkdir /root/src  
cd /root/src  
wget http://vault.centos.org/6.3/os/Source/SPackages/libvirt-0.9.10-21.el6.src.rpm  
rpm -i libvirt-0.9.10-21.el6.src.rpm

El último comando mostrará algunas advertencias que puedes ignorar:

warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root

A continuación, parcheamos el soporte de Xen en las fuentes de 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

Ahora construimos un nuevo paquete de libvirt:

rpmbuild -bb libvirt.spec

Al final del proceso de construcción deberías ver algo como esto:

Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-0.9.10-21.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-client-0.9.10-21.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-devel-0.9.10-21.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-lock-sanlock-0.9.10-21.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-python-0.9.10-21.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-debuginfo-0.9.10-21.el6.x86_64.rpm

Ve a la carpeta donde se han creado los nuevos paquetes ( /root/rpmbuild/RPMS/x86_64/ en este caso)…

cd /root/rpmbuild/RPMS/x86_64/

… y instala los nuevos paquetes de libvirt (con soporte para Xen) de la siguiente manera:

rpm -Uvh --force libvirt-0.9.10-21.el6.x86_64.rpm libvirt-client-0.9.10-21.el6.x86_64.rpm libvirt-python-0.9.10-21.el6.x86_64.rpm

Después, reiniciamos el sistema:

reboot

El sistema ahora debería arrancar automáticamente el nuevo kernel Xen. Después de que el sistema haya arrancado, podemos verificar eso ejecutando

uname -r
[root@server1 ~]# uname -r  
2.6.32.57-2.el6xen.x86_64  
[root@server1 ~]#

¡Así que realmente está usando el nuevo kernel Xen!

Ahora podemos ejecutar

xm list

para verificar si Xen ha comenzado. Debería listar Domain-0 (dom0):

[root@server1 ~]# xm list  
Name                                    ID   Mem VCPUs      State   Time(s)  
Domain-0                                 0  1024     1      r-----     18.9  
[root@server1 ~]#

En lugar de usar el comando xm, a partir de ahora usaré el comando virsh para gestionar las máquinas virtuales Xen. Este es el método preferido ya que estamos usando libvirt.

virsh list

debe mostrar esto:

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

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.