Este artículo explica paso a paso el proceso de compilación e instalación, a partir del código fuente, de los tres componentes principales de la estructura de virtualización en GNU/Linux con KVM: qemu, libvirt y virt-manager.

Este tutorial está basado en una instalación de Slackware 14.1, aunque aplica para cualquier distribución GNU/Linux, ya que el proceso de compilación es independiente de la distribución que se utilice. Los únicas diferencias ocurren al momento de instalar dependencias (si se opta por instalarlas desde los manejadores de paquetes en lugar de compilarlas), y al momento de instalar servicios (ya que depende del proceso de arranque de cada distribución: SysVinit, systemd o Upstart).

A pesar de que se explica con gran detalle, requiere que el usuario posea conocimientos básicos acerca del manejo de la línea de comandos en GNU/Linux.

El punto más importante a la hora de compilar paquetes desde los fuentes consiste en verificar que se respeten las dependencias. Para cada fuente (source) es necesario determinar qué versión de librerías requiere y luego verificar si nuestro sistema operativo las cumple. Que un paquete compile no significa que luego funcione, es por ello que el punto más fuerte de todo manejador de paquetes es su habilidad para resolver dependencias.

Introducción

¿Qué es KVM?

KVM (Kernel Virtual Machine) es un módulo del kernel Linux que permite que los programas en espacio usuario utilicen las características de virtualización por hardware ofrecidas por diferentes procesadores. En la actualidad, soporta procesadores AMD e Intel (x86 y x86_64), PPC 440, PPC 970, S/390, y ARM (Cortex A15).

¿Qué es QEMU?

QEMU es un emulador de máquinas y virtualizador genérico open source. Cuando se usa como emulador de máquinas, QEMU puede ejecutar sistemas operativos y programas compilados para una arquitectura (por ejemplo un sistema ARM) en una máquina diferente (por ejemplo una PC), tal como lo demostré en el artículo Emular Raspberry Pi con QEMU y KVM en CentOS 6. Al utilizar traducción dinámica, alcanza muy buena performance.

Cuando se utiliza como virtualizador, QEMU alcanza casi la performance nativa ya que ejecuta el código guest directamente en el CPU host. QEMU soporta virtualización cuando se ejecuta bajo el hipervisor Xen o a través del módulo del kernel KVM en Linux. Cuando se usa con KVM, QEMU puede virtualizar sistemas guest x86, PowerPC y S390, entre otros.

QEMU aprovecha KVM cuando ejecuta una arquitectura guest que coincide con la arquitectura host. Por ejemplo, cuando se utiliza qemu-system-x86 sobre un procesador x86 compatible, se aprovecha la aceleración de KVM (beneficiando tanto al sistema guest como al host), ya que el código guest se ejecuta directamente en el host (sin traducción).

Anteriormente, KVM mantenía su propio fork de QEMU llamado "qemu-kvm" para soportar virtualización por hardware en arquitecturas x86. Actualmente está deprecated ya que QEMU ha incorporado la funcionalidad necesaria (ver http://wiki.qemu.org/KVM.

¿Qué es libvirt?

libvirt (The virtualization API) es un conjunto de herramientas para interactuar con las capacidades de virtualización de las versiones recientes de Linux (y otros sistemas operativos), liberado bajo la licencia "GNU Lesser General Public License".

libvirt soporta un gran conjunto de tecnologías entre las que se destacan:

  • KVM/QEMU
  • Xen (en Linux y Solaris)
  • LXC
  • OpenVZ
  • El kernel paravirtualizado User Mode Linux
  • VirtualBox
  • VMware ESX y GSX
  • VMware Workstation y Player
  • Microsoft Hyper-V
  • IBM PowerVM
  • El hipervisor Parallels
  • Redes virtuales usando bridging, NAT, VEPA y VN-LINK
  • Almacenamiento en discos IDE/SCSI/USB, FibreChannel, LVM, iSCSI y NFS

libvirt permite administrar hosts de forma remota utilizando encriptación TLS y certificados x509; autenticación con Kerberos y SASL; control de acceso local mediante PolicyKit; Zeroconf utilizando Avahi; administración de máquinas virtuales, redes y almacenamiento; y una API cliente portable para Linux, Solaris y Windows.

Entre su amplia variedad de aplicaciones se destacan: virsh y virt-manager.

KVM

Para poder utilizar KVM se debe contar con un procesador que soporte virtualización por hardware.

En caso de contar con un procesador AMD o Intel, se puede comprobar si soporta virtualización por hardware ejecutando cat /proc/cpuinfo | grep svm (si se trata de un procesador AMD) o cat /proc/cpuinfo | grep vmx (si se trata de un procesador Intel), y buscando la existencia de los FLAGS "svm" (si es AMD) o "vmx" (si es Intel):

[12:09 root@vaio emi] > cat /proc/cpuinfo | grep vmx
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms

Si el procesador posee soporte para virtualización por hardware, pero ésta no se encuentra habilitada en la BIOS, deberá ser habilitada. Este problema se detecta en el log de mensajes del kernel cuando aparece el mensaje:

kvm: disabled by bios

En este caso es necesario ingresar en la BIOS del sistema y habilitar el soporte de virtualización por hardware (por defecto suele estar deshabilitado).

El módulo del kernel que implementa KVM (kvm) está incluido por defecto en todos los kernels Linux (mainline Linux) a partir de la versión 2.6.20. Por lo tanto, para utilizar KVM sólo hace falta comprobar que el módulo esté cargado, para ello ejecutar lsmod | grep kvm:

[17:27 root@vaio actions] > lsmod | grep kvm
kvm_intel             126236  0 
kvm                   363491  1 kvm_intel

Si el módulo kvm no aparece listado es posible habilitarlo ejecutando:

modprobe kvm_amd

Si se trata de un procesador AMD, o:

modprobe kvm_intel

Si se trata de un procesador Intel.

Instalar QEMU

Antes de compilar QEMU es recomendable instalar las dependencias opcionales, fundamentalmente spice, de lo contrario no se podrá utilizar el protocolo SPICE en las máquinas virtuales. Estas son device-tree-compiler, usbredir y spice, las cuales se encuentran en el repositorio slackbuilds.org (para Slackware 14.1):

device-tree-compile

usbredir

spice

Descargar qemu desde http://wiki.qemu.org/Download. La versión disponible actualmente es la 1.7.0:

http://wiki.qemu-project.org/download/qemu-1.7.0.tar.bz2

Extraer el tarball:

$ tar xjvf qemu-1.7.0.tar.bz2

Configurar qemu:

$ cd qemu-1.7.0/

Para ver la ayuda ejecutar:

$ ./configure --help

Por defecto compila con soporte para todas las arquitecturas de CPU disponibles, por lo tanto (salvo que se desee quitar alguna) no hace falta especificar la "target list".

Las características que se pueden habilitar son muchas, se recomienda revisar cuidadosamente la salida de ./configure --help. Es importante habilitar todas las características de aceleración por hardware (KVM), VNC (junto con los formatos de compresión JPG y PNG), spice, curses, y soporte para diferentes medios de almacenamiento:

$ ./configure --enable-sdl --enable-gtk --enable-virtfs --enable-vnc --enable-vnc-tls --enable-vnc-sasl --enable-vnc-jpeg --enable-vnc-png --enable-vnc-ws --enable-curses --enable-curl --enable-fdt --enable-bluez --enable-kvm --enable-tcg-interpreter --enable-system --enable-user --enable-linux-user --enable-guest-base --enable-pie --enable-uuid --enable-linux-aio --enable-attr --enable-docs --enable-vhost-net --enable-spice --enable-smartcard-nss --enable-usb-redir --enable-guest-agent --enable-coroutine-pool --enable-gcov --enable-tpm --enable-vhdx

El proceso de building demora, ya que se compila con soporte para todas las arquitecturas de CPU disponibles. Si se desea acelerar, es necesario especificar manualmente la "target list", indicando sólo las arquitecturas de CPU que se desean soportar. Por ejemplo, si sólo se van a utilizar sistemas operativos guest para arquitecturas i386 (Intel y AMD de 32 bit), amd64 (Intel y AMD de 64 bit) y arm (Raspberry Pi), configurar QEMU agregando la target list:

--target-list=i386-softmmu,x86_64-softmmu,arm-softmmu

Compilar qemu:

$ make

Finalmente, instalar qemu:

# make install

Instalar libvirt

Descargar libvirt desde http://libvirt.org/sources/, la última versión disponible a la fecha es la 1.2.1:

http://libvirt.org/sources/libvirt-1.2.1.tar.gz

Extraer el tarball:

$ tar xzvf libvirt-1.2.1.tar.gz

Configurar libvirt:

$cd libvirt-1.2.1/

Para ver la ayuda ejecutar:

$ ./configure --help

Al igual que QEMU, por defecto instala los binarios en el directorio /usr/local/bin. Existen muchas características que se pueden habilitar, como el soporte para todo tipo de hipervisores, storage, etc. Es importante habilitar el uso de threads POSIX para mejorar el rendimiento. Revisar cuidadosamente la ayuda de configure y habilitar todas las características necesarias (algunas requieren la instalación de paquetes adicionales):

$ ./configure --enable-threads=posix --with-openssl=yes --with-attr=yes --with-curl=yes --with-dbus=yes --with-pciaccess=yes --with-readline=yes --with-udev=yes --with-yajl=yes --with-qemu=yes --with-uml=yes --with-vmware=yes --with-esx=yes --with-polkit=yes --with-storage-fs=yes --with-storage-lvm=yes

Errores de configuración:

En caso de haber errores durante el proceso de configuración, será necesario instalar las dependencias faltantes. En mi caso necesité instalar la librería yajl (Yet Another JSON Library). Para ello descargué el código fuente desde http://lloyd.github.io/yajl/ y procedí a compilar e instalar, como de costumbre:

$ cd ..
$ mv ~/Downloads/lloyd-yajl-2.0.1-0-gf4b2b1a.tar.gz ./
$ tar xvf lloyd-yajl-2.0.1-0-gf4b2b1a.tar.gz 
$ cd lloyd-yajl-f4b2b1a/
$ ./configure 
$ make
$ make install
$ cd ../libvirt-1.2.1/

De forma alternativa, es posible instalar esta librería desde los repositorios (para Slackware se encuentra disponible el SlackBuild yajl).

En mi instalación de Slackware 14.1, luego de instalar la librería yajl faltante, pude configurar libvirt correctamente (no necesité instalar ninguna otra dependencia):

$ ./configure

Finalmente, compilar e instalar libvirt:

$ make
# make install

Instalar virt-manager

Descargar virt-manager (Virtual Machine Manager) desde http://virt-manager.org/download/, la versión disponible actualmente es la 0.10.0:

http://virt-manager.org/download/sources/virt-manager/virt-manager-0.10.0.tar.gz

Extraer el tarball:

$ tar xvf virt-manager-0.10.0.tar.gz

Instalar virt-manager:

$ cd virt-manager-0.10.0/

virt-manager está desarrollado completamente en Python. Al tratarse de un lenguaje interpretado no hay necesidad de compilar fuentes, simplemente copiar los scripts. La instalación es trivial:

# python setup.py install

Aunque antes de poder utilizarlo es necesario instalar las siguientes dependencias (en Slackware 14.1):

gnome-python2-gconf, vte3, tunctl, urlgrabber, ipaddr-py, pygobject3, libvirt-glib, vala, spice-gtk, gtk-vnc y libvirt-python.

NOTA (1): la última versión disponible de gtk-vnc (0.5.3) requiere cairo 1.12.16 o superior para funcionar correctamente. Slackware 14.1 viene con cairo 1.12.14, por lo tanto se debe instalar una versión actualizada de cairo. Actualizar Slackware o descargar la última versión del paquete cairo disponible en el directorio "slackware64-current" (o "slackware-current" si se trata de una instalación de 32 bit) de cualquier mirror de Slackware (por ejemplo: lug.mtu.edu/slackware/slackware64-current/slackware64/l/cairo-1.12.16-x86_64-1.txz).

NOTA (2): antes de instalar libvirt-glib (y si se ha instalado libvirt bajo la ruta /usr/local/) es necesario configurar la variable de entorno PKG_CONFIG_PATH de la siguiente forma:

$ export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig"

NOTA (3): compilar spice-gtk involucra compilar una cantidad importante de dependencias. Aunque es muy recomendable, ya que es un protocolo excelente (supera ampliamente a VNC en lo que se refiere a rendimiento y prestaciones, ver el siguiente artículo: Utilizar SPICE en máquinas virtuales KVM).

En distribuciones basadas en Debian/Ubuntu es posible instalar estas dependencias utilizando el gestor de paquetes apt-get (siempre que las versiones de los repositorios cumplan los requisitos de la última versión de virt-manager). En Red Hat/CentOS utilizar yum, aunque es muy probable que no se alcancen los requerimientos, en cuanto a versiones se refiere.

Configuración del servicio libvirt en Slackware 14.1

Esta sección varía de distribución en distribución, dependiendo del gestor de servicios (init) que se utilice (SysVinit, systemd o Upsart). Slackware 14.1 utiliza System V, por lo tanto los demonios se inician en cada runlevel utilizando scripts (rc.K: runlevel 1; rc.M: multi user run levels; rc.S: system initialization scripts; rc.[nombre del servicio] para cada servicio) dentro del directorio /etc/rc.d/.

Luego de compilar e instalar libvirt es necesario crear el script de inicio del servicio. Crear el archivo /etc/rc.d/rc.libvirt con el siguiente contenido:

#!/usr/bin/bash
# Init script for libvirtd on Slackware
# Written by Matteo Bernardini <ponce@slackbuilds.org>
#
# Note that a dnsmasq daemon is started by libvirtd itself to serve
# its virtual network, and possibly can conflict with a dnsmasq
# already running on the system, see
# http://wiki.libvirt.org/page/Libvirtd_and_dnsmasq
# Note also that the tun, vhost_net and kvm related modules are
# automatically loaded at start and removed at stop: edit the
# script if this behaviour conflicts with anything else running
# on your setup

MODULES="tun vhost_net"
PIDFILE="/usr/local/var/run/libvirt/libvirtd.pid"
NETNAME="$(ls -1 /usr/local/var/lib/libvirt/network | cut -d. -f1)"
TIMEOUT=${TIMEOUT:-40}
OPTS=${OPTS:-" -v -f /usr/local/etc/libvirt/libvirtd.conf -p $PIDFILE "}

check_running_machines() {

  i=0

  for j in `/usr/local/bin/virsh list | grep running | awk '{print $2;}'` ; do
    /usr/local/bin/virsh shutdown $j
  done

  echo -n "Waiting machines"

  while [ $(/usr/local/bin/virsh list | grep running | wc -l) -gt "0" ]; do
    if [ "$i" -ge "$TIMEOUT" ];then
      break
    fi
    echo -n "."
    i=`expr $i + 1`
    sleep 1
  done

  echo ""

  if [ $(/usr/local/bin/virsh list | grep running | wc -l) -gt "0" ];then

    echo -n "The following machines are still running, forcing shutdown: "
    for j in `/usr/local/bin/virsh list | grep running | awk '{print $2;}'` ; do
      /usr/local/bin/virsh destroy $j
      echo -n "$j "
    done

    echo ""
    sleep 2
  fi

}

check_processor() {

  egrep 'vmx' /proc/cpuinfo > /dev/null

  if [ "$?" -eq "0" ];then
    MODULES="$MODULES kvm_intel kvm"
  fi

  check=$?

  egrep 'svm' /proc/cpuinfo > /dev/null

  if [ "$?" -eq "0" ];then
    MODULES="$MODULES kvm_amd kvm"
  fi

  check=`expr $check + $?`

  if [ $check -eq "2" ];then
    echo "Your systems does not support KVM!"
  fi

}

start() {
  if [ -f $PIDFILE ];then
    echo "libvirt is already running..."
    exit 1
  fi
  echo "Starting libvirtd..."
  mkdir -p $(dirname $PIDFILE)
  check_processor
  /sbin/modprobe -a $MODULES
  export PATH="$PATH:/usr/local/sbin:/usr/local/bin"
  /usr/local/sbin/libvirtd -d -l $OPTS
}

stop() {
  if [ ! -f $PIDFILE ];then
    echo "libvirt is not running..."
    exit 2
  fi
  check_running_machines
  check_processor
  echo "Stopping libvirtd..."
  for i in "$NETNAME"; do
    /usr/local/bin/virsh net-destroy "$i"
  done
  kill -TERM `cat $PIDFILE`
  sleep 3
  /sbin/modprobe -ra $MODULES
}

case $1 in
start)
  start
  ;;
stop)
  stop
  ;;
restart)
  stop
  sleep 1
  start
  ;;
*)
  echo "Usage: $0 (start|stop|restart)"
  ;;
esac


Este script está basado en el que se encuentra en el paquete "SlackBuild" correspondiente a libvirt en el repositorio slackbuilds.org. La diferencia es que está modificado para que las rutas de los binarios sean relativas al directorio /usr/local/ (además de ajustar la variable de entorno $PATH antes de iniciar libvirt, para que el demonio encuentre los emuladores QEMU que se encuentran dentro el directorio /usr/local/bin/). Si se utilizó otra ruta durante la instalación de libvirt, será necesario adaptar este script.

En Slackware es posible instalar qemu, libvirt y virt-manager utilizando los SlackBuilds del repositorio slackbuilds.org, aunque el objetivo de este artículo es explicar cómo compilar e instalar las últimas versiones de cada uno, independiente de la distribución que se está utilizando. Por supuesto, si se instala libvirt desde el SlackBuild no es necesario instalar este script de inicio, ya que se hace automáticamente (como si se estuviera instalando desde el gestor de paquetes, esa es la idea del repositorio slackbuilds.org).

Iniciar el demonio libvirtd

Luego de crear el script rc.libvirt dentro del directorio /etc/rc.d/, es necesario otorgarle permiso de ejecución:

# chmod +x /etc/rc.d/rc.libvirt

Para que el demonio libvirt inicie automáticamente, agregar las siguientes líneas al final del archivo /etc/rc.d/rc.local:

# Start libvirt daemon:
if [ -x /etc/rc.d/rc.libvirt ]; then
    /etc/rc.d/rc.libvirt start
fi

De forma similar, para que el demonio se detenga al apagar el sistema, agregar las siguientes líneas al final del archivo /etc/rc.d/rc.local_shutdown (si no existe, es necesario crearlo y otorgarle permiso de ejecución):

# Stop libvirt daemon:
if [ -x /etc/rc.d/rc.libvirt ]; then
    /etc/rc.d/rc.libvirt stop
fi

Para iniciar el demonio libvirtd por primera vez, ejecutar /etc/rc.d/rc.libvirt start:

[11:00 root@vaio emi] > /etc/rc.d/rc.libvirt start
Starting libvirtd...
/usr/local/sbin/libvirtd: error: Unable to initialize network sockets. Check /var/log/messages or run without --daemon for more info.

Se observa que falla al inicializar sockets, esto se debe a que por defecto utiliza TLS para aceptar conexiones entrantes. Hay dos soluciones: instalar un certificado CA; o deshabilitar TLS.

En mi caso voy a deshabilitar TLS, ya que no deseo que el demonio acepte conexiones entrantes. Para ello editar el archivo de configuración del demonio libvirtd:

# nano /usr/local/etc/libvirt/libvirtd.conf

Dentro del mismo descomentar la línea (remover el caracter '#' en el comienzo de la línea):

listen_tls = 0

En caso de que ocurran diferentes errores durante el inicio del demonio, es posible consultar la documentación oficial de Red Hat:

Appendix B. Common libvirt errors and troubleshooting

Una vez que se corrigen todos los errores, el demonio libvirtd inicia correctamente:

[11:02 root@vaio emi] > /etc/rc.d/rc.libvirt start
Starting libvirtd...

Luego de iniciar libvirt exitosamente es posible verificar la instalación utilizando al herramienta virt-host-validate:

[09:59 root@vaio emi] > virt-host-validate 
  QEMU: Checking for hardware virtualization                                 : PASS
  QEMU: Checking for device /dev/kvm                                         : PASS
  QEMU: Checking for device /dev/vhost-net                                   : PASS
  QEMU: Checking for device /dev/net/tun                                     : PASS
   LXC: Checking for Linux >= 2.6.26                                         : PASS

Pasan todos los controles, lo que significa que todo funciona correctamente.

Se observa que el demonio ha creado exitosamente la interfaz bridge para la red "default" de las máquinas virtuales:

[11:22 root@vaio emi] > ifconfig virbr0
virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether a6:6c:c4:25:5c:4a  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

A partir de este momento es posible utilizar la herramienta virsh para conectarse al hipervisor y probar algunos comandos:

[11:29 root@vaio emi] > virsh
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit

virsh # nodeinfo
CPU model:           x86_64
CPU(s):              4
CPU frequency:       2175 MHz
CPU socket(s):       1
Core(s) per socket:  2
Thread(s) per core:  2
NUMA cell(s):        1
Memory size:         3987248 KiB

virsh # iface-list
 Name                 State      MAC Address
---------------------------------------------------
 eth0                 active     11:22:33:aa:bb:cc

virsh # net-list
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes

virsh # pool-list
 Name                 State      Autostart 
-------------------------------------------

virsh # version
Compiled against library: libvirt 1.2.1
Using library: libvirt 1.2.1
Using API: QEMU 1.2.1
Running hypervisor: QEMU 1.7.0

virsh # exit


[11:30 root@vaio emi] > 

Notar que hasta el momento no existe ningún pool de storage (almacenamiento), por lo que es necesario crearlo utilizando virsh o luego con virt-manager.

Antes de continuar es recomendable consultar las capacidades (Driver capabilities XML format) del driver libvirt, utilizando el comando virsh capabilities. De esta forma es posible determinar si libvirt ha detectado correctamente la instalación de QEMU y las arquitecturas que se pueden emular:

[08:10 root@vaio emi] > virsh capabilities
<capabilities>

  <host>
    <uuid>400ad740-9e16-e211-8d57-30f9edc2dbe8</uuid>
    <cpu>
      <arch>x86_64</arch>
      <model>SandyBridge</model>
      <vendor>Intel</vendor>
      <topology sockets='1' cores='2' threads='2'/>
      <feature name='erms'/>
      <feature name='smep'/>
      <feature name='fsgsbase'/>
      <feature name='rdrand'/>
      <feature name='f16c'/>
      <feature name='osxsave'/>
      <feature name='pcid'/>
      <feature name='pdcm'/>
      <feature name='xtpr'/>
      <feature name='tm2'/>
      <feature name='est'/>
      <feature name='vmx'/>
      <feature name='ds_cpl'/>
      <feature name='monitor'/>
      <feature name='dtes64'/>
      <feature name='pbe'/>
      <feature name='tm'/>
      <feature name='ht'/>
      <feature name='ss'/>
      <feature name='acpi'/>
      <feature name='ds'/>
      <feature name='vme'/>
    </cpu>
    <power_management>
      <suspend_mem/>
      <suspend_disk/>
      <suspend_hybrid/>
    </power_management>
    <migration_features>
      <live/>
      <uri_transports>
        <uri_transport>tcp</uri_transport>
      </uri_transports>
    </migration_features>
    <topology>
      <cells num='1'>
        <cell id='0'>
          <memory unit='KiB'>3987248</memory>
          <cpus num='4'>
            <cpu id='0' socket_id='0' core_id='0' siblings='0'/>
            <cpu id='1' socket_id='0' core_id='0' siblings='1'/>
            <cpu id='2' socket_id='0' core_id='1' siblings='2'/>
            <cpu id='3' socket_id='0' core_id='1' siblings='3'/>
          </cpus>
        </cell>
      </cells>
    </topology>
    <secmodel>
      <model>none</model>
      <doi>0</doi>
    </secmodel>
    <secmodel>
      <model>dac</model>
      <doi>0</doi>
      <baselabel type='kvm'>+0:+0</baselabel>
      <baselabel type='qemu'>+0:+0</baselabel>
    </secmodel>
  </host>

  <guest>
    <os_type>hvm</os_type>
    <arch name='alpha'>
      <wordsize>64</wordsize>
      <emulator>/usr/local/bin/qemu-system-alpha</emulator>
      <machine maxCpus='4'>clipper</machine>
      <domain type='qemu'>
      </domain>
    </arch>
    <features>
      <deviceboot/>
    </features>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='armv7l'>
      <wordsize>32</wordsize>
      <emulator>/usr/local/bin/qemu-system-arm</emulator>
      <machine maxCpus='1'>integratorcp</machine>
      <machine maxCpus='1'>collie</machine>
      <machine maxCpus='2'>smdkc210</machine>
      <machine maxCpus='2'>nuri</machine>
      <machine maxCpus='1'>verdex</machine>
      <machine maxCpus='1'>connex</machine>
      <machine maxCpus='4'>midway</machine>
      <machine maxCpus='4'>highbank</machine>
      <machine maxCpus='1'>kzm</machine>
      <machine maxCpus='1'>mainstone</machine>
      <machine maxCpus='1'>musicpal</machine>
      <machine maxCpus='1'>n810</machine>
      <machine maxCpus='1'>n800</machine>
      <machine maxCpus='1'>sx1-v1</machine>
      <machine maxCpus='1'>sx1</machine>
      <machine maxCpus='1'>cheetah</machine>
      <machine maxCpus='4'>realview-pbx-a9</machine>
      <machine maxCpus='1'>realview-pb-a8</machine>
      <machine maxCpus='4'>realview-eb-mpcore</machine>
      <machine maxCpus='1'>realview-eb</machine>
      <machine maxCpus='1'>terrier</machine>
      <machine maxCpus='1'>borzoi</machine>
      <machine maxCpus='1'>spitz</machine>
      <machine maxCpus='1'>akita</machine>
      <machine maxCpus='1'>lm3s6965evb</machine>
      <machine maxCpus='1'>lm3s811evb</machine>
      <machine maxCpus='1'>tosa</machine>
      <machine maxCpus='1'>versatileab</machine>
      <machine maxCpus='1'>versatilepb</machine>
      <machine maxCpus='4'>vexpress-a15</machine>
      <machine maxCpus='4'>vexpress-a9</machine>
      <machine maxCpus='1'>xilinx-zynq-a9</machine>
      <machine maxCpus='1'>z2</machine>
      <domain type='qemu'>
      </domain>
    </arch>
    <features>
      <cpuselection/>
      <deviceboot/>
    </features>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='cris'>
      <wordsize>32</wordsize>
      <emulator>/usr/local/bin/qemu-system-cris</emulator>
      <machine maxCpus='1'>axis-dev88</machine>
      <domain type='qemu'>
      </domain>
    </arch>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='i686'>
      <wordsize>32</wordsize>
      <emulator>/usr/local/bin/qemu-system-i386</emulator>
      <machine canonical='pc-i440fx-1.7' maxCpus='255'>pc</machine>
      <machine maxCpus='1'>isapc</machine>
      <machine maxCpus='255'>pc-0.10</machine>
      <machine maxCpus='255'>pc-0.11</machine>
      <machine maxCpus='255'>pc-0.12</machine>
      <machine maxCpus='255'>pc-0.13</machine>
      <machine maxCpus='255'>pc-0.14</machine>
      <machine maxCpus='255'>pc-0.15</machine>
      <machine maxCpus='255'>pc-1.0</machine>
      <machine maxCpus='255'>pc-1.1</machine>
      <machine maxCpus='255'>pc-1.2</machine>
      <machine maxCpus='255'>pc-1.3</machine>
      <machine maxCpus='255'>pc-i440fx-1.4</machine>
      <machine maxCpus='255'>pc-i440fx-1.5</machine>
      <machine maxCpus='255'>pc-i440fx-1.6</machine>
      <machine maxCpus='255'>pc-q35-1.4</machine>
      <machine maxCpus='255'>pc-q35-1.5</machine>
      <machine maxCpus='255'>pc-q35-1.6</machine>
      <machine canonical='pc-q35-1.7' maxCpus='255'>q35</machine>
      <domain type='qemu'>
      </domain>
      <domain type='kvm'>
        <emulator>/usr/local/bin/qemu-system-i386</emulator>
      </domain>
    </arch>
    <features>
      <cpuselection/>
      <deviceboot/>
      <acpi default='on' toggle='yes'/>
      <apic default='on' toggle='no'/>
      <pae/>
      <nonpae/>
    </features>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='lm32'>
      <wordsize>32</wordsize>
      <emulator>/usr/local/bin/qemu-system-lm32</emulator>
      <machine maxCpus='1'>lm32-evr</machine>
      <machine maxCpus='1'>lm32-uclinux</machine>
      <machine maxCpus='1'>milkymist</machine>
      <domain type='qemu'>
      </domain>
    </arch>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='m68k'>
      <wordsize>32</wordsize>
      <emulator>/usr/local/bin/qemu-system-m68k</emulator>
      <machine maxCpus='1'>mcf5208evb</machine>
      <machine maxCpus='1'>an5206</machine>
      <machine maxCpus='1'>dummy</machine>
      <domain type='qemu'>
      </domain>
    </arch>
    <features>
      <deviceboot/>
    </features>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='microblaze'>
      <wordsize>32</wordsize>
      <emulator>/usr/local/bin/qemu-system-microblaze</emulator>
      <machine maxCpus='1'>petalogix-s3adsp1800</machine>
      <machine maxCpus='1'>petalogix-ml605</machine>
      <domain type='qemu'>
      </domain>
    </arch>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='microblazeel'>
      <wordsize>32</wordsize>
      <emulator>/usr/local/bin/qemu-system-microblazeel</emulator>
      <machine maxCpus='1'>petalogix-s3adsp1800</machine>
      <machine maxCpus='1'>petalogix-ml605</machine>
      <domain type='qemu'>
      </domain>
    </arch>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='mips'>
      <wordsize>32</wordsize>
      <emulator>/usr/local/bin/qemu-system-mips</emulator>
      <machine maxCpus='16'>malta</machine>
      <machine maxCpus='1'>pica61</machine>
      <machine maxCpus='1'>magnum</machine>
      <machine maxCpus='1'>mipssim</machine>
      <machine maxCpus='1'>mips</machine>
      <domain type='qemu'>
      </domain>
    </arch>
    <features>
      <deviceboot/>
    </features>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='mipsel'>
      <wordsize>32</wordsize>
      <emulator>/usr/local/bin/qemu-system-mipsel</emulator>
      <machine maxCpus='16'>malta</machine>
      <machine maxCpus='1'>pica61</machine>
      <machine maxCpus='1'>magnum</machine>
      <machine maxCpus='1'>mipssim</machine>
      <machine maxCpus='1'>mips</machine>
      <domain type='qemu'>
      </domain>
    </arch>
    <features>
      <deviceboot/>
    </features>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='mips64'>
      <wordsize>64</wordsize>
      <emulator>/usr/local/bin/qemu-system-mips64</emulator>
      <machine maxCpus='16'>malta</machine>
      <machine maxCpus='1'>pica61</machine>
      <machine maxCpus='1'>magnum</machine>
      <machine maxCpus='1'>mipssim</machine>
      <machine maxCpus='1'>mips</machine>
      <domain type='qemu'>
      </domain>
    </arch>
    <features>
      <deviceboot/>
    </features>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='mips64el'>
      <wordsize>64</wordsize>
      <emulator>/usr/local/bin/qemu-system-mips64el</emulator>
      <machine maxCpus='16'>malta</machine>
      <machine maxCpus='1'>fulong2e</machine>
      <machine maxCpus='1'>pica61</machine>
      <machine maxCpus='1'>magnum</machine>
      <machine maxCpus='1'>mipssim</machine>
      <machine maxCpus='1'>mips</machine>
      <domain type='qemu'>
      </domain>
    </arch>
    <features>
      <deviceboot/>
    </features>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='ppc'>
      <wordsize>32</wordsize>
      <emulator>/usr/local/bin/qemu-system-ppc</emulator>
      <machine maxCpus='1'>g3beige</machine>
      <machine maxCpus='32'>ppce500</machine>
      <machine maxCpus='1'>mac99</machine>
      <machine maxCpus='15'>mpc8544ds</machine>
      <machine maxCpus='1'>taihu</machine>
      <machine maxCpus='1'>ref405ep</machine>
      <machine maxCpus='1'>bamboo</machine>
      <machine maxCpus='1'>prep</machine>
      <machine maxCpus='1'>virtex-ml507</machine>
      <domain type='qemu'>
      </domain>
    </arch>
    <features>
      <cpuselection/>
      <deviceboot/>
    </features>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='ppc64'>
      <wordsize>64</wordsize>
      <emulator>/usr/local/bin/qemu-system-ppc64</emulator>
      <machine maxCpus='256'>pseries</machine>
      <machine maxCpus='32'>ppce500</machine>
      <machine maxCpus='1'>mac99</machine>
      <machine maxCpus='1'>g3beige</machine>
      <machine maxCpus='15'>mpc8544ds</machine>
      <machine maxCpus='1'>taihu</machine>
      <machine maxCpus='1'>ref405ep</machine>
      <machine maxCpus='1'>bamboo</machine>
      <machine maxCpus='1'>prep</machine>
      <machine maxCpus='1'>virtex-ml507</machine>
      <domain type='qemu'>
      </domain>
    </arch>
    <features>
      <cpuselection/>
      <deviceboot/>
    </features>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='ppcemb'>
      <wordsize>32</wordsize>
      <emulator>/usr/local/bin/qemu-system-ppcemb</emulator>
      <machine maxCpus='1'>g3beige</machine>
      <machine maxCpus='32'>ppce500</machine>
      <machine maxCpus='1'>mac99</machine>
      <machine maxCpus='15'>mpc8544ds</machine>
      <machine maxCpus='1'>taihu</machine>
      <machine maxCpus='1'>ref405ep</machine>
      <machine maxCpus='1'>bamboo</machine>
      <machine maxCpus='1'>prep</machine>
      <machine maxCpus='1'>virtex-ml507</machine>
      <domain type='qemu'>
      </domain>
    </arch>
    <features>
      <cpuselection/>
      <deviceboot/>
    </features>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='s390x'>
      <wordsize>64</wordsize>
      <emulator>/usr/local/bin/qemu-system-s390x</emulator>
      <machine canonical='s390-virtio' maxCpus='255'>s390</machine>
      <machine canonical='s390-ccw-virtio' maxCpus='255'>s390-ccw</machine>
      <domain type='qemu'>
      </domain>
    </arch>
    <features>
      <cpuselection/>
      <deviceboot/>
    </features>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='sh4'>
      <wordsize>32</wordsize>
      <emulator>/usr/local/bin/qemu-system-sh4</emulator>
      <machine maxCpus='1'>shix</machine>
      <machine maxCpus='1'>r2d</machine>
      <domain type='qemu'>
      </domain>
    </arch>
    <features>
      <deviceboot/>
    </features>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='sh4eb'>
      <wordsize>64</wordsize>
      <emulator>/usr/local/bin/qemu-system-sh4eb</emulator>
      <machine maxCpus='1'>shix</machine>
      <machine maxCpus='1'>r2d</machine>
      <domain type='qemu'>
      </domain>
    </arch>
    <features>
      <deviceboot/>
    </features>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='sparc'>
      <wordsize>32</wordsize>
      <emulator>/usr/local/bin/qemu-system-sparc</emulator>
      <machine maxCpus='1'>SS-5</machine>
      <machine maxCpus='1'>leon3_generic</machine>
      <machine maxCpus='1'>SPARCbook</machine>
      <machine maxCpus='1'>SPARCClassic</machine>
      <machine maxCpus='1'>SS-4</machine>
      <machine maxCpus='1'>LX</machine>
      <machine maxCpus='1'>Voyager</machine>
      <machine maxCpus='4'>SS-20</machine>
      <machine maxCpus='4'>SS-600MP</machine>
      <machine maxCpus='4'>SS-10</machine>
      <domain type='qemu'>
      </domain>
    </arch>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='sparc64'>
      <wordsize>64</wordsize>
      <emulator>/usr/local/bin/qemu-system-sparc64</emulator>
      <machine maxCpus='1'>sun4u</machine>
      <machine maxCpus='1'>Niagara</machine>
      <machine maxCpus='1'>sun4v</machine>
      <domain type='qemu'>
      </domain>
    </arch>
    <features>
      <deviceboot/>
    </features>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='unicore32'>
      <wordsize>32</wordsize>
      <emulator>/usr/local/bin/qemu-system-unicore32</emulator>
      <machine maxCpus='1'>puv3</machine>
      <domain type='qemu'>
      </domain>
    </arch>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='x86_64'>
      <wordsize>64</wordsize>
      <emulator>/usr/local/bin/qemu-system-x86_64</emulator>
      <machine canonical='pc-i440fx-1.7' maxCpus='255'>pc</machine>
      <machine maxCpus='1'>isapc</machine>
      <machine maxCpus='255'>pc-0.10</machine>
      <machine maxCpus='255'>pc-0.11</machine>
      <machine maxCpus='255'>pc-0.12</machine>
      <machine maxCpus='255'>pc-0.13</machine>
      <machine maxCpus='255'>pc-0.14</machine>
      <machine maxCpus='255'>pc-0.15</machine>
      <machine maxCpus='255'>pc-1.0</machine>
      <machine maxCpus='255'>pc-1.1</machine>
      <machine maxCpus='255'>pc-1.2</machine>
      <machine maxCpus='255'>pc-1.3</machine>
      <machine maxCpus='255'>pc-i440fx-1.4</machine>
      <machine maxCpus='255'>pc-i440fx-1.5</machine>
      <machine maxCpus='255'>pc-i440fx-1.6</machine>
      <machine maxCpus='255'>pc-q35-1.4</machine>
      <machine maxCpus='255'>pc-q35-1.5</machine>
      <machine maxCpus='255'>pc-q35-1.6</machine>
      <machine canonical='pc-q35-1.7' maxCpus='255'>q35</machine>
      <domain type='qemu'>
      </domain>
      <domain type='kvm'>
        <emulator>/usr/local/bin/qemu-system-x86_64</emulator>
      </domain>
    </arch>
    <features>
      <cpuselection/>
      <deviceboot/>
      <acpi default='on' toggle='yes'/>
      <apic default='on' toggle='no'/>
    </features>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='xtensa'>
      <wordsize>32</wordsize>
      <emulator>/usr/local/bin/qemu-system-xtensa</emulator>
      <machine maxCpus='4'>sim</machine>
      <machine maxCpus='4'>lx200</machine>
      <machine maxCpus='4'>lx60</machine>
      <domain type='qemu'>
      </domain>
    </arch>
  </guest>

  <guest>
    <os_type>hvm</os_type>
    <arch name='xtensaeb'>
      <wordsize>32</wordsize>
      <emulator>/usr/local/bin/qemu-system-xtensaeb</emulator>
      <machine maxCpus='4'>sim</machine>
      <machine maxCpus='4'>lx200</machine>
      <machine maxCpus='4'>lx60</machine>
      <domain type='qemu'>
      </domain>
    </arch>
  </guest>

</capabilities>


Del volcado XML se observa que la instalación de QEMU detectada es capaz de emular las arquitecturas de CPU alpha, armv7l, cris, i686, lm32, m68k, microblazeel, mips, mipsel, mips64, mips64el, ppc, ppc64, ppcemb, s390x, sh4, sh4eb, sparc, sparc64, unicore32, x86_64, xtensa y xtensaeb. Tal como era de esperarse, ya que se compiló QEMU con soporte para todas las arquitecturas de CPU disponibles. Esto significa que se van a poder crear máquinas virtuales con procesadores que utilicen cualquiera de estas arquitecturas. Por ejemplo, se podrá crear una máquina virtual con CPU arm7v que permita para emular una Raspberry Pi, donde se podrá instalar Raspbian.

Ejecutar virt-manager

Antes de ejecutar virt-manager es necesario crear links simbólicos a las librerías libvirt y libyajl:

# ln -s /usr/local/lib/libvirt.so.0 /lib64/libvirt.so.0
# ln -s /usr/local/lib/libyajl.so.2 /lib64/libyajl.so.2

También es necesario registrar una acción polkit (org.libvirt.unix.monitor) para el acceso al demonio libvirtd. PolicyKit (polkit) provee una API de autorización para las aplicaciones que necesitan acceso privilegiado. A modo de ejemplo, polkit es el mecanismo que solicita las credenciales de administrador (root) cuando tratamos de ejecutar algún programa que realiza cambios en el sistema.

Si no se registra la acción org.libvirt.unix.monitor, virt-manager es incapaz de conectarse al demonio libvirtd.

Crear el archivo /usr/share/polkit-1/actions/org.libvirt.unix.policy:

# nano /usr/share/polkit-1/actions/org.libvirt.unix.policy

Insertar el siguiente contenido:

<!DOCTYPE policyconfig PUBLIC
 "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">

<policyconfig>
    <action id="org.libvirt.unix.monitor">
      <description>Monitor local virtualized systems</description>
      <message>System policy prevents monitoring of local virtualized systems</message>
      <defaults>
        <!-- Any program can use libvirt in read-only mode for monitoring,
             even if not part of a session -->
        <allow_any>yes</allow_any>
        <allow_inactive>yes</allow_inactive>
        <allow_active>yes</allow_active>
      </defaults>
    </action>

    <action id="org.libvirt.unix.manage">
      <description>Manage local virtualized systems</description>
      <message>System policy prevents management of local virtualized systems</message>
      <defaults>
        <!-- Only a program in the active host session can use libvirt in
             read-write mode for management, and we require user password -->
        <allow_any>auth_admin</allow_any>
        <allow_inactive>auth_admin</allow_inactive>
        <allow_active>auth_admin_keep</allow_active>
      </defaults>
    </action>
</policyconfig>

Habiendo registrado la acción org.libvirt.unix.monitor es posible ejecutar virt-manager desde el menú de aplicaciones, o ejecutando:

$ virt-manager

Si se desea que virt-manager no solicite la contraseña de root cada vez que se ejecuta, es posible configurar la autoridad local (Local Authority) para que permita el acceso al demonio libvirt al usuario que se desee.

Crear un archivo de configuración .pkla dentro del directorio /var/lib/polkit-1/localauthority/50-local.d/, por ejemplo 50-vaio.libvirt-access.pkla:

# nano /var/lib/polkit-1/localauthority/50-local.d/50-vaio.libvirt-access.pkla

Existen dos alternativas: autenticar por grupo; o autenticar por usuario. Si se autentica por grupo, por ejemplo wheel, es necesario agregar los usuarios al mismo utilizando el comando usermod -G wheel -a emi (suponiendo que se desea otorgar permiso de acceso al demonio libvirtd al usuario emi). El contenido del archivo de configuración debe quedar así:

[libvirt Management Access]
Identity=unix-group:wheel
Action=org.libvirt.unix.manage
ResultAny=yes
ResultInactive=yes
ResultActive=yes

Si se autentica por usuario, por ejemplo emi, el contenido del archivo de configuración debe quedar así (si se necesitan agregar varios usuarios se deben separar con punto y coma, por ejemplo: Identity=unix-user:emi;larry;moe;shemp):

[libvirt Management Access]
Identity=unix-user:emi
Action=org.libvirt.unix.manage
ResultAny=yes
ResultInactive=yes
ResultActive=yes

De cualquiera de las dos formas, al iniciar virt-manager como usuario emi, el sistema no solicitará el password de root para conectarse al hipervisor.

Crear un storage pool

Por defecto libvirt crea el storage pool "Default" utilizando el directorio /var/lib/libvirt/images/. Si deseamos utilizar una partición, disco, o grupo LVM adicional, es necesario crear un nuevo storage pool.

Es posible crear un storage pool utilizando la herramienta virsh, mediante el comando pool-create-as:

[17:27 root@vaio actions] > virsh help pool-create-as
  NAME
    pool-create-as - create a pool from a set of args

  SYNOPSIS
    pool-create-as  [--print-xml]  [] [] [] [] [] [--source-format ]

  DESCRIPTION
    Create a pool.

  OPTIONS
    [--name]   name of the pool
    --print-xml      print XML document, but don't define/create
    [--type]   type of the pool
    [--source-host]   source-host for underlying storage
    [--source-path]   source path for underlying storage
    [--source-dev]   source device for underlying storage
    [--source-name]   source name for underlying storage
    [--target]   target for underlying storage
    --source-format   format for underlying storage


Aunque también es posible hacerlo utilizando virt-manager (ya que nos hemos esforzado por compilarlo, ¿por qué no sacarle provecho?):

Abrir la configuración del hipervisor mediante doble clic sobre el nombre de host y acceder a la pestaña "Storage":

Especificar un nombre e indicar el tipo de almacenamiento, puede ser: dir (un directorio cualquiera); disk (un disco o partición); logical (un grupo LVM); y otras alternativas más avanzadas como scsi, iscsi (Internet Small Computer System Interface, dispositivos de almacenamiento online) y NFS. En este caso, agrego un directorio:

A continuación, indicar la ruta al directorio que se utilizará para almacenar imágenes de disco:

Finalizar:

Crear una máquina virtual

Finalmente, es posible crear la primera máquina virtual de prueba. A modo de ejemplo Linux Mint 15.

Abrir virt-manager y presionar el botón "New" para crear una nueva máquina virtual:

Especificar un nombre (llamados "dominios" en libvirt). A modo de ejemplo inicio desde un Live CD:

Es posible utilizar un medio óptico en la lectora del host o indicar la ruta a una imagen:

Presionar "Browse" y luego "Browse Local", navegar hasta la ubicación de la imagen (en este caso ISO):

Indicar el tipo de sistema operativo y versión, no es necesario que la versión coincida exactamente:

Asignar una cantidad suficiente de memoria RAM para la máquina virtual:

Especificar el disco rígido para la máquina virtual, es posible crear uno nnuevo o utilizar uno existente:

Si se desea cambiar el tipo de hardware gráfico (por ejemplo spice) seleccionar "Customize configuration before install":

Presionar "Finish" para crear la máquina virtual:

Si se desea utilizar spice, cambiar el tipo de display a "Spice":

Automáticamente se agregaran los dispositivos de hardware necesarios para el funcionamiento de spice:

Una vez finalizada la configuración presionar "Begin Installation" para iniciar la máquina virtual. Al tratarse de un Live CD inicia rápidamente:

Para finalizar, una captura completa del escritorio de Slackwre 14.1 con KDE 4.10, con la máquina virtual Linux Mint corriendo sobre KVM+QEMU+libvirt:

La documentación oficial sobre virtualización con KVM en Slackware se encuentra disponible en el siguiente enlace:

http://docs.slackware.com/howtos:general_admin:kvm_libvirt

Para mayor información acerca de KVM remitirse a la documentación oficial en:
http://www.linux-kvm.org/page/HOWTO

Para mayor información acerca de QEMU remitirse a la documentación oficial en:
http://wiki.qemu.org/Manual

Para mayor información acerca de libvirt remitirse a la documentación oficial en:
http://wiki.libvirt.org/page/Main_Page


Tal vez pueda interesarte


Compartí este artículo