Virtualización con Quick Emulator (QEMU)

Quick Emulator (QEMU) es un sistema de virtualización que puede usar Kernel-based Virtual Machine (KVM), para aprovechar las instrucciones de virtualización existentes en la mayoría del hardware actual (Intel VT o AMD-V).
QEMU es un emulador de procesadores basado en la traducción dinámica de binarios (conversión del código binario de la arquitectura fuente en código entendible por la arquitectura huésped). QEMU también tiene capacidades de virtualización dentro de un sistema operativo, ya sea GNU/Linux, Windows, o cualquiera de los sistemas operativos admitidos, (de hecho es la forma más común de uso).
Kernel-based Virtual Machine o KVM, (en español, Máquina virtual basada en el núcleo) es una solución para implementar virtualización completa con Linux. Está formada por un módulo del núcleo (con el nombre kvm.ko) y herramientas en el espacio de usuario, siendo en su totalidad software libre. El componente KVM para el núcleo está incluido en Linux desde la versión 2.6.20.
Instalación y configuración
Comienza asegurándote de tener habilitado en el kernel Enable KSM for page merging, KVM for Intel processors support o KVM for AMD processors support (dependiendo del procesador que tengas) y Host kernel accelerator for virtio net.
Processor type and features  --->
        [*] Enable KSM for page merging
[*] Virtualization  --->
        <M>    KVM for Intel processors support
        < >    KVM for AMD processors support
        <M>    Host kernel accelerator for virtio net
Si estas usando un Kernel con Grsecurity como hardened-sources necesitas habilitar también Virtualization Type (Host), Virtualization Hardware (EPT/RVI Processor Support) y Virtualization Software (KVM).
Security options  --->
        [*] Grsecurity  --->
                Virtualization Type (Host)  --->
                Virtualization Hardware (EPT/RVI Processor Support)  --->
                Virtualization Software (KVM)  --->
Una vez este preparado el Kernel, carga los módulos kvm_intel o kvm_amd (si tu procesador es AMD) y vhost_net.
modprobe kvm_intel
modprobe vhost_net
Lo siguiente es realizar un emerge de Qemu, disponible en la rama estable de portage, que instalara el ebuild y las dependencias necesarias según las USEs que selecciones.
emerge -av app-emulation/qemu
Hay dos USEs QEMU_SOFTMMU_TARGETS y QEMU_USER_TARGETS con las que indicar que arquitecturas quieres que emule QEMU. La primera es para la emulación completa del sistema y la segunda para la emulación de programas del espacio de usuario. Como norma general habilita las mismas opciones en ambas USEs, en este caso i386 y x86_64.
[...]
QEMU_SOFTMMU_TARGETS="i386 x86_64"
QEMU_USER_TARGETS="i386 x86_64"
[...]
A parte de las anteriores el ebuild permite activar o desactivar muchas otras USEs, algunas mas genéricas que seguramente te suenen de otros paquetes y otras mas relacionadas con la virtualización, como las siguientes.
USEDescripción
seccompAñade seguridad evitando que llamadas maliciosas del guest dañen el host
spicePermite usar el protocolo Spice, similar a RDP o VNC
vdePermite usar el tipo de red Virtual Distributed Ethernet
vhost-netAcelera la red usando Host kernel accelerator for virtio net
virtfsPermite usar un sistema de ficheros pass-through mediante virtio-9p-pci
Para mejorar el rendimiento, se puede usar como disco duro de la maquina virtual (guest) una partición LVM (Logical Volume Manager), del servidor físico (host), que tiene que pertenecer al grupo kvm. Para mas información.
chown :kvm /dev/vg/name
No olvides sustituir vg por el nombre del grupo de volúmenes y name por el nombre correspondiente al volumen que vayas a usar y si quieres que la partición siga perteneciendo al grupo kvm tras reiniciar, crea una regla Udev como la siguiente.
ENV{DM_NAME}=="vg-name", ACTION=="change", GROUP="kvm"
Por ultimo, la red se puede configurar de muchas formas diferentes dependiendo de como quieras que funcione. En este caso se usa Virtual Distributed Ethernet (VDE).

