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:
reboot2 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
ifconfigAhora 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/cpuinfodebe 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.rpmPara instalar Xen, ahora simplemente ejecutamos
yum install kernel-xen xenEsto 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.lstEl 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-virtinstDebido 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 scrubVamos 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.rpmEl último comando mostrará algunas advertencias que puedes ignorar:
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using rootA 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.patchAhora construimos un nuevo paquete de libvirt:
rpmbuild -bb libvirt.specAl 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.rpmVe 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.rpmDespués, reiniciamos el sistema:
rebootEl 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 listpara 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 listdebe mostrar esto:
[root@server1 ~]# virsh list
Id Name State
----------------------------------------------------
0 Domain-0 running
[root@server1 ~]#Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.