Implementando o PCI-Passthrough com o Linux-KVM no Debian

10

Estou tentando usar o PCI-Passthrough para conectar uma placa de vídeo antiga (Radeon 4770) a uma máquina virtual. Estou usando o Linux-KVM para executar minhas máquinas virtuais em um host Debian Linux (Wheezy, 3.2.0-4-amd64).

Pergunta

Para esclarecer, não tenho certeza qual é o 'caminho' correto para implantar PCI-Passthrough com o Linux KVM. Nesse estágio, suspeito que a ação correta seja adicionar CONFIG_DMAR , CONFIG_DMAR_DEFAULT_ON e CONFIG_PCI_STUB à seção "Opções de barramento (PCI etc.)" da origem e recompilação do kernel.

Mas não tenho certeza se esta é uma lista exaustiva de adições necessárias antes de recomplilar. Ou se for necessário recompilar o kernel - talvez haja um método mais fácil?

Dos guias que referi, apenas linux-kvm.org menciona explicitamente que a compilação é necessária. O Linux-KVM já está instalado e funcionando como um hipervisor.

Pesquisa

Neste ponto, acho que meu problema está relacionado ao meu kernel. Meu principal recurso foi o guia em linux-kvm.org ( link ). No entanto, encontrei outros recursos que indicam métodos ligeiramente diferentes que são (aparentemente) específicos da distribuição:

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

SUSE--"openSUSE: Virtualization with KVM" (Link omitted due to low-relevancy and 2-link limit)

O guia do Fedora funciona até referenciar setsebool , que parece ser específico de RedHat. O guia do SUSE indica que a atribuição da placa gráfica não é suportada pelo SUSE, no entanto, estou referenciando-a também porque indicava que deveria encontrar uma string CONFIG_DMAR_DEFAULT_ON em / boot / config-'uname -r '. O site linux-kvm.org também faz referência a CONFIG_DMAR_DEFAULT_ON , portanto, este parece ser um componente comum e necessário.

Note: I have not found restrictions for graphics cards in guides for Fedora or Debian. The referenced SUSE document is dated 2006-2013.

Não consigo encontrar CONFIG_DMAR_DEFAULT_ON em / boot / config-'uname -r 'no meu sistema. Pesquisas adicionais sugerem que CONFIG_DMAR , CONFIG_DMAR_DEFAULT_ON e CONFIG_PCI_STUB são itens de configuração do kernel do Linux que são relevantes para as instruções em linux-kvm.org . Como tal, acredito que preciso recompilar o kernel do meu host com esses 3 (pelo menos) itens de configuração do kernel. A inicialização com intel_iommu=on como um parâmetro do kernel para meu sistema operacional host parece ser insuficiente.

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

Confirmação de suporte VT-d / IOMMU / KVM

Minha pesquisa indica que o PCI-Passthrough requer suporte a CPU e placa-mãe para o VT-d.

VT-d

Confirmei que meu processador, um não-k INTEL i7-3770 (por ark.intel.com/products/65719), suporta VT-d:

Intel® Virtualization Technology for Directed I/O (VT-d) ‡ Yes

A placa-mãe My Asrock Z77 Extreme4 também suporta VT-d (por página 62 do Manual do Usuário):

VT-d Use this to enable or disable Intel ® VT-d technology (Intel ® Virtualization Technology for Directed I/O). The default value of this feature is [Disabled].

IOMMU

Verifiquei que meu sistema tem suporte ao IOMMU:

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

KVM

O KVM está instalado e funcional, além do suporte PCI-Passthrough:

lsmod | grep kvm
kvm_intel             121968  0 
kvm                   287749  1 kvm_intel

Eu assegurei que o VT-d esteja ativado através do BIOS da minha placa-mãe. Como tal, não suspeito de problemas de hardware / BIOS que possam impedir o uso de VT-d. Independentemente disso, não consigo separar com sucesso minha placa de vídeo do meu host e reatribuí-la a uma máquina virtual .

Pensamentos finais

Por fim, gostaria de mencionar que também testei:

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

e obteve o seguinte erro após tentar criar a VM 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

Eu estou supondo que isso acontece porque o host ainda não abandonará o controle da placa de vídeo e provavelmente porque o kernel não está sendo compilado com os itens de configuração apropriados.

Este é um novo território para mim, então, por favor, perdoe minha inexperiência. Eu agradeceria muito qualquer feedback, mesmo que seja simplesmente a confirmação de que estou no caminho certo. Por favor, deixe-me saber se eu fiz um descuido flagrante ou estou pensando demais. A crítica construtiva da minha pergunta é bem-vinda também. Deixe-me saber se eu não forneceu informações suficientes para "ajudar você me ajudar" (ou se eu tiver incluído muito!). Eu ficaria mais do que feliz em ajudar a tornar minha pergunta mais clara ou mais fácil de responder.

Obrigado antecipadamente,

    
por shelladept 06.12.2013 / 02:15

1 resposta

1

Artigo mencionado para PCI-passthrough, a configuração do Kernel é necessária

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 "*"

No entanto, não consegui encontrar essas opções em "Opções de barramento" e, em vez disso, em "Drivers de dispositivos - > Suporte de hardware IOMMU".

Depois de seguir o artigo mencionado, ainda tive problemas para inicializar a máquina convidada e obter erros que "Dispositivo pci-assign 'não pôde ser inicializado". Consegui arrancar a inicialização executando:

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

Consulte o seguinte artigo se ainda tiver problemas: link

    
por 19.03.2014 / 02:07