Implementación de PCI-Passthrough con Linux-KVM en Debian


10

Estoy intentando utilizar PCI-Passthrough para conectar una tarjeta de video antigua (Radeon 4770) a una máquina virtual. Estoy usando Linux-KVM para ejecutar mis máquinas virtuales en un host Debian Linux (Wheezy, 3.2.0-4-amd64).

Pregunta

Para aclarar, no estoy seguro de cuál es la 'ruta' correcta para implicar PCI-Passthrough con Linux KVM. En esta etapa, sospecho que la acción correcta es agregar CONFIG_DMAR, CONFIG_DMAR_DEFAULT_ONy CONFIG_PCI_STUBa la sección "Opciones de bus (PCI, etc.)" de la fuente del núcleo y volver a compilar.

Pero no estoy seguro de si esta es una lista exhaustiva de las adiciones necesarias antes de volver a compilar. O si es necesario volver a compilar el núcleo, ¿ tal vez hay un método más fácil?

De las guías a las que he hecho referencia, solo linux-kvm.org menciona explícitamente que es necesario compilar. Linux-KVM ya está instalado y funciona como un hipervisor.

Investigación

En este punto, creo que mi problema está relacionado con mi núcleo. Mi principal recurso ha sido la guía en linux-kvm.org ( http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM ). Sin embargo, he encontrado otros recursos que indican métodos ligeramente diferentes que son (aparentemente) específicos de distribución:

Fedora-- https://docs.fedoraproject.org/en-US/Fedora/13/html/Virtualization_Guide/chap-Virtualization-PCI_passthrough.html

SUSE - "openSUSE: Virtualización con KVM" (Enlace omitido debido a baja relevancia y límite de 2 enlaces)

La guía de Fedora funciona hasta la referencia setseboolque parece ser específica de RedHat. La guía SUSE indica que la asignación de tarjetas gráficas no es compatible con SUSE, sin embargo, también estoy haciendo referencia a ella porque indicó que debería encontrar una CONFIG_DMAR_DEFAULT_ONcadena dentro de / boot / config-`uname -r`. El sitio linux-kvm.org también hace referencia CONFIG_DMAR_DEFAULT_ON, por lo que parece ser un componente común y necesario.

Nota: No he encontrado restricciones para las tarjetas gráficas en las guías para Fedora o Debian. El documento referenciado de SUSE está fechado en 2006-2013.

No puedo encontrar CONFIG_DMAR_DEFAULT_ONen / boot / config-`uname -r` en mi sistema. La investigación adicional sugiere que CONFIG_DMAR, CONFIG_DMAR_DEFAULT_ONy CONFIG_PCI_STUBson elementos de configuración del kernel de Linux que son relevantes para las instrucciones en linux-kvm.org . Como tal, creo que necesito recompilar el núcleo de mi host con estos 3 (al menos) elementos de configuración del núcleo. Arrancar intel_iommu=oncomo un parámetro del kernel en mi host-OS parece ser insuficiente.

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

Confirmación de soporte de VT-d / IOMMU / KVM

Mi investigación indica que PCI-Passthrough requiere soporte de CPU y placa base para VT-d.

VT-d

He confirmado que mi procesador, un INTEL i7-3770 no k (según ark.intel.com/products/65719), es compatible con VT-d:

Tecnología de virtualización Intel® para E / S dirigida (VT-d) ‡ Sí

Mi placa base Asrock Z77 Extreme4 también es compatible con VT-d (según la página 62 del Manual del usuario):

VT-d Use esto para habilitar o deshabilitar la tecnología Intel® VT-d (Tecnología de virtualización Intel® para E / S dirigida). El valor predeterminado de esta función es [Desactivado].

IOMMU

Verifiqué que mi sistema tiene soporte para IOMMU:

dmesg | grep -e DMAR -e IOMMU | grep -e "DRHD base" -e "enabled"
[    0.000000] Intel-IOMMU: enabled

KVM

KVM está instalado y es funcional, además del soporte de PCI-Passthrough:

lsmod | grep kvm
kvm_intel             121968  0 
kvm                   287749  1 kvm_intel

Me aseguré de que VT-d esté habilitado a través del BIOS de mi placa base. Como tal, no sospecho problemas de hardware / BIOS que impidan el uso de VT-d. De todos modos, no puedo desconectar con éxito mi tarjeta de video de mi host y reasignarla a una máquina virtual .

Pensamientos finales

Finalmente, me gustaría mencionar que también intenté probar:

echo "8086 10b9" \> /sys/bus/pci/drivers/pci-stub/new_id
echo "0000:01:00.0" \> /sys/bus/pci/devices/0000:01:00.0/driver/unbind
echo "0000:01:00.0" \> /sys/bus/pci/drivers/pci-stub/bind
echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/remove_id
kvm -m 512 -boot c -net none -hda debian-7.1.0-amd64-netinst.iso -device pci-assign,host=01:00.0

y obtuve el siguiente error después de intentar crear la máquina virtual de destino:

Failed to assign device "(null)" : Device or resource busy
*** The driver 'pci-stub' is occupying your device 0000:01:00.0.
***
*** You can try the following commands to free it:
***
*** $ echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/new_id
*** $ echo "0000:01:00.0" > /sys/bus/pci/drivers/pci-stub/unbind
*** $ echo "0000:01:00.0" > /sys/bus/pci/drivers/pci-stub/bind
*** $ echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/remove_id
***
kvm: -device pci-assign,host=01:00.0: Device 'pci-assign' could not be initialized

Supongo que esto se debe a que el host todavía no cederá el control de la tarjeta de video y probablemente se deba a que el núcleo no se compila con los elementos de configuración adecuados.

Este es un territorio nuevo para mí, así que perdona mi inexperiencia. Me gustaría mucho aprecio cualquier comentario que sea, incluso si es simplemente la confirmación de que estoy en el camino correcto. Avíseme si he hecho un descuido deslumbrante o si estoy pensando demasiado. La crítica constructiva de mi pregunta también es bienvenida. Avíseme si no he proporcionado suficiente información para "ayudarlo a ayudarme" (¡o si he incluido demasiado!). Estaría más que feliz de ayudar a que mi pregunta sea más clara o más fácil de responder.

Gracias de antemano,


Lo que sucede es que no permite que la tarjeta de video se adhiera al host en absoluto (por ejemplo, arranque sin conectar esa tarjeta de video a su host. Ya sea al no proporcionar / deshabilitar un controlador o al usar un parámetro de arranque del núcleo para que se omita durante el arranque) ?
Hennes

Respuestas:


1

Artículo mencionado para PCI-passthrough, se requiere la configuración de Kernel

make menuconfig
set "Bus options (PCI etc.)" -> "Support for DMA Remapping Devices" to "*"
set "Bus options (PCI etc.)" -> "Enable DMA Remapping Devices" to "*"
set "Bus options (PCI etc.)" -> "PCI Stub driver" to "*"

optional setting: 
set "Bus options (PCI etc.)" -> "Support for Interrupt Remapping" to "*"

Sin embargo, no pude encontrar estas opciones en "Opciones de bus" y en su lugar en "Controladores de dispositivo -> Soporte de hardware de IOMMU".

Después de seguir el artículo mencionado, todavía tuve problemas para arrancar la máquina invitada y recibí errores de que "El dispositivo 'pci-asignar' no se pudo inicializar". Logré arrancar ejecutando:

 echo 1 > /sys/module/kvm/parameters/allow_unsafe_assigned_interrupts

Consulte el siguiente artículo si todavía tiene problemas: http://spica-and-roid.blogspot.com.au/2012/07/howto-kvm-passthrough.html

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.