Proxmox: PCI Passthrough configurar GPU AMD
He actualizado el LAB con un NUC Extreme 9, que es un mini PC que me permite instalar una GPU o tarjeta gráfica dedicada. Aunque lo uso con Windows 11, también tengo un disco dedicado a Proxmox, de forma que pueda hacer laboratorios con máquinas virtuales, en este caso, con tarjeta gráfica dedicada.
La tarjeta gráfica que vamos a utilizar es una MSI Radeon RX 6400 Aero ITX 4GB GDDR6. No es la GPU más potente del mercado, pero si que es relativamente moderna. Es importante, porque es compatible con UEFI y podré utilizar OVMF (UEFI) en lugar de SeaBIOS. Os dejo el enlace para que hagáis la revisión:
Configurar GPU AMD en Proxmox
DOCUMENTACION OFICIAL: https://pve.proxmox.com/wiki/PCI_Passthrough
¿Qué problemas os podéis encontrar al configurar la GPU en Proxmox?
Es posible que si tenéis otra tarjeta u otro ordenador/servidor no todo funcione a la primera. Cosas que pueden fallar:
- La versión de Proxmox puede daros problemas. La versión 8 debería estar más optimizadas para esto (usaré la versión 8.1.3 en esta entrada)
- Vamos a dedicar la GPU a una máquina virtual, con lo que Proxmox no puede usarla para el Host de virtualización. Esto necesitaremos modificarlo vía BIOS o mediante script
- Necesitaremos drivers en el sistema operativo de la máquina virtual que usemos, aunque lo anterior esté hecho y hayamos configurado la tarjeta correctamente
Intentaré explicaros como lo he hecho yo con este equipamiento (NUC Extreme 9, Proxmox 8.1.3 y MSI Radeon RX 6400 Aero).
¿Qué es IOMMU? Modificación en Proxmox AMD
Lo primero es habilitar IOMMU desde la Bios a nivel de host.
IOMMU nos permite un acceso directo a los dispositivos de Entrada y Salida (E/S) que dispone el host Proxmox.
Y cuando lo tengamos en la BIOS, lo deberemos habilitar en el host Proxmox de la siguiente forma para tarjetas gráficas AMD. Editamos el fichero y modificamos la siguiente línea (yo la comento y la escribo entera con el texto modificado):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
MacBook-Pro-de-Raul:~ elblogdenegu$ ssh root@nuc.negu.local The authenticity of host 'nuc.negu.local (192.168.2.178)' can't be established. ED25519 key fingerprint is SHA256:2Q7SpYYAK5B1iZkfUxgSfl8Aj2TlMj9tn+ZYy1acmPo. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'nuc.negu.local' (ED25519) to the list of known hosts. root@nuc.negu.local's password: Linux NUC 6.5.11-4-pve #1 SMP PREEMPT_DYNAMIC PMX 6.5.11-4 (2023-11-20T10:19Z) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sat Dec 23 13:18:01 2023 root@NUC:~# nano /etc/default/grub |
Modificamos línea y guardamos:
1 2 |
#GRUB_CMDLINE_LINUX_DEFAULT="quiet" GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on" |
Actualizamos GRUB:
1 2 3 4 5 6 7 |
root@NUC:~# update-grub Generating grub configuration file ... Found linux image: /boot/vmlinuz-6.5.11-4-pve Found initrd image: /boot/initrd.img-6.5.11-4-pve Found memtest86+ 64bit EFI image: /boot/memtest86+x64.efi Adding boot menu entry for UEFI Firmware Settings ... done |
Ahora agregamos los siguientes módulos al sistema:
1 2 3 4 5 |
root@NUC:~# nano /etc/modules vfio vfio_iommu_type1 vfio_pci vfio_virqfd |
Reiniciamos. Ahora revisamos si el sistema ha detectado las tarjetas correctamente:
1 2 3 |
root@NUC:~# lspci | grep -i --color 'vga\|3d\|2d' 03:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Navi 24 [Radeon RX 6400/6500 XT/6500M] (rev c7) 3d:00.0 USB controller: Intel Corporation JHL7540 Thunderbolt 3 USB Controller [Titan Ridge 4C 2018] (rev 06) |
Revisamos los grupos IOMMU, encontraremos que dos de ellos coinciden con los números de la línea anterior:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
root@NUC:~# find /sys/kernel/iommu_groups/ -type l /sys/kernel/iommu_groups/17/devices/0000:07:00.0 /sys/kernel/iommu_groups/7/devices/0000:00:17.0 /sys/kernel/iommu_groups/25/devices/0000:73:00.0 /sys/kernel/iommu_groups/15/devices/0000:05:00.0 /sys/kernel/iommu_groups/5/devices/0000:00:15.1 /sys/kernel/iommu_groups/5/devices/0000:00:15.0 /sys/kernel/iommu_groups/23/devices/0000:3d:00.0 /sys/kernel/iommu_groups/13/devices/0000:00:1e.0 /sys/kernel/iommu_groups/3/devices/0000:00:12.0 /sys/kernel/iommu_groups/21/devices/0000:08:04.0 /sys/kernel/iommu_groups/11/devices/0000:00:1d.0 /sys/kernel/iommu_groups/1/devices/0000:03:00.0 /sys/kernel/iommu_groups/1/devices/0000:00:01.2 /sys/kernel/iommu_groups/1/devices/0000:02:00.0 /sys/kernel/iommu_groups/1/devices/0000:00:01.0 /sys/kernel/iommu_groups/1/devices/0000:01:00.0 /sys/kernel/iommu_groups/1/devices/0000:03:00.1 /sys/kernel/iommu_groups/1/devices/0000:04:00.0 /sys/kernel/iommu_groups/18/devices/0000:08:00.0 /sys/kernel/iommu_groups/8/devices/0000:00:1b.0 /sys/kernel/iommu_groups/16/devices/0000:06:00.0 /sys/kernel/iommu_groups/6/devices/0000:00:16.0 /sys/kernel/iommu_groups/24/devices/0000:72:00.0 /sys/kernel/iommu_groups/14/devices/0000:00:1f.0 /sys/kernel/iommu_groups/14/devices/0000:00:1f.5 /sys/kernel/iommu_groups/14/devices/0000:00:1f.3 /sys/kernel/iommu_groups/14/devices/0000:00:1f.6 /sys/kernel/iommu_groups/14/devices/0000:00:1f.4 /sys/kernel/iommu_groups/4/devices/0000:00:14.2 /sys/kernel/iommu_groups/4/devices/0000:00:14.0 /sys/kernel/iommu_groups/22/devices/0000:09:00.0 /sys/kernel/iommu_groups/12/devices/0000:00:1d.5 /sys/kernel/iommu_groups/2/devices/0000:00:08.0 /sys/kernel/iommu_groups/20/devices/0000:08:02.0 /sys/kernel/iommu_groups/10/devices/0000:00:1c.4 /sys/kernel/iommu_groups/0/devices/0000:00:00.0 /sys/kernel/iommu_groups/19/devices/0000:08:01.0 /sys/kernel/iommu_groups/9/devices/0000:00:1c.0 |
Estos grupos son importantes, porque son los que configuraremos luego en la máquina virtual:
1 |
/sys/kernel/iommu_groups/1/devices/0000:03:00.0 |
Incluimos los controladores de AMD en la lista negra:
1 2 |
root@NUC:~# echo "blacklist amdgpu" >> /etc/modprobe.d/blacklist.conf root@NUC:~# echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf |
Crear máquina virtual con GPU AMD en Proxmox
Con todo preparado vamos a generar la máquina virtual. Lo haré con un Ubuntu, ya que mi tarjeta es compatible con Linux.
En la pestaña Sistema colocamos estos parámetros y terminamos la máquina virtual:
- Tarjeta gráfica: VirtIO-GPU
- Machine: q35
- BIOS: OVMF (UEFI)
Una vez creada, vamos a la máquina generada, HARDWARE -> Agregar -> Dispositivo PCI:
Agregamos la tarjeta PCI como RAW Device con el grupo IOMMU anterior:
Yo como la he generado de cero, la he arrancado e instalado Ubuntu en el sistema desde cero:
Ahora deberemos instalar drivers en Ubuntu o Windows, si vemos que son necesarios o vía comando. Descargamos el .DEB y lo copiamos vía SSH o Filezilla, por ejemplo, y lo instalamos:
1 2 3 |
# For Ubuntu: $ sudo apt-get install ./amdgpu-install-VERSION.deb $ sudo apt-get update |
Validamos que vemos bien la tarjeta en la máquina virtual:
1 2 3 |
root@TESTGPU:~# lspci | grep -i --color 'vga\|3d\|2d' 00:01.0 VGA compatible controller: Red Hat, Inc. Virtio GPU (rev 01) 01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Navi 24 [Radeon RX 6400/6500 XT/6500M] (rev c7) |
Test GPU en Ubuntu
Para completar el test, podemos usar una aplicación de testeo de la siguiente forma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
root@TESTGPU:~# apt install mesa-utils Leyendo lista de paquetes... Hecho Creando árbol de dependencias... Hecho Leyendo la información de estado... Hecho El paquete indicado a continuación se instaló de forma automática y ya no es necesario. grub-pc-bin Utilice «apt autoremove» para eliminarlo. Se instalarán los siguientes paquetes adicionales: mesa-utils-bin Se instalarán los siguientes paquetes NUEVOS: mesa-utils mesa-utils-bin 0 actualizados, 2 nuevos se instalarán, 0 para eliminar y 106 no actualizados. Se necesita descargar 1.108 kB de archivos. Se utilizarán 2.467 kB de espacio de disco adicional después de esta operación. ¿Desea continuar? [S/n] S Des:1 http://es.archive.ubuntu.com/ubuntu lunar/universe amd64 mesa-utils-bin amd64 8.5.0-1 [56,9 kB] Des:2 http://es.archive.ubuntu.com/ubuntu lunar/universe amd64 mesa-utils amd64 8.5.0-1 [1.051 kB] Descargados 1.108 kB en 1s (943 kB/s) Seleccionando el paquete mesa-utils-bin:amd64 previamente no seleccionado. (Leyendo la base de datos ... 205507 ficheros o directorios instalados actualmente.) Preparando para desempaquetar .../mesa-utils-bin_8.5.0-1_amd64.deb ... Desempaquetando mesa-utils-bin:amd64 (8.5.0-1) ... Seleccionando el paquete mesa-utils previamente no seleccionado. Preparando para desempaquetar .../mesa-utils_8.5.0-1_amd64.deb ... Desempaquetando mesa-utils (8.5.0-1) ... Configurando mesa-utils-bin:amd64 (8.5.0-1) ... Configurando mesa-utils (8.5.0-1) ... Procesando disparadores para man-db (2.11.2-1) ... |
Lanzamos la aplicación “glxgears”:
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?