Cómo aprovechar tu Windows abandonado en una partición con QEMU

Todas las novedades sobre sistemas, desarrollo y seguridad

Cómo aprovechar tu Windows abandonado en una partición con QEMU

¡Hola! Hoy hablaremos de virtualización, más exactamente de como aprovechar tu Windows abandonado en una partición con QEMU. Muchos de nosotros tenemos una instalación de Windows medio abandonada en una partición tras hacer la transición a Linux como nuestro sistema operativo de uso diario. Normalmente se utiliza cuando vamos a jugar a algún juego o cuando necesitas compatibilidad completa con un documento de Word. Normalmente se queda medio abandonada y cada vez que la arrancas se tarda un buen rato en instalar actualizaciones y poder tenerla disponible de nuevo al 100%.

Voy a explicar cómo darle uso desde Linux sin reiniciar, utilizando QEMU + Virt Manager, con algunas optimizaciones para que vaya maś rápido y sin perder la licencia de Windows.

En mi caso, tengo Windows instalado en /dev/sda, adapta la ruta de estos ejemplos porque lo que vamos a hacer es arrancar un emulador (QEMU) directamente sobre esa partición. Mi tabla de particiones de ese disco sda (un disco SSD en realidad) es la siguiente:

fdisk-l

Es sencillo arrancar una máquina virtual con QEMU utilizando “sda” como disco. Lo difícil es optimizar para que no se pierda mucho rendimiento respecto a un arranque normal.

Necesitaréis los paquetes de vuestra distribución de qemu-kvm, libvirtd, y virt-manager, aunque este último es casi mejor instalarlo bajando el git y ejecutando “python3 setup.py install” como root.

git clone https://github.com/virt-manager/virt-manager.git

Lo primero es dar permisos a Libvirt para que pueda acceder al disco. Hay una manera muy fácil de hacerlo que es arrancar el servicio Libvirt con un SUID. Esto se hace editando el fichero /etc/libvirt/qemu.conf y modificando la configuración con “user = +0”, como muestro en la siguiente captura. Luego tan solo hay que reiniciar libvirtd utilizando “systemctl restart libvirtd” o “systemctl restart libvirt-daemon”, dependiendo de vuestra distribución de Linux.

u+0

Ahora hay que ir a Windows, para obtener un dato necesario para no perder la licencia. De manera que reinicia, y, abriendo una consola de comandos como administrador, vamos a buscar el UUID real de esa instalación utilizando el comando:

wmic csproduct get uuid

cmd

En este punto puedes aprovechar e instalar los drivers que van a hacer falta luego. QEMU “simula” tarjetas de red, gráficas y tiene drivers pensados para optimizar la velocidad de acceso a disco que tienen un gran impacto luego en el rendimiento.

La ISO con los drivers se puede conseguir en:

https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.173-9/

La última versión siempre estará disponible en:

https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/

Dentro viene un instalador para poder instalar la mayor parte de los drivers de una vez.

virtio

Aunque lo mejor a veces es ir carpeta por carpeta (amd64 será la arquitectura de tu PC salvo extrañas excepciones) y, pulsando con el botón derecho del ratón, seleccionar “Install”.

Ahora, ya con el UUID para no perder la licencia y los drivers instalados, vamos de vuelta a Linux.

En mi PC tengo dos GPUS (Tarjetas gráficas). Una de marca NVidia que tengo colocada en un PCI y otra que viene integrada en placa base. Hay que decidir cual usamos en Linux y cual en nuestros Windows simulado. No es 100% obligatorio porque QEMU os mostrará la salida por pantalla como una ventana más dentro de Linux, usad esto si se quiere tener la salida por un monitor específico directamente de la tarjeta secundaria.

Los pasos para habilitar ambas tarjetas a la vez no son sencillos. Lo voy a explicar de manera breve porque depende completamente de tu distribución de Linux y de tu modelo de placa base y tarjetas gráficas. Lo primero de todo es ir a la BIOS y habilitar que ambas tarjetas puedan funcionar a la vez. Esta opción depende de la BIOS de tu placa base.

En Linux, recomiendo utilizar un módulo llamado VFIO. Hay muchos tutoriales que explican cómo hacerlo. Si tan solo queréis usar la tarjeta gráfica que viene emulada en QEMU, no hace falta seguir estos pasos, que consisten en configurar el ID PCI de la tarjeta gráfica secundaria en VFIO y luego evitar que Linux cargue el módulo para controlarla, dejándola libre para que QEMU la pueda usar.

Al final, como en mi caso, ambas tarjetas os tienen que aparecer disponibles en el comando PCI. En la siguiente captura podemos ver mi tarjeta NVidia y la Intel que viene con mi placa base.

lspci

En mi caso, el módulo que controla la tarjeta gráfica Intel en Linux es el “i915”. Para deshabilitar este módulo creo un fichero vfio.conf en /etc/modprobe.d.

options vfio-pci ids=8086:3e98
blacklist i915

Una vez ya has terminado con las tarjetas, puedes arrancar el gestor de máquinas virtuales “virt-manager”. Al pulsar sobre el botón de “Crear nueva máquina virtual”, aparecerá un asistente. La opción que buscamos es la última “Import Existing Disk Image”, o “Importar disco existente”.

new vm

Ahora, seleccionamos “/dev/sda” o el disco en donde tengamos la instalación de Windows. En la selección de sistema operativo seleccionamos Windows 10, porque esto habilita ciertas optimizaciones desde el inicio.

new vm

En el siguiente paso seleccionamos el número de cores y memoria. Mi PC tiene 32 GB de RAM y 8 cores, pero habilito 8 GB de RAM y 4 cores para la máquina virtual. Esto no significa que los vaya a tener siempre en uso. Los compartirá con tu sistema operativo Linux.

set mem

En el paso final, marcamos “Customize installation before install” o “Personalizar instalación antes de instalar”. No os asustéis, que no vamos a “instalar” nada, se refiere enteramente a crear la máquina virtual.

finish

En el siguiente paso, previo a arrancar la máquina virtual, selecciono mi tarjeta secundaria Intel en la lista de “Add Hardware” (Añadir Hardware), en la sección de “PCI Host Device”, y buscando en la lista mi tarjeta Intel.

Los discos inicialmente estarán en modo SATA. No es para nada el más rápido, pero antes de que Windows pueda reconocer los discos en modo Virtio, que es el más rápido, hay que usar un truco.

Añade un segundo disco duro, esta vez en modo Virtio, en esta misma ventana, en la secció de Storage. Modifica también las opciones de arranque en “Boot Options” para que arranque del disco real donde está Windows.

add-new-hhw

Y ahora, ya le puedes dar al botón de Play para arrancar tu máquina virtual.

windows

El primer arranque va a tardar un rato, porque tiene que configurar todas los dispositivos nuevos que se encuentra al arrancar con QEMU. No os preocupéis, que luego podréis arrancar en modo normal Windows como siempre, e igual de rápido.

dashboard 1 y 2

dashboard2

Tras el primer arranque, si habéis usado el truco de colocar un disco secundario en modo Virtio, es posible modificar el disco raíz a VirtIO también, haciendo que vaya más rápido. Esto se hace en las propiedades del disco en Virt-Manager.

También habrá que modificar el “IO Mode” a “hypervisor default”.

En estos experimentos siempre dejo el modo de caché a “writeback”, porque hace que vayan mucho más rápidas las escrituras.

También es posible modificar el tipo de tarjeta de red a Virtio. Esto se nota cuando se transfieren grandes archivos, y es el modo recomendado para simular máquinas con Windows y QEMU.

Ahora, el último paso. Recordad que al principio nos guardamos un UUID usando el comando “wmic” en Windows para poder mantener la instalación de Windows como válida y que nos permita instalar actualizaciones, etc…

Hay que seguir los siguientes pasos, como usuario root. En mi caso mi servidor se llama “win10”. Primero exporto el fichero XML de configuración a un fichero de texto “win10.xml”. Dentro de ese fichero modifico donde pone “UUID” y cambio el que viene por el que me guardé de Windows. Luego redefino la máquina virtual Win10 en Libvirt usando el XML con el UUID modificado. Estos son los comandos a ejecutar. Si no sabéis cual es el nombre de vuestra máquina virtual, podéis ejecutar “virsh list –all”.

virsh dumpxml win10 > win10.xml

vi win10.xml (or use your favourite editor)

virsh undefine win10

virsh define win10.xml

Y ya está. Ya puedes arrancar tu Windows desde tu Linux sin tener que reiniciar.

screen saver

Más optimizaciones
Las optimizaciones que explico ahora son para tipos de máquina QEMU llamadas “q35”. El tipo de máquina aparece en la información de tu VM en Libvirt o bien dentro del fichero XML. De hecho, lo mejor para modificar la configuración a veces es exportar la configuración XML a fichero de texto, modificarlo, luego cargarlo en Libvirt con “virsh define”.

hvm

Siempre es interesante tener un backup del fichero XML antes de tocar nada 😉

Dos opciones básicas, que yo añadiría son:

<vmport state=’off’/>

<ioapic driver=’kvm’/>

Existe un modo de acelerar el acceso a la memoria RAM utilizando “Transparent Huge Pages”, que es una funcionalidad del kernel de Linux. Para habilitarlo, configuramos a “always” el fichero:

echo always > /sys/kernel/mm/transparent_hugepage/mm/transparent_hugepage/enabled

En el fichero XML de configuración también puedes definir muchas funcionalidades del simulador. Cuidado con estas opciones porque pueden hacer que vuestro Windows no arranque correctamente. En mi caso, tengo estas. Pero hay posibilidades

 

Además tengo modificado el modelo de reloj de CPU que utiliza mi máquina virtual.

 

También hay una optimización para la CPU que funciona directamente y mejora entre un 5% y un 15% el rendimiento, que consiste en copiar el modelo de CPU directamente en la máquina virtual (normalmente QEMU utiliza un tipo de CPU simulada)

 

Una optimización sencilla que muchas veces se nos escapa. En la mayor parte de los PCs o portátiles las opciones de ahorrar energía suelen estar activadas. Seleccionar el perfil de mayor rendimiento tiene un impacto bastante serio en las máquinas virtuales.

cpupower frequency-set -r -g powersave

Y para terminar, os voy a ahorrar horas de búsqueda si no os funciona el puntero del ratón. Descargad los drivers de esta web y utilizad en vuestro Linux un servicio llamado “spice-vdagent”. Se utiliza para que el puntero del ratón no se quede bloqueado en vuestra máquina virtual y mejora la velocidad.

https://www.spice-space.org/download.html

4 comentarios

  1. xavi dice:

    Gracias por la guía. La verdad es que es muy interesante, pero para los mas novatos como yo faltaría que fuese un poco mas masticado. Me encallo ya en el principio, en la parte de «Necesitaréis los paquetes de vuestra distribución de qemu-kvm, libvirtd, y virt-manager»

    El qemu-kvm lo he podido instalar con un simple «apt-get install qemu-kvm»

    El libvirtd soy incapaz de saber exactamente que instalar. He hecho un «apt-cache search libvirt» pero la lista que me sale de posibilidades es demasiado larga

    Y el virt-manager he tenido que instalar la aplicación git para descargarlo ya que no la tenia, luego he puesto “python3 setup.py install” como root pero me sale el siguiente mensaje en consola «python3: can’t open file ‘setup.py’: [Errno 2] No such file or directory»

    Entiendo que lo que yo he descargado es «virt-manager.git» así que es lógico que no exista el ejecutable «setup.py», pero bueno, es que me pierdo.

    Gracias por la guía. Ojalá me respondas ya que hace meses que utilizo Linux Mint en mi PC de escritorio pero a veces tengo que volver a Windows solo por el maldito Photoshop y bueno, casi que por pura filosofía prefiero quedarme en Linux. Saludos.

    • Gerardo G. Urtiaga dice:

      ¡Hola! En Ubuntu yo lo tengo instalados los siguientes paquetes de libvirt:


      root@ger:~# apt search libvirt|grep instalado

      WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

      gir1.2-libvirt-glib-1.0/focal,now 3.0.0-1 amd64 [instalado, automático]
      libvirt-clients/focal,now 6.0.0-0ubuntu8 amd64 [instalado, automático]
      libvirt-daemon/focal,now 6.0.0-0ubuntu8 amd64 [instalado, automático]
      libvirt-daemon-driver-qemu/focal,now 6.0.0-0ubuntu8 amd64 [instalado, automático]
      libvirt-daemon-driver-storage-rbd/focal,now 6.0.0-0ubuntu8 amd64 [instalado, automático]
      libvirt-daemon-system/focal,now 6.0.0-0ubuntu8 amd64 [instalado, automático]
      libvirt-daemon-system-systemd/focal,now 6.0.0-0ubuntu8 amd64 [instalado, automático]
      libvirt-glib-1.0-0/focal,now 3.0.0-1 amd64 [instalado, automático]
      libvirt0/focal,now 6.0.0-0ubuntu8 amd64 [instalado, automático]
      python3-libvirt/focal,now 6.1.0-1 amd64 [instalado, automático]
      virtinst/focal,focal,now 1:2.2.1-3ubuntu2 all [instalado, automático]
      root@ger:~# dpkg -S virsh
      libvirt-clients: /usr/bin/virsh
      libvirt-clients: /usr/share/man/man1/virsh.1.gz
      libvirt-daemon: /usr/share/bash-completion/completions/virsh
      root@ger:~#

      ¡Un saludo!

  2. Paco dice:

    ¡Muy bueno!
    ¿No hay opción de hacer esto con VirtualBox?

    • Gerardo G. Urtiaga dice:

      ¡Hola! Desde virtualbox es posible realizar la gran mayoría de estas operaciones pero a mi me gusta más el comportamiento de la virtualización con qemu-KVM.

      ¡Un saludo!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *