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:<VendorID>:<ProductID> <otros parámetros>
     o iniciar kvm con soporte para dispositivos USB activados mediante
        $ kvm -usb <otros parámetros>
     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:<VendorID>:<ProductID>
     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 <otros parametros>


  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 <otros parámetros>


  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/