Máquina Virtual Windows para gaming (II – PCI Passthrough)

24 agosto 2017

Índice

En la entrada posterior, estuvimos hablando un poco de todo lo que necesitábamos para implantar nuestra VM Windows de máximo rendimiento. En este punto vamos a realizar lo que llamamos “passthrough” de la tarjeta gráfica; se trata de “eliminarla” de nuestra máquina física y hacer que funcione directamente en la máquina virtual.

Un primer consejo es empezar desde cero, incluso la instalación de Linux, ya que hay detalles que son complejos de “reparar” en una máquina ya instalada. Yo voy a basarme en mi experiencia: hay cosas que puede que funcionen si no se hace igual que yo, pero es algo que dejo a vuestra cuenta y riesgo.

Qué necesitamos previamente (yo lo he hecho así y funciona):

  • Vamos a utilizar VFIO y OVMF para nuestra implementación. Para este sistema, el uso de una bios UEFI es imprescindible. Si nuestro sistema es antiguo, o no disponemos de tarjeta gráfica compatible con UEFI, hay otras formas de hacerlo, pero no las voy a documentar hoy. Al final pondré bibliografía y con eso encontrarán mucha información al respecto. El sistema Linux estará instalado sobre un disco GPT con una partición especial UEFI (es fácil. cuando instalemos el Sistema Operativo formateamos previamente el disco como GPT desde GParted y creamos una partición FAT32 de unos 200MB al principio del disco). Para comprobar si es así, usaremos el comando
    dmesg | grep -i efi 

y también comprobaremos si hay algo en el directorio /sys/firmware/efi/efivars. Si es así, significa que está correcto.

  • Comprobamos si efectivamente tenemos soporte para IOMMU, Para ello, primero cambiaremos el GRUB:
    • editamos el fichero /etc/default/grub
    • añadimos intel_iommu=on en la línea GRUB_CMDLINE_LINUX_DEFAULT
    • NOTA: en AMD, añadiremos al grub en esa linea el texto
      amd_iommu=on
    • Actualizamos el GRUB:
      update-grub  
    • y reiniciamos el sistema.
    • Ahora comprobamos que funciona. Para ello, si usamos Intel haremos uso del dmesg:
      dmesg | grep -i 'Directed I/O'
    • Obteniendo una salida como ésta: 
    • El comando en sistemas AMD será
       dmesg | grep AMD-Vi
  • Pasamos a recopilar datos acerca de nuestras tarjetas, usando el comando
    lspci -nn
  • He marcado las líneas que me interesan: las correspondientes a la tarjeta gráfica que voy a usar para la VM Windows. De ahí, necesito tomar nota de los siguientes datos:
    • El identificador dentro del subsistema PCI. Para la gráfica (VGA) es 01:00.0 y para el sonido asociado a dicha gráfica 01:00.1. Ya sé que sólo nos interesa la imagen, pero el sonido va de la mano y hay que llevárselo también.
    • El identificador en hexadecimal del modelo exacto de hardware, al final de cada línea. Para la gráfica es 1002:6613 y para el sonido, 1002:aab0.
  • En ésta página nos explican cómo comprobar si funciona el mapeo de interrupciones. En mi caso funciona; de todas maneras, tengo entendido que en cualquier placa moderna que tenga soporte completo de virtualización va a funcionar, así que no le voy a dar más importancia.

Comprobamos que IOMMU funciona

Ahora comprobamos en qué grupo IOMMU nos ha incluido el sistema al instalarse. Para ello usamos el comando

find /sys/kernel/iommu_groups/ -type l
  • Ahí tenemos nuestros dispositivos, todos juntos en el grupo 1. El otro dispositivo es un puerto PCI sin ocupar, así que no tendremos problemas al hacer el passthrough.

Modificaciones en el núcleo

En este punto, hemos comprobado que IOMMU funciona, y que, en teoría, es posible hacer el passthrough. Ahora toca hacer que sea efectivo; para ello, tendremos que modificar algunas cosas del núcleo y del arranque de nuestro sistema. Dicho así, da hasta miedo, pero en realidad no hace falta más que añadir algunos módulos y retocar ficheros de configuración.

En este caso, tenemos dos posibilidades para hacer el proceso: PCI STUB (conocido como método “legacy” o antiguo, adecuado para sistemas poco compatibles con UEFI), y VFIO, método más moderno. Yo me he decantado por el segundo, entre otras cosas porque no conseguí que funcionara PCI STUB, y sí VFIO. Pero todo depende del hardware que tengamos en cada caso. Para más info acerca de PCI STUB, éste enlace.

  • Software a instalar: Incluimos también cosas que nos harán falta más adelante.
sudo apt-get update
sudo apt-get install qemu-kvm qemu-utils qemu-efi ovmf libvirt-bin libvirt-dev libvirt0 virt-manager
  •  Modificamos el fichero /etc/modules, añadiendo algunos módulos necesarios:vfio_pci
    vfio
    vfio_iommu_type1
    vfio_virqfd
    kvm
    kvm_intel
  • Modificamos también el fichero /etc/initramfs-tools/modules, que sirve para pasar parámetros a initramfs, el subsistema de arranque de Linux. Las opciones que pasaremos serán vfio_pci y los dos números de modelo hexadecimal que copiamos antes, con la información de nuestros dispositivos.
  • Y finalmente, actualizamos el sistema de arranque con el comando
    update-initramfs -u  
  • Si probamos a reiniciar, esto seguirá sin funcionar, por una sencilla razón: hay que bloquear los drivers de la tarjeta gráfica que vamos a pasarle a la VM, para que no se carguen en el arranque. Para ello, hay distintos métodos, como por ejemplo modificar la configuración de “modprobe”. Yo, lo que me ha funcionado ha sido pasar directamente un parámetro al GRUB, modificando de nuevo el /etc/default/grub y añadiendo al final de la misma linea de antes el parámetro modprobe.blacklist=radeon
  •  (NOTA: radeon es el driver por defecto usado para tarjetas gráficas AMD; para saber el nuestro, usa lspci -k). Por supuesto, ahora actualizamos el GRUB update-grub
  • Ahora sí que podemos reiniciar la máquina. Si todo va bien, cuando arranquemos ejecutaremos el siguiente comando: lspci -k
  • Vemos cómo nuestros dispositivos, efectivamente, utilizan (kernel driver in use) el vfio, lo cual indica que todo ha ido bien y ya tenemos disponible nuestra gráfica para usarla en máquinas virtuales. Vemos también que indica los módulos del núcleo que utilizaría por defecto, radeon o amdgpu para la gráfica y snd_hda_intel para el sonido (ése nos da igual).

Bueno, finalmente tenemos ya la gráfica lista para su uso en máquinas virtuales. Los siguientes pasos serán:

  • Configurar adecuadamente la red virtual
  • Crear la máquina virtual, dándole un buen rendimiento pero todavía sin la gráfica
  • Añadirle la gráfica y configurar el acceso a la VM; necesitamos imagen, sonido, ratón, teclado, almacenamiento, acceso a dispositivos USB…
  • Drivers, optimización… como con cualquier máquina de Windows.

Hablaremos de todo ello en posteriores entregas.

Anuncios

4 comentarios to “Máquina Virtual Windows para gaming (II – PCI Passthrough)”

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: