Virtualización de Servidores con KVM en Debian Lenny
La gran mayoría de servidores actuales, posee la potencia suficiente y cantidad de memoria, para poder virtualizar máquinas y en estas correr instancias de sistemas operativos. De esta manera podremos sacarle más provecho a nuestro hardware, y posiblemente reducir costos.
En mi caso de ejemplo, antes usaba 3 máquinas para mi trabajo de desarrollo de software, (1) Mi portátil, en el cual tengo todo lo de producción, el código final, las release oficiales. (2) El servidor de pruebas, (3) El servidor de integración. Pero eso, es historia pasada XD, ahora las dos últimas corren virtualizadas en el portátil (DELL inspiron, 2Gb RAM, Athlon 64 X2).
El siguiente articulo explicará como instalar, crear y configurar maquinas virtuales en un servidor Debian GNU/Linux, utilizando KVM. Estas maquinas virtuales se podrán usar y serán visibles como cualquier otro host de la red.
Para este tutorial necesitamos
1 – Servidor con el sistema Debian (Lenny) base instalado, no es necesario entorno gráfico
2 – Computador con cliente VNC (vncviewer, xtightvncviewer, etc), y cliente ssh.
POR QUE KVM
Las alternativas libres de alto rendimiento que tenemos son 3 (En mi opinión las más importantes):
1 – Virtual Box: Desarrollado por la empresa innotek GmbH, pero SUN Microsystems lo compro, y ahora Oracle compro a SUN… mmmm.. muchos intereses de por medio, no quiero correr riesgos, descarte su uso sin probarlo :D.
2 – XEN: Desarrollado por la Universidad de Cambridge. En este caso Citrix lo compro en el 2007. Citrix cerro el proyecto, tiene un producto gratuito, el XenServer Express Edition, aunque solo puede soportar cuatro máquinas virtuales.
Las versiones actuales se basan en el código ante de su cierre. XEN es el de más alto rendimiento (sin embargo KVM lo supera en varios aspectos).
En el caso de Debian requiere unas versiones empaquetadas especiales del Kernel:
Etch: xen-linux-system-2.6.18-6-xen-686 and xen-linux-system-2.6.18-6-xen-amd64.
Lenny: xen-linux-system-2.6.26-2-xen-686 and xen-linux-system-2.6.26-2-xen-amd64
Y esto fue lo que no me convenció, tener que usar un kernel especifico, en algunas pruebas, después de instalar el kernel el sistema no arranco! Se imaginan si hubiese sido en un servidor remoto!!!. Obviamente buscando en Internet encontré bastante documentación a los problemas que se me presentaban (que fueron bastantes), entonces eran muchos riesgos para una instalación remota, descarte su uso.
3 – KVM (Kernel virtual Machine): Desarrollado por la empresa Qumranet. KVM, como su nombre lo indica, hace parte del núcleo (desde la versión 2.6.20) y herramientas en el espacio de usuario. Por lo tanto no tengo que cambiar el Kernel en ejecución!. La única pega es que requiere un procesador x86 con soporte Virtualization Technology. Sin embargo la mayoría de los procesadores actuales lo soportan, sin embargo si tu procesador es anterior al 2008, lo más probables es que no funcione.
Se está trabajando para utilizar más características de la Virtualization Technology, por lo tanto el tema de rendimiento (que en mis pruebas es más que satisfactorio para usar en producción) mejorara constantemente.
INSTALACIÓN DE KVM Y CONFIGURACIÓN DE RED EN EL SERVIDOR
Asumimos que el servidor tiene el servicio ssh, y podemos acceder a él.
Desde el computador cliente accederemos al servidor para configurar todo lo que necesitamos, aunque esto se puede hacer desde el propio servidor, incluso con herramientas gráficas. Este tutorial esta previsto para el caso que solo tengamos acceso ssh al servidor, es un servidor decente, por ende, no tiene entorno gráfico XD.
Una vez el en servidor;
Detectamos si nuestro procesador soporta virtualización de Hardware
egrep '(vmx|svm)' --color=always /proc/cpuinfo
En mi caso, tengo un procesador AMD Athlon(tm) 64 X2 Dual-Core (se puede ver con cat /proc/cpuinfo), y la salida es la siguiente:
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 rep_good pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch
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 rep_good pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch
Lo cual significa que si soporta virtualización. Si al ejecutar el comando no produce ninguna salida, puede llorar, su hardware no soporta virtualización y NO HAY NADA QUE HACER!
, lo más probable es que estés trabajan en un procesador un poco viejo, por ejemplo el procesador de mi Desktop ( AMD Sempron) no lo soporta :'( …
Si tenemos suerte, continuamos
// Como buenos Debianitas, primero actualizamos lista de paquetes
apt-get update
// luego instalamos el módulo y utilidades de red
apt-get install kvm bridge-utils
Ahora tenemos que establecer un puente (bridgue) de red en nuestro servidor, para que nuestras máquinas virtuales se puede acceder desde otros hosts como si se trataran de sistemas físicos de red.
Para eso editamos el clásico archivo /etc/network/interfaces:
Por ejemplo, en mi caso esta asi
cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.0.2
netmask 255.255.255.0
gateway 192.168.0.1
Lo editamos ( vi /etc/network/interfaces), modificando algunas lineas para que quede así:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet static
address 192.168.0.2
netmask 255.255.255.0
gateway 192.168.0.1
bridge_ports eth0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off
Obviamente, se debe acondicionar los archivos a su direccionamiento IP.
Después de editado, reiniciamos la red
/etc/init.d/networking restart
Y listo, si ejecutáramos el comando ifconfig, veríamos algo como esto (atención a la interfaz br0):
br0 Link encap:Ethernet HWaddr 00:1c:23:92:4e:d8
inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::21c:23ff:fe92:4ed8/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:18143 errors:0 dropped:0 overruns:0 frame:0
TX packets:27478 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1084126 (1.0 MiB) TX bytes:16915847 (16.1 MiB)
eth0 Link encap:Ethernet HWaddr 00:1c:23:92:4e:d8
inet6 addr: fe80::21c:23ff:fe92:4ed8/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:112400 errors:0 dropped:0 overruns:0 frame:0
TX packets:92086 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:144800236 (138.0 MiB) TX bytes:22306616 (21.2 MiB)
Interrupt:21
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:42 errors:0 dropped:0 overruns:0 frame:0
TX packets:42 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2908 (2.8 KiB) TX bytes:2908 (2.8 KiB)
TRABAJANDO CON MAQUINAS VIRTUALES
Antes que nada necesitamos una partición, o un archivo para que sea usado por la máquina virtual como disco duro, en el caso de usar un archivo, ejecutamos:
qemu-img create disk.deb 4G
El anterior comando crea un archivo, que la maquina virtual interpretara como un disco de 4Gb. Por cada máquina que virtualicemos, obiamente debemos crear su archivo
En nuestro ejemplo, instalaremos un sistema Debian en nuestra maquina virtual (Debian virtualizando Debian, que bonito :P ). Para eso necesitamos descargar una imagen ISO del instalador, en mi caso descargue la ISO del netinstall en la carpeta /home
El comando kvm, trae infinidad de opciones interesantes ( man kvm-qemu ).
Para virtualizar una máquina con 256Mb de Ram, con un adaptador de red Realtek compatible, que arranque desde CDROM, y que el CDROM sea nuestra imagen ISO, ejecutamos:
kvm -hda disk.deb -cdrom /home/debian-501-i386-netinst.iso -boot d -m 256 -net nic,vlan=0,model=rtl8139 -net tap,vlan=0 -vnc :0
Como podemos ver, el final agregamos –vnc :0, lo cual significa que podremos desde ya conectarnos vía VNC al servidor como nuestro cliente de preferencia, desde aca podremos seguir la instalación de Debian sin ninguna novedad! En hora buena.
Después de haber instalado el sistema base, ya no es necesario arrancar desde el CDROM, por lo tanto, siempre que se quiera arrancar esta máquina y acceder desde VNC, ejecutamos:
kvm -hda disk.deb -boot c -m 256 -net nic,vlan=0,model=rtl8139 -net tap,vlan=0 -vnc :0
Nótese que al parametro -boot, se cambio por “c “,. Boot permite los siguiente parametros:
Boot on floppy (a), hard disk (c), CD-ROM (d), or Etherboot (n).
Muy seguramente después de configurada nuestra máquina, algunas veces necesitamos iniciarla sin sesión VNC, o por cuestiones de seguridad. Además también podremos necesitar que corra en modo daemon, entonces ejecutamos:
kvm -hda disk.deb -boot c -m 256 -net nic,vlan=0,model=rtl8139 -net tap,vlan=0 -vnc none -daemonize
Este comando lo podríamos poner (tantas veces como sea necesario por cada maquina) en los scripts de arranque del sistema para que inicien siempre junto con el servidor.
NOTA FINAL
Vimos el funcionamiento básico de virtualización con KVM, para casos de manejar muchas maquinas virtuales, existen front-ends que facilitan mucho el trabajo (virt-install, virt-manager, etc). Tambien se pueden setear inumerables parametros en las maquinas a virtualizar, como en numero de cores del procesador, parametros avanzados de red, más seguridad a VNC, etc.
Dudas, comentarios, sugerencias?
http://www.linux-kvm.org
http://blog.bodhizazen.net/linux/how-to-run-kvm-without-x/
http://www.phoronix.com/scan.php?page=article&item=623&num=4