Implementando a passagem do PCI 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).

Questão

Para esclarecer, não tenho certeza de qual é o 'caminho' correto para implementar a passagem de PCI com o KVM do Linux. Nesta fase eu suspeito que a ação correta é a de adicionar CONFIG_DMAR, CONFIG_DMAR_DEFAULT_ONe CONFIG_PCI_STUBàs "opções de ônibus (PCI etc.)" seção do código fonte do kernel e recompilar.

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

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

Pesquisa

Neste ponto, acho que meu problema está relacionado ao meu kernel. Meu principal recurso foi o guia em linux-kvm.org ( http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM ). 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/pt-BR/Fedora/13/html/Virtualization_Guide/chap-Virtualization-PCI_passthrough.html

SUSE - "openSUSE: Virtualização com KVM" (link omitido devido à baixa relevância e ao limite de 2 links)

O guia do Fedora funciona até a referência setseboolque parece ser específica do RedHat. O guia do SUSE indica que a atribuição da placa de vídeo não é suportada pelo SUSE, no entanto, eu também a referencio porque indicou que eu deveria encontrar uma CONFIG_DMAR_DEFAULT_ONstring em / boot / config-`uname -r`. O site linux-kvm.org também faz referência CONFIG_DMAR_DEFAULT_ON, portanto esse parece ser um componente comum e necessário.

Nota: Não encontrei restrições para placas gráficas nos guias do Fedora ou Debian. O documento do SUSE mencionado é datado de 2006-2013.

Não consigo encontrar CONFIG_DMAR_DEFAULT_ONem / boot / config-`uname -r` no meu sistema. Pesquisas adicionais sugerem que CONFIG_DMAR, CONFIG_DMAR_DEFAULT_ONe CONFIG_PCI_STUBsã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. Iniciar com intel_iommu=onum parâmetro do kernel no meu host-OS parece 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 de CPU e placa-mãe para VT-d.

VT-d

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

Tecnologia de virtualização Intel® para E / S direcionada (VT-d) ‡ Sim

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

VT-d Use isso para ativar ou desativar a tecnologia Intel® VT-d (Tecnologia de virtualização Intel® para E / S direcionada). O valor padrão deste recurso é [Desativado].

IOMMU

Eu verifiquei que meu sistema tem suporte para 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 ao PCI-Passthrough:

lsmod | grep kvm
kvm_intel             121968  0 
kvm                   287749  1 kvm_intel

Eu assegurei que o VT-d fosse ativado via BIOS da minha placa-mãe. Como tal, não suspeito de problemas de hardware / BIOS que impeçam o uso do VT-d. Independentemente disso, não consigo desconectar com êxito a minha placa de vídeo do host e transferi-la para uma máquina virtual .

Pensamentos finais

Por fim, gostaria de mencionar que também tentei testar:

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 depois de 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

Suponho que isso ocorre porque o host ainda não renuncia ao controle da placa de vídeo e é provável que o kernel não esteja sendo compilado com os itens de configuração apropriados.

Este é um novo território para mim, por favor, perdoe minha inexperiência. Eu gostaria muito de receber qualquer feedback, mesmo que seja apenas uma confirmação de que estou no caminho certo. Por favor, deixe-me saber se eu fiz uma supervisão gritante ou estou pensando demais. Críticas construtivas à minha pergunta também são bem-vindas. Informe-me se não forneço informações suficientes para "ajudar você a me ajudar" (ou se incluí demais!). Eu ficaria feliz em ajudar a tornar minha pergunta mais clara ou mais fácil de responder.

Agradeço antecipadamente,

shelladept
fonte
O que acontece é que você não deixa a placa de vídeo se conectar a um host (por exemplo, inicialize sem conectar a placa de vídeo ao seu host. Ou não fornecendo / desativando um driver ou usando um parâmetro de inicialização do kernel para que seja ignorado durante a inicialização) ?
Hennes

Respostas:

1

Artigo mencionado para passagem de PCI, 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 foi possível encontrar essas opções em "Opções de barramento" e, em vez disso, em "Drivers de dispositivo -> Suporte de hardware do IOMMU".

Depois de seguir o artigo mencionado, eu ainda tinha problemas para inicializar a máquina convidada e obter erros que "O dispositivo 'pci-assign' não pôde ser inicializado". Eu consegui inicializá-lo executando:

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

Consulte o seguinte artigo se você ainda estiver tendo problemas: http://spica-and-roid.blogspot.com.au/2012/07/howto-kvm-passthrough.html

supmethods
fonte