Iniciando una maquina virtual
Antes de iniciar la maquina virtual tienes que seleccionar el hardware que quieres que tenga. Así que comienza viendo, por ejemplo, los tipos de maquinas disponibles.
qemu-kvm -machine ?
Supported machines are:
none                 empty machine
pc                   Standard PC (i440FX + PIIX, 1996) (alias of pc-i440fx-1.4)
pc-i440fx-1.4        Standard PC (i440FX + PIIX, 1996) (default)
[...]
Continua con las CPUs. A parte de las mostradas por el siguiente comando existe otra, host, con la que se le pasan al guest todas las instrucciones posibles del procesador del host. Para mas información.
qemu-kvm -cpu ?
x86           qemu64  QEMU Virtual CPU version 1.4.0
x86           phenom  AMD Phenom(tm) 9550 Quad-Core Processor
x86         core2duo  Intel(R) Core(TM)2 Duo CPU     T7700  @ 2.40GHz
x86            kvm64  Common KVM processor
x86           qemu32  QEMU Virtual CPU version 1.4.0
x86            kvm32  Common 32-bit KVM processor
[...]
Y por ultimo, los dispositivos que añadir a la maquina virtual. Todos los del tipo virtio tienen un mejor rendimiento que el resto de su misma categoría, pero requieren la instalación de drivers especiales en el guest. Para mas información.
qemu-kvm -device ?
name "VGA", bus PCI
name "usb-storage", bus usb-bus
name "tpci200", bus PCI, desc "TEWS TPCI200 IndustryPack carrier"
name "scsi-hd", bus SCSI, desc "virtual SCSI disk"
name "usb-uas", bus usb-bus
name "i82559a", bus PCI, desc "Intel i82559A Ethernet"
[...]
Como habrás imaginado el comando necesario para iniciar la maquina virtual tiene una longitud considerable, así que lo mas sencillo es crear un script básico como el siguiente. En el que se crea una VM del tipo q35 con una CPU del mismo tipo que la del host, de un solo núcleo, y 1024 Mb de RAM a la que se añaden los dispositivos básicos: HD, CD-ROM y tarjeta de red.
#!/bin/bash

LVM="/dev/vg/name"
ISO="/dev/cdrom"

qemu-kvm -name virtual -daemonize -nodefaults -machine q35 \
    -cpu host -smp 1,cores=1 -m 1024 -rtc base=localtime -vga qxl \
    -spice port=5930,addr=192.168.0.2,disable-ticketing \
    -drive if=none,id=disk,media=disk,cache=none,file=${LVM} \
    -drive if=none,id=cdrom,media=cdrom,file=${ISO} \
    -netdev type=vde,id=net,sock=/var/run/vde.ctl,port=X \
    -chardev spicevmc,id=spice,name=vdagent \
    -device virtio-balloon,bus=pcie.0,addr=0x2 \
    -device virtio-blk,bus=pcie.0,addr=0x3,drive=disk \
    -device ide-cd,bus=ide.0,drive=cdrom \
    -device virtio-net,bus=pcie.0,addr=0x4,mac=52:54:00:12:34:00,netdev=net \
    -device virtio-serial,bus=pcie.0,addr=0x5 \
    -device virtserialport,name=com.redhat.spice.0,chardev=spice \
    -monitor unix:/var/run/vde.ctl/virtual.qmp,server,nowait \
    -boot menu=on,order=cd
Recuerda sustituir la linea[3] por la ruta a lo que sera el HD de tu VM, la linea[4] por la ruta al CD-ROM o una ISO con el sistema operativo ha instalar. Las lineas[8,12,18] solo son necesaria si usas Spice. En la linea[11] remplaza X por el numero del puerto VDE al que quieres conectar la VM.

Ya esta todo listo, puedes iniciar la instalación de la maquina virtual ejecutando el script bash anterior. En mi GitHub Gist tienes unos scripts de ejemplo, para Gentoo, con los que iniciar y apagar la VM al mismo tiempo que el host. Y si quieres ojear la documentación oficial de QEMU, esta disponible aquí.