Virtualización
Como lo dice la Wikipedia:
Virtualización se refiere a la abstracción de los recursos de una computadora, llamada Hypervisor o VMM (Virtual Machine Monitor)
Con la virtualización, podemos iniciar diversas máquinas «virtuales» sobre un único recurso físico.
¿Qué ventajas tiene esto?
Muchas, empezando por el ahorro de recursos, energía, la sobre-utilización óptima de hardware (hasta un 90% más que sobre hardware no-virtualizado).
Tecnologías de virtualización
Hay tecnologías de virtualización de diversos tipos, basadas en software (emulación o emulación asistida), en hardware y las para-virtualizaciones, encontrarás mucha información en la Wikipedia y otros artículos.
¿De qué se trata todo esto?
Se busca ahorrar el máximo de recursos, para ello, se unifican en un único equipo GNU/Linux Debian Squeeze, las más populares plataformas de virtualización libres existentes, en este caso tendremos:
- Virtualización por contenedores (LXC)
- Tecnología de para-virtualización (Xen)
- Una tecnología de emulación (QEMU)
- Virtualización por software (VirtualBox)
- Virtualización completa (KVM / Xen HVM)
¿Por qué unificar?
Las tecnologías de para-virtualización y virtualización completa son útiles para gestionar recursos de sistemas operativos diversos, o para virtualizar versiones de GNU/Linux que requieren acceso a recursos de manera muy heterogénea, pero para máquinas virtuales basadas en GNU/Linux que consumen pocos recursos (un servidor DHCP, NTP, DNS, una entidad certificadora sencilla, etc) tener todo un sistema operativo virtualizado con disco, RAM y CPU es ineficiente y el uso de tecnologías de contenedores es lo mejor.
No se imaginan la cantidad de entidades públicas que hacen «magia» para administrar sus recursos de servidores de manera eficiente, en algunos casos terminan tomando un viejo CPU 586 para montar un DHCP, lo que incluye un equipo «más» para adminsitrar, más uso de energía eléctrica, más sobrecalentamiento del datacenter (con un mayor consumo de energía en enfriamiento) y otra cantidad más de desventajas.
Tecnologías de virtualización
LXC
Tecnología de «contenedores», más que una «virtualización» es una «contextualización», aislamiento en un contexto específico (CHROOT) de una versión de GNU/Linux imbuida (VPS) en el interior de otra. (HOST)
Dentro de los contenedores reside otra versión de GNU/Linux, la cual posee su propia interfaz de red, se pueden aplicar cuotas de disco/CPU/RAM y se pueden detener, apagar y/o suspender.
Es un «chroot» mejorado puesto que las facilidades de administración y ejecución basadas en chroot (lxc-execute) pueden ser utilizadas para LXC, también las tecnologías de creación de espacios aislados (isolated) como debootstrap (Debian|Ubuntu), rpmstrap (Fedora,CentOS) pero con las capacidades de virtualización que incopora LXC.
OpenVZ es otra tecnología de contenedores existente, pero a diferencia de LXC, openVZ requiere todo un parche del Kernel y un subsistema propio para trabajar (además de al ser una versión libre de un sistema comercial, virtuozzo, no ha tenido mucho empuje).
LXC es nativa en el Kernel Linux a partir de la versión 2.6.32 y utiliza características nativas del Kernel Linux como los CGROUPS y los Namespaces.
También está soportada por Libvirt, de tal manera que cualquier plataforma de gestión que utilice libvirt, sera capaz de administrar VPS construidos con LXC.
Nota: LXC es compatible con las templates de OpenVZ y Proxmox.
Instalación de LXC
La instalación de LXC es bastante sencilla:
aptitude install lxc
Configuración de LXC
* crear el directorio de los contenedores y configuraciones:
mkdir /srv/lxc
* Configurar /etc/default/lxc para que inicie al arranque y utilice el directorio de configuraciones:
# Comment out to run the lxc init script RUN=yes # Directory containing the container configurations CONF_DIR=/srv/lxc
* verificar que tenemos soporte para CGROUPS en el kernel
cat /proc/filesystems | grep cgroup nodev cgroup
Y
cat /proc/cgroups #subsys_name hierarchy num_cgroups enabled cpuset 0 1 1 ns 0 1 1 cpu 0 1 1 cpuacct 0 1 1 devices 0 1 1 freezer 0 1 1 net_cls 0 1 1
* Montar CGROUPS en el directorio /sys/fs/cgroup/
(Debian Bug: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=604635)
mount -t cgroup none /sys/fs/cgroup
Y verificamos que ha montado correctamente:
/sys/fs/cgroup/
├── cgroup.procs
├── cpuacct.stat
├── cpuacct.usage
├── cpuacct.usage_percpu
├── cpuset.cpu_exclusive
├── cpuset.cpus
├── cpuset.mem_exclusive
├── cpuset.mem_hardwall
├── cpuset.memory_migrate
├── cpuset.memory_pressure
├── cpuset.memory_pressure_enabled
├── cpuset.memory_spread_page
├── cpuset.memory_spread_slab
├── cpuset.mems
├── cpuset.sched_load_balance
├── cpuset.sched_relax_domain_level
├── cpu.shares
├── devices.allow
├── devices.deny
├── devices.list
├── net_cls.classid
├── notify_on_release
├── release_agent
└── tasks
Posteriormente, fijar el montaje en el /etc/fstab
none /sys/fs/cgroup cgroup cpuset,cpu,memory,cpuacct,devices,freezer,net_cls 0 0
Y en las udev, para que pueda ser creado durante el proceso de arranque:
mkdir /lib/udev/devices/cgroup
* Montar las librerías de gestión de cgroups
aptitude install libcgroup1
– Y reiniciamos el equipo.
– luego, podemos verificar con lxc-checkconfig para determinar si está bien soportado CGROUPS y LXC:
lxc-checkconfig Kernel config /proc/config.gz not found, looking in other places... Found kernel config file /boot/config-2.6.32-5-xen-amd64 --- Namespaces --- Namespaces: enabled Utsname namespace: enabled Ipc namespace: enabled Pid namespace: enabled User namespace: enabled Network namespace: enabled Multiple /dev/pts instances: enabled --- Control groups --- Cgroup: enabled Cgroup namespace: enabled Cgroup device: enabled Cgroup sched: enabled Cgroup cpu account: enabled Cgroup memory controller: missing Cgroup cpuset: enabled --- Misc --- Veth pair device: enabled Macvlan: enabled Vlan: enabled File capabilities: enabled
Nota: tomen en cuenta que el soporte para gestionar memoria via CGROUPS está desactivada en kernel Linux inferiores a 2.6.35.
Xen
Gestor de máquinas virtuales de código abierto, diseñado para dar virtualización con aislamiento seguro y todas las características de un sistema operativo.
Xen utiliza para-virtualización, es este caso, tanto el host como el cliente sufren «modificaciones» a nivel de su kernel para poder ejecutarse e interactuar con un mínimo de penalty en el rendimiento.
Mediante técnicas de paravirtualización, un host puede ejecutar núcleos modificados de Linux, NetBSD y FreeBSD.
Virtualización Completa: Se incorpora a Xen la posibilidad de utilizar las tecnologías de virtualización asistida por Hardware (CPU) de Intel-VT y AMD-V, con lo cual se permite ejecutar clientes «no-modificados» sobre la máquina host, con esta técnica se puede ejecutar cualquier sistema operativo.
A partir del kernel 2.6.32, todo kernel Linux puede ser ejecutado «paravirtualizado» sobre un hypervisor, puesto que los «parches» de soporte para paravirtualización han sido incorporados al upstream del kernel.
Instalación de Xen
* paquetes requeridos:
aptitude install xen-tools xen-qemu-dm xen-utils \ xen-utils-common xenstore-utils xen-linux-system \ xen-hypervisor
* Debemos reiniciar con el nuevo kernel Xen 4.0
Nota: GNU/Linux Debian coloca el Kernel Xen 4.0 de cuarto en la lista del grub (y no de primero), así que habrá que modificar las reglas del grub en /etc/default/grub).
Al iniciar, verificamos que estamos en el nuevo kernel:
uname -r 2.6.32-5-xen-amd64
Y las capacidades que soporta Xen:
xm info host : lab.cantv.com.ve release : 2.6.32-5-xen-amd64 version : #1 SMP Wed Jan 12 05:46:49 UTC 2011 machine : x86_64 nr_cpus : 2 nr_nodes : 1 cores_per_socket : 2 threads_per_core : 1 cpu_mhz : 1596 hw_caps : bfebfbff:20100800:00000000:00000940:0000e3bd:00000000:00000001:00000000 virt_caps : hvm total_memory : 4022 free_memory : 900 node_to_cpu : node0:0-1 node_to_memory : node0:900 node_to_dma32_mem : node0:834 max_node_id : 0 xen_major : 4 xen_minor : 0 xen_extra : .1 xen_caps : xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64 xen_scheduler : credit xen_pagesize : 4096 platform_params : virt_start=0xffff800000000000 xen_changeset : unavailable xen_commandline : placeholder cc_compiler : gcc version 4.4.5 (Debian 4.4.5-10) cc_compile_by : waldi cc_compile_domain : debian.org cc_compile_date : Wed Jan 12 14:04:06 UTC 2011 xend_config_format : 4
Entre las que se cuenta, virt-caps: HVM (soporte a virtualización por Hardware para arquitecturas x86 y x86_64).
Configuración
Editamos el archivo /etc/xen/xend-config.sxp y habilitamos el demonio XML-RPC (que utilizar libvirt, virt-manager y otras herramientas para gestionar Xen).
(logfile /var/log/xen/xend.log) (xend-unix-server yes) (xend-tcp-xmlrpc-server yes) (xend-unix-xmlrpc-server yes) (xend-unix-path /var/lib/xend/xend-socket) (xend-tcp-xmlrpc-server-address 'localhost') # use 0.0.0.0 para escuchar por todas las IP (xend-tcp-xmlrpc-server-port 8006) (xend-port 8000)
* Si deseamos que Xen gestione el bridge, descomentamos
(network-script network-bridge)
* Y reiniciamos el demonio xend
/etc/init.d/xend restart
* Verificamos el demonio TCP:
lsof -i tcp COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME xend 1462 root 32u IPv4 7423 0t0 TCP localhost:8006 (LISTEN)
Y el socket Unix:
file /var/lib/xend/xend-socket /var/lib/xend/xend-socket: socket
Con estas modificaciones, ya podemos configurar xen-tools para la creación de máquinas virtuales.
KVM
KVM es una solución para implementar virtualización completa (virtualización asistida por hardware) sobre arquitecturas x86. ha estado presente en el kernel Linux desde la versión 2.6.20
Permite ejecutar maquinas virtuales utilizando imágenes de disco, con Sistemas operativos sin modificar, requiere que soporte virtualización por CPU, tecnologías de AMD-V e Intel-VT.
Intel > E6300, L7000 y T5600
KVM utiliza como «front-end» (panel de administración) una versión modificada de QEMU, aunque recientemente ha incorporado su propio set de librerías.
El módulo del kernel que gestiona la virtualización se llama KVM:
modinfo kvm
filename: /lib/modules/2.6.32-5-xen-amd64/kernel/arch/x86/kvm/kvm.ko
license: GPL
author: Qumranet
Y hay módulos especificos para Intel y AMD:
modinfo kvm_intel
filename: /lib/modules/2.6.32-5-xen-amd64/kernel/arch/x86/kvm/kvm-intel.ko
license: GPL
author: Qumranet
depends: kvm
NOTA: tome en cuenta que por medidas de seguridad, XEN deshabilita KVM para poder habilitar sus caracteristicas de HVM (basadas en KVM).
Instalación de KVM
Paquetes requeridos:
aptitude install kvm qemu-kvm
* Si su CPU no soporta KVM, verá un mensaje semejante a este:
Your system does not have the CPU extensions required to use KVM. Not doing anything. … failed!
QEMU
Qemu no es una tecnología de virtualización, pero si de emulación de otros sistemas e incluso arquitecturas, permite emular arquitecturas como MIPSEL, ARM, PPC y otras.
Instalación de Qemu
aptitude install qemu grub-firmware-qemu \ etherboot-qemu qemu-system qemu-user qemu-utils \ qemuctl seabios vgabios xen-qemu-dm-4.0
Notas:
* Xen requiere de xen-qemu-dm-4.0 para activar sus capacidades de virtualización completa
* seabios incorpora emulación para diversos tipos de BIOS
VirtualBox
Popular herramienta de virtualización (muy utilizada en Escritorio, aunque puede correr en modo consola mediante la herramienta vboxmanage), desarrollada por Sun Microsystem (actual parte de Oracle Corp) en la cual, se hace uso de la técnica de «virtualización por Sistema Operativo», esto es, una forma de emulación o «virtualización de nivel 2», utilizando para ello un «microkernel» para la ejecución de sistemas invitados «no modificados», su modo, comportamiento y rendimiento es semejante al de VMWare ESX, sin embargo, VMWare ESX levanta su propio Linux 2.4 (basado en Red Hat) y luego su propio microkernel (vmkernel), en cambio, VirtualBox aprovecha el S.O. Linux subyacente e incorpora un módulo de kernel (vboxdrv) para levantar su propio «microkernel».
Existe una versión GPLv2 llamada VirtualBox OSE edition y es capaz de virtualizar Linux, MS Windows, Sun Solaris, freeBSD y otros.
Instalación
nota: Se requieren los headers del kernel, en nuestro caso:
aptitude install linux-headers-2.6-xen-amd64 \ linux-headers-2.6.32-5-common-xen build-essential fakeroot
Luego de instalado, instalamos virtualbox-OSE (Open Source Edition):
aptitude install virtualbox-ose virtualbox-ose-dkms virtualbox-guest-additions
Nota: con los guest-additions, se incorporan drivers «modificados» para diversos sistemas operativos, que incluyen tarjetas de sonido, video acelerado y otras opciones.
Luego de construido el módulo, este aparece en nuestro kernel:
modinfo vboxdrv filename: /lib/modules/2.6.32-5-xen-amd64/updates/dkms/vboxdrv.ko version: 3.2.10_OSE (0x00140001) license: GPL description: Oracle VM VirtualBox Support Driver author: Oracle Corporation
Y se indica que cargue al arranque en /etc/default/virtualbox-ose
# Set this to 1 if you would like the virtualbox-ose # modules to be loaded by the init script. LOAD_VBOXDRV_MODULE=1
Y verificamos su funcionamiento con:
vboxmanage list systemproperties
Y responde:
Oracle VM VirtualBox Command Line Management Interface Version 3.2.10_OSE (C) 2005-2010 Oracle Corporation All rights reserved. Minimum guest RAM size: 4 Megabytes Maximum guest RAM size: 16384 Megabytes Minimum video RAM size: 1 Megabytes Maximum video RAM size: 256 Megabytes Minimum guest CPU count: 1 Maximum guest CPU count: 32 Maximum VDI size: 2097151 Megabytes Maximum Network Adapter count: 8 Maximum Serial Port count: 2 Maximum Parallel Port count: 2 Maximum Boot Position: 4 Maximum IDE Controllers: 1 Maximum IDE Port count: 2 Maximum Devices per IDE Port: 2 Maximum SATA Controllers: 1 Maximum SATA Port count: 30 Maximum Devices per SATA Port: 1 Maximum SCSI Controllers: 1 Maximum SCSI Port count: 16 Maximum Devices per SCSI Port: 1 Maximum SAS Controllers: 1 Maximum SAS Port count: 8 Maximum Devices per SAS Port: 1 Maximum Floppy Controllers: 1 Maximum Floppy Port count: 1 Maximum Devices per Floppy Port: 2 Default machine folder: /root/.VirtualBox/Machines Default hard disk folder: /root/.VirtualBox/HardDisks VRDP authentication library: VRDPAuth Webservice auth. library: VRDPAuth Log history count: 3
Así, podemos contar con XEN, KVM(hvm), QEMU, VirtualBox y LXC en el mismo equipo!.
Conclusiones
Combinando diversos modos de virtualización se puede contar con una rápida implementación en sistemas en desarrollo, el aprovechamiento máximo de las plataformas de desarrollo y la posibilidad (a través de libvirt) de gestionar diversos tipos de virtualización en un mismo equipo, mejorando nuestra administración y simplificando procesos.
En una próxima entrega hablaremos de la creación y gestión de diversas máquinas virtuales en los diversos métodos y el uso de LIBVIRT para la gestión de todos ellos.
Excelente, no conocía el LXC. Espero con ansias la próxima entrega. Gracias por la información y por compartirla.
Excelente…. y para cuando la próxima entrega…..??’
Muy buen material.
Saludos
Jesús, buen resumen de las tecnologías de virtualización.
Solo quería añadir lo siguiente: En la sección de configuración de Xen no se recomienda, al menos en Debian Squeeze, descomentar la opción
(network-script network-bridge)
en el fichero/etc/xen/xend-config.sxp
según se desprende de/usr/share/doc/xen-utils-common/README.Debian
. Puesto que a diferencia del paquete upstream de Xen, Debian no cambia la configuración de la red de ninguna manera. Por lo tanto, habilitar(network-script network-bridge)
puede funcionar o no.En algunas instalaciones habilitar esta opción no me ha funcionado, es por ello que ahora vengo utilizando
bridge-utils-interfaces
el cual se integra de manera perfecta con los comandosifup
,ifdown
. De hecho, crear el bridge es tan sencillo como:En efecto, el script de network-bridge «funcionaba» en Debian Lenny, aun me funciona en squeeze pero para ciertas configuraciones es mejor comentarlo y crear tu propio bridge.
En mi caso, estoy preparando un segundo capítulo sobre networking en virtualización (bonding, trunking, bridges, NAT, VLANs, etc), espero terminarlo para hoy …
Gracias por el comentario!
Excelente articulo para lo que intentamos iniciar en esto de la virtualizacion, por falta de recursos de hardware y como defensor del ahorro energético en nuestra unica y contaminada nave espacial.. como da a conocer un maestro del periodismo WM.
Unavez mas gracias, estare haciendo algunas pregunta si no es mucha molestia…!!
Gran trabajo. Sería fantastico una comparativa de los posibles almacenamientos, bajo XEN, desde la perspectiva del rendimiento. Supuesto que tenemos un almacenamiento centralizado (cabina de disco) para poder hacer migración de máquinas virtuales en caliente comparar:
1.- imagen de disco sobre disco en la cabina ofrecido vía iscsi
2.- imagen de disco sobre disco en la cabina ofrecido vía NFS
3.- imagen de disco sobre disco en la cabina ofrecido vía SAMBA
4.- Partición manejada por la máquina virtual ofrecida vía iscsi (fast eth / 1 Geth / 10 Geth)
5.- Partición manejada por la máquina virtual ofrecida vía FC 2/4/8 GB
Unas pruebas básicas se podrían hacer con Openfiler o con FreeNAS o cualquier otro similar.
¿Alguien tiene medios para hacer las pruebas?
No creas que no sería fantástico hacer una comparativa así … la cosa es conseguir «donde» hay tal cantidad de hardware heterogéneo para hacer todo funcionar …
Saludos!
Gracias por el post, aun hoy sirve!!
Seria mucho preguntar, ¿Cual es la diferencia entre LXC y Xen?
Si deseo tener servicios como cups o apache, seria buena idea la virtualizacion, o ya estos servicios son demasiado «grandes» para una virtualizacion ???
Gracias
LXC es un sistema de contenedores (imagina una jaula chroot linux, pero con red y acceso a recursos), en cambio Xen es una virtualización tipo uno, objetiva y completa, la VM jamás se entera que está accediendo a hardware virtual y no real …
CUPS y Apache no son servicios grandes, al contrario, son del tipo de servicios que SIEMPRE se virtualizan, por multiplicidad de razones (nubes, alta disponibilidad, failover y tolerancia a fallos, etc).
Si, si tienes un buen hardware, siempre es bueno virtualizar …
Sin dejar a un lado el hecho de poder virutalizar y hacer clustering i tienes unos buenos hierros
Ups!, y disculpa el retraso en responder, no había visto este comentario! … mil disculpas!.
Buenas noches, como se puede instalar una red con maquinas virtuales, para que cada terminal de la red acceda a cada una de las maquinas virtuales del servidor
Lo ideal es usando un protocolo como SPICE de redhat
Excelente artículo y lo he leído varias veces y sin embargo NO termino de decidirme entre XEN y LXC!!
Actualmente vendo Wi-Fi por mi casa y tengo un E7300 (core 2 Duo), 4 GB RAM, AsRock G31 s3, 160GB DD (sist) + 1TB DD (Caché) que lo uso como proxy-caché (ThunderCache corriendo en FreeDBS para ser exacto) ahorita tengo la idea de montar un FTP con acceso sólo de la LAN para compartir vídeos y música, como mi hardware NO usa ni el 15% de su capacidad quiero virtualizar para optimizar.
Si alguien me da alguna sugerencia porque no sé por donde empezar le agradecería.