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_ON
e 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:
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 setsebool
que 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_ON
string 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_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. Iniciar com intel_iommu=on
um 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,
fonte
Respostas:
Artigo mencionado para passagem de PCI, a configuração do Kernel é necessária
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:
Consulte o seguinte artigo se você ainda estiver tendo problemas: http://spica-and-roid.blogspot.com.au/2012/07/howto-kvm-passthrough.html
fonte