Revisión del tipo de virtualización soportado por la máquina Primero hay que revisar si hay soporte en Hardware para la virtualización, usando para ello: $ egrep "vmx|svm" /proc/cpuinfo Si se soporta la virtualización por Hardware aparecerá la bandera Procesadores INTEL: vmx Procesadores AMD: svm Instalar y usar máquinas virtuales Por omisión los equipos de tecnología de bajo desempeño no soportan la virtualización a nivel de Hardware, pero siempre es posible su emulación mediante QEMU. Si la computadora soporta virtualización a nivel de Hardware es posible usar KVM (o en QEMU la bandera -enable-kvm). Según la versión de Linux, KVM puede existir como un paquete real o como uno virtual, si es virtual, al instalar KVM lo que realmente se instala es QEMU y al correr KVM por ejemplo $ kvm es remplazado por $ qemu-system-x86_64 -enable-kvm estos tienen la misma sintaxis de uso, y para nuestros ejemplos sólo es necesario remplazar qemu-system-x86_64 por kvm y en ambos siempre se usará qemu-img para manipular las imágenes. Instalación de KVM (recomendado para virtualización por Hardware) # aptitude install kvm Instalación de QEMU (permite emular diversas arquitecturas de Hardware) # aptitude install qemu Nota: El desempeño de la emulación versus virtualización por Hardware es de varios ordenes de magnitud menor, pero una imagen creada con cualquiera de ellos es usable con los otros virtualizadores. KVM sólo soporta virtualizar arquitecturas X86-64 de INTEL y AMD, QEMU emula diversas arquitecturas, como son ARM, CRIS, i386, M68k, MicroBlaze, MIPS, PowerPC, SH4, SPARC y x86-64. Algunos problemas con KVM Si se detectan las banderas para virtualización por Hardware y al tratarlo de usar KVM marca: > open /dev/kvm: Permission denied > Could not initialize KVM, will disable KVM support Sólo hay que agregar, el login del usuario al grupo kvm en el archivo /etc/group Si marca: > open /dev/kvm: No such file or directory > Could not initialize KVM, will disable KVM support Sólo hay que activar en el BIOS la virtualización por Hardware En el caso de querer usar un procesador particular en KVM y marca que algunas banderas no estan soportadas, por ejemplo, al usar un procesador AMD y hacer uso del procesador Nehalem Intel Core i7 9xx (Nehalem Class Core i7), mediante: $ kvm -cpu Nehalem -cdrom TinyCore-current.iso ó $ qemu-system-x86_64 -enable-kvm -cpu Nehalem -cdrom TinyCore-current.iso es común que marque: warning: host doesn't support requested feature: CPUID.01H:ECX.ssse3 [bit 9] warning: host doesn't support requested feature: CPUID.01H:ECX.sse4.1|sse4_1 [bit 19] warning: host doesn't support requested feature: CPUID.01H:ECX.sse4.2|sse4_2 [bit 20] si es necesario usar dichas banderas en el CPU, entonces usar: $ qemu-system-x86_64 -cpu Nehalem -cdrom TinyCore-current.iso en este caso avisará que: warning: TCG doesn't support requested feature: CPUID.01H:EDX.vme [bit 1] i.e. soporta el chip, pero no la virtualización (vme: Virtual Mode Extensions [8086 mode]), se sacrifica velocidad en arás de tener las prestaciones del chip emulado. Usando un USB/CD live como una máquina virtual En el caso de tener un USB/CD live y se quiera correr su contenido desde una máquina virtual con QEMU o KVM solo es necesario montar el USB/CD, conocer el dispositivo mediante $ df y usar ese dispositivo en $ kvm -m 512 -usb /dev/sddx Usando un archivo ISO como una máquina virtual En el caso de tener un archivo ISO y se quiera correr su contenido desde una máquina virtual con QEMU o KVM solo es necesario (si el archivo es ubuntu-11.10-desktop-i386.iso) $ kvm -m 512 -cdrom ubuntu-11.10-desktop-i386.iso Un ejemplo completo de instalación y uso de una máquina virtual para Debian estable a partir del archivo ISO bajado de la red, necesitamos hacer lo siguiente Generar un disco virtual, por ejemplo de 10 GB $ qemu-img create -f qcow2 debianStable.img 10G Instalar la imagen de Debian estable en un disco virtual $ kvm -no-reboot -boot d -cdrom debian-802-i386-netinst.iso -hda debianStable.img -m 300 Después de la instalación, es conveniente compactar y desfragmentar la imagen usando $ qemu-img convert -c debianStable.img -O qcow2 debian.img Usar Debian estable $ kvm -hda debian.img -m 400 Otro ejemplo completo de instalación y uso de una máquina virtual para Windows XP, en este caso necesitamos Crear la disco virtual, por ejemplo de 10 GB $ qemu-img create -f qcow2 WindowsXP.img 10G Hacer la instalación básica de Windows XP a partir, por ejemplo del ISO $ kvm -no-reboot -cdrom es_winxp_pro_with_sp2.iso -boot d -hda WindowsXP.img -m 400 -localtime Concluir la instalación de Windows XP $ kvm -no-reboot -boot c -hda WindowsXP.img -cdrom es_winxp_pro_with_sp2.iso -m 400 -localtime Después de la instalación, es conveniente compactar y desfragmentar la imagen usando $ qemu-img convert -c WindowsXP.img -O qcow2 Windows.img Uso de máquina virtual de Windows XP $ kvm -boot c -hda Windows.img -m 400 -localtime Una vez que se cuenta con una imagen de Windows, podemos instalar por ejemplo Office Instalar Windows Office 2003, aquí suponemos que tenemos un ISO de Office $ kvm -localtime -m 300 -boot c -hda Windows.img -cdrom Office-2003.iso Si se tiene el CDROM, entonces podemos usar $ kvm -localtime -m 300 -boot c -hda Windows.img -cdrom /dev/cdrom/ En el caso de Windows hay que usar el mismo Hardware siempre, en caso contrario marca que es necesario registrar el sistema operativo nuevamente al correrlo en otra arquitectura, para ello se usa la bandera -cpu, al momento de crearlo y usarlo, por ejemplo: Usar máquina virtual de Windows en QEMU y KVM usando el mismo Hardware $ kvm -localtime -m 400 -boot c -hda Windows.img -cpu qemu32 $ qemu-system-x86_64 -localtime -m 400 -boot c -hda Windows.img -cpu qemu32 $ qemu-system-x86_64 -enable-kvm -localtime -m 400 -boot c -hda Windows.img -cpu qemu32 Para conocer los CPUs soportados usar $ kvm -cpu ? Para conocer las máquinas soportadas usar $ kvm -machines ? Otro ejemplo completo de instalación y uso de una máquina virtual para Windows 7, en este caso necesitamos Crear la disco virtual, por ejemplo de 15 GB $ qemu-img create -f qcow2 Windows7.img 15G Hacer la instalación básica de Windows 7 a partir, por ejemplo del DVD $ kvm -no-reboot -cdrom /dev/cdrom -boot d -hda Windows7.img -m 500 -localtime Concluir la instalación de Windows 7 $ kvm -no-reboot -boot c -hda Windows7.img -cdrom /dev/cdrom -m 500 -localtime Después de la instalación, es conveniente compactar y desfragmentar la imagen usando $ qemu-img convert -c Windows7.img -O qcow2 Windows.img Uso de máquina virtual de Windows 7 $ kvm -boot c -hda Windows.img -m 500 -localtime Manipulación del estado de la máquina virtual La virtualización permite manipular el estado de una maquina en ejecución, por ejemplo, una vez que se esta corriendo una máquina virtual $ kvm -boot c -hda .img -m 400 -localtime es posible manipular el estado de la misma en algún punto de su ejecución al usar la combinación de teclas: [Ctrl] + [Alt] + [2] ya en ella, podemos detener y grabar el estado de la máquina virtual: savevm test.vm quit para que en otro momento, podamos restaurar la máquina virtual tal como estaba cuando esta se detuvo: $ kvm -boot c -hda .img -m 400 -localtime -loadvm test.vm Optimización de imágenes Las imágenes de disco de KVM/QEMU después de generarlas (al instalar algún sistema operativo) estas, tienen muchos archivos dispersos, para optimizar su rendimiento es recomendable convertir la imagen dispersa en una que no tenga esta propiedad, mediante $ qemu-img convert disk-sparse.img -O qcow2 disk.img o puede ser compactada, mediante $ qemu-img convert -c disk-sparse.img -O qcow2 disk.img la cual decrecerá el tamaño, Para descompactar una imagen e incrementar la velocidad de uso, mediante: $ qemu-img convert disk-compact.img -O qcow2 disk.img Trabajar con una imagen virtual sin que se altere esta Es muy deseable al trabajar con una máquina virtual, el dejar la información de la máquina virtual base intacta y guardar los cambios que se requieran en otro archivo, una forma es hacer una copia y trabajar con la copia de esta o crear un archivo que almacene por separado los cambios a la imagen, para esto último usar: $ qemu-img create -b debianStable.img -f qcow2 debian.img y trabajar con la imagen que resultante (para este ejemplo debian.img) Algunos problemas comunes con la red Por lo general las máquinas virtuales detectan correctamente la red, pero en el caso de Windows esto no siempre pasa, por ello es común emular una tarjeta de red lo más genérica posible, esta puede ser RTl8139, para ello es necesario que al lanzar la máquina virtual se indique -net nic,model=rtl8139 -net user, por ejemplo: $ kvm -boot c -hda WindowsXP.img -m 400 -localtime -net nic,model=rtl8139 -net user algunas de las otras opciones para la red son: NE2000 PCI, RTL8139, PCNET y NE2000 ISA. Aumento de desempeño La virtualización normalmente es rápida, pero en algunas circunstancias se hace lenta generalmente esto es ajeno a KVM/QEMU y generalmente es por la constante grabación de pequeños paquetes de datos al disco duro por parte de la máquina virtual. Por optimizar el desempeño de la máquina virtual es posible pedirle a KVM/QEMU que trate de usar un cache y baje lo menos posible a disco la información, esto aumentara notablemente el desempeño de la máquina virtual. Para aumentar el desempeño, en lugar de usar $ kvm -boot c -hda WindowsXP.img -m 400 Usar $ kvm -drive file=WindowsXP.img,cache=writeback,media=disk -m 400 En el caso de usar un archivo ISO, usar $ kvm -m 512 -drive file=fedora.iso,cache=writeback,media=cdrom Otro ejemplo completo de instalación y uso de una máquina virtual (por ejemplo para UBUNTU 11.10) usando el cache, en este caso necesitamos Generar un disco virtual, por ejemplo de 10 GB $ qemu-img create -f qcow2 disco.img 10G Instalar la imagen de UBUNTU en un disco virtual $ kvm -no-reboot -boot d -drive file=ubuntu-11.10-desktop-i386.iso,cache=writeback,media=cdrom \ -drive file=disco.img,cache=writeback,media=disk -m 500 & Después de la instalación, es conveniente compactar y desfragmentar la imagen usando $ qemu-img convert -c disco.img -O qcow2 Ubuntu.img Usar Debian estable (aquí, se usa el cache para acelerar el desempeño de KVM) $ kvm -drive file=Ubuntu.img,cache=writeback,media=disk -m 500 Mejorando el desempeño del vídeo de la máquina virtual Por omisión se tiene un tarjeta gráfica de pobre desempeño en la máquina virtual, si se necesita mayor resolución en la salida gráfica, una opción es usar la opción -VGA, donde dos de sus posibilidades es STD o VMWARE usándose como: $ kvm -vga std -m 512 -drive file=fedora.iso,cache=writeback,media=cdrom o $ kvm -vga vmware -m 512 -drive file=fedora.iso,cache=writeback,media=cdrom Uso de tarjeta de sonido dentro de KVM/QEMU Por omisión el uso de la tarjeta de audio no esta habilitada, para habilitarla usar en la linea de comandos: -soundhw sb16,es1370,adlib por ejemplo $ kvm -boot c -hda Windows.img -m 400 -localtime -soundhw sb16,es1370,adlib Uso de la virtualización dentro de una virtualización Algunas veces es necesario tener activa la virtualización dentro de otra virtualización, esto se logra mediante, por ejemplo, para un procesador AMD $ kvm -m 128 -cdrom TinyCore-current.iso -cpu phenom,+svm Uso de VNC como salida gráfica de la virtualización Si se desea usar VNC como visualizador de la salida gráfica de KVM, primero se debe instalar un cliente de VNC, por ejemplo vncviewer, usando # aptitude install vncviewer Entonces, para correr la maquina virtual usamos $ kvm -m 128 -cdrom TinyCore-current.iso -cpu kvm64 -vnc :0 Y para ver la salida gráfica usamos $ vncviewer 0 Uso de SSH para correr una máquina virtual de forma remota Si se tiene acceso a un servidor mediante SSH en el cual este activo X11 forwarding e instalado KVM/QEMU, entonces es posible correr una maquina remota en el servidor y visualizar la salida gráfica en la máquina donde se corre el comando SSH. Primeramente, al hacer la conexión mediante SSH, es necesario solicitar en la conexión se habilite X11 forwarding mediante $ ssh -X -l usr 192.168.13.230 Después de hacer la conexión, ya podemos correr la máquina virtual como se indico antes $ kvm -m 128 -cdrom TinyCore-current.iso & Interacción de VirtualBox en KVM/QEMU Uno de los manejadores de máquinas virtuales más conocidos es VirtualBox (https://www.virtualbox.org/) que dispone de diversas imágenes funcionales listas para descargar y usar (https://virtualboxes.org/images/) de varias decenas de distribuciones de Linux. Es por ello que KVM/QEMU ha desarrollado formas de usar, convertir y migrar máquinas de VirtualBox y otros manejadores de máquinas virtuales con un mínimo de esfuerzo, ejemplo de ello es que se puede descargar cualquier imagen VDI de VirtualBox y usarlo directamente en KVM usado la misma sintaxis que con sus propias máquinas virtuales. Ejemplo de ello, es descargar (https://virtualboxes.org/images/lubuntu/) LUBUNTU 12.10 (http://sourceforge.net/projects/virtualboximage/files/Lubuntu/12.10/lubuntu1210.7z/download), descomprimir el archivo lubuntu1210.7z y esto dejará la imagen de VirtualBox de LUBUNTU cuyo nombre es lubuntu1210.vdi. Entonces esta imagen (lubuntu1210.vdi) la usaremos directamente usando KVM/QEMU mediante: $ kvm -m 2000 -hda lubuntu1210.vdi o $ qemu-system-x86_64 -enable-kvm -m 2000 -hda lubuntu1210.vdi Nota: esta imagen usa: (username/password): lubuntu/lubuntu Algunas veces es necesario montar y extraer el contenido de un disco virtual, supongamos que tenemos una maquina virtual de VirtualBox y queremos ver su contenido, para ello usamos $ qemu-img convert diskname.vmdk -O qcow2 diskname.qcow2 o para raw $ qemu-img convert diskname.vmdk -O raw diskname.raw Instalar nbd-client # apt-get install nbd-client Después # qemu-nbd --connect=/dev/nbd0 /mnt/kvm/diskname.qcow2 # fdisk /dev/nbd0 -l # sudo mount /dev/nbd0p1 /mnt/somepoint/ # umount /mnt/somepoint/ Algunos otras opciones Lanzar KVM con dos procesadores, 1536 MB de RAM, dispositivo de red e1000, MAC addres 52:54:00:12:34:50, iniciando el DHCP en la dirección 10.0.2.40 y reenviando la salida del puerto 22 de la maquina virtual al 5555 del equipo huésped, mediante $ kvm -smp 2 -drive file=debianStableTmp.img,cache=writeback,media=disk \ -m 1536 -device e1000,netdev=user.0,mac=52:54:00:12:34:50 \ -netdev user,id=user.0,dhcpstart=10.0.2.40,hostfwd=tcp::5555-:22 & o lanzar kvm con dos procesadores, 1536 MB de RAM, dispositivo de red e1000 y reenviando la salida del puerto 22 de la maquina virtual al 5555 del equipo huésped $ kvm -smp 2 -drive file=debianStableTmp.img,cache=writeback,media=disk -m 1536 \ -device e1000,netdev=user.0 -netdev user,id=user.0,hostfwd=tcp::5555-:22 & el redireccionamiento de puerto puede ser hecho también con: $ kvm -m 512 -cpu phenom,+svm -hda b.qcow2 -redir tcp:5555:10.0.2.15:22 & Si se desea usar ssh y scp en la máquina virtual usar: # apt-get install openssh-server acceder usando $ ssh -p 5555 root@localhost hacer copia del equipo huésped a la maquina virtual mediante $ scp -P 5555 file.txt usr@localhost:/tmp Direcciones de red usadas en KVM/QEMU Gateway/DHCP/TFTP server: 10.0.2.2 DNS server: 10.0.2.3 Samba server: 10.0.2.4 Netmask: 255.255.255.0 Guest IP: any address above 10.0.2.15 http://www.linux-kvm.org/page/Networking Comunicación entre la máquina virtual y el sistema anfitrión Que hacer para tener comunicación entre la máquina virtual y el sistema anfitrión, hay varias maneras de hacer esto: 1) Una forma es mediante el protocolo SAMBA, NFS o SSHFS, en todos los caso se montan los recursos compartidos por algún servidor 2) Se puede usar FSDEV de KVM/QEMU que monta un recurso local mediante las siguientes indicaciones: kvm [...] -fsdev local,id=fs1,path=$HOME/code/linux,security_model=none \ -device virtio-9p-pci,fsdev=fs1,mount_tag=host-code Donde [$HOME/code/linux] es la ruta a compartir, y [host-code] es el identificador para el montaje, en la MV se puede usar $ mkdir -p /mnt/host Donde [/mnt/host] en el directorio de montaje (checar que se den los permisos pertinentes) para ahora hacer: # mount host-code -t 9p /mnt/host Para desmontar usar # umount /mnt/host 3) Leer un dispositivo USB montado en el sistema anfitrión desde la máquina virtual, para ello el dispositivo USB deberá estar conectado en la máquina anfitrión y deberá ser accesado directamente en la máquina virtual. QEMU necesita parámetros adicionales, el parámetro -usb activa el soporte en la máquina virtual de dispositivos USB. La emulación de Intel SB82371 UHCI-Controller tiene 8-puertos en el USB hub. Si se busca tener acceso a uno de los dispositivos físicos, se requiere encontrar los parámetros Vendor-ID and Product-ID. Esta información se obtiene examinando la salida del comando: # /sbin/lsusb o $ cat /proc/bus/usb/devices Entonces es posible decirle a KVM los datos de VendorID y ProductID a través de la línea de comandos $ kvm -usb -usbdevice host:: o iniciar kvm con soporte para dispositivos USB activados mediante $ kvm -usb después de iniciar la máquina virtual, cambiar al sistema de monitoreo de la máquina virtual presionando Ctrl+Alt+2 e introducir el siguiente comando usb_add host:: cuando se retorne al ambiente gráfico al teclear [Ctrl]+[Alt]+[1] se vera el mensaje de reconocimiento del dispositivo USB. Por ejemplo si se tiene una impresora HP Scanjet 3300C conectada en el puerto USB de la computadora, la salida del comando lsub es: # lsusb Bus 003 Device 002: ID 03f0:0205 ScanJet 3300C así, el comando en KVM para dejar accesible el dispositivo es: $ kvm -usb -usbdevice host:03f0:0205 4) Usar la impresora conectada en el puerto paralelo, pera ello al invocar la ejecución de la máquina virtual usar: $ kvm -parallel /dev/parport0 5) Montar el contenido de un disco virtual y poder intercambiar información entre la máquina virtual y la huésped, primero convertir el disco a formato accesible a Linux $ qemu-img convert disco.img -O raw tmp.img montar la imagen en Linux como root # mkdir disk # mount -o loop,offset=32256 tmp.img disk trabajar con la imagen montada y al terminar desmontar esta # umount ./disk y puede ser regresada al formato original mediante $ qemu-img convert -c tmp.img -O qcow2 disco.img Más información en la página: http://www.qemu.org/user-doc.html Imagenes debian kvm https://people.debian.org/~aurel32/qemu/amd64/ CDs de versiones de DEBIAN http://cdimage.debian.org/cdimage/archive/ Repositorios de DEBIAN deb http://archive.debian.org/debian-archive/debian/ sarge main contrib non-free Notas de QEMU https://wiki.debian.org/QEMU ------------------------------------------------------------------------------------------------------- Algo de linux: http://www.mmc.geofisica.unam.mx/acl/linux/ Antonio Carrillo Ledesma http://www.mmc.geofisica.unam.mx/acl/