A passagem GPU funciona com o firmware UEFI, mas não com o Windows iso

5

Estou tentando configurar uma máquina virtual com gráficos de passagem. Consigo fazer com que o repasse funcione para o shell UEFI, mas não para o instalador oficial do Windows . Posso fazer com que o instalador do Windows funcione, mas apenas com gráficos emulados

Isso inicializa o instalador do Windows em uma janela do QEMU:

sudo qemu-system-x86_64 --enable-kvm \
-name TESTVM,process=TESTVM \
-cdrom /media/big-tank-8TB/OSISOS/Windows/WindowsOct2018.iso \
-smp 4 \
-cpu core2duo \
-m 4096 \
-vga qxl

Isso também inicializa o instalador do Windows em uma janela do QEMU (ainda sem passagem)

sudo qemu-system-x86_64 --enable-kvm \
-name TESTVM,process=TESTVM \
-cdrom /media/big-tank-8TB/OSISOS/Windows/WindowsOct2018.iso \
-smp 4 \
-cpu core2duo \
-m 4096 \
-device vfio-pci,host=43:00.0,multifunction=on \
-device vfio-pci,host=43:00.1 

Mas se eu especificar os caminhos para o firmware UEFI, recebo a tela slash do Tiano e, em seguida, o shell UEFI no monitor conectado à minha placa de vídeo passada e em uma janela do QEMU.

sudo qemu-system-x86_64 --enable-kvm \
-name TESTVM,process=TESTVM \
-cdrom /media/big-tank-8TB/OSISOS/Windows/WindowsOct2018.iso \
-smp 4 \
-cpu core2duo \
-m 4096 \
-device vfio-pci,host=43:00.0,multifunction=on \
-device vfio-pci,host=43:00.1 \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=/usr/share/OVMF/OVMF_VARS.fd 

Por que o repasse funciona somente na ausência dos arquivos UEFI? Ou, por que especificar os arquivos UEFI impedindo que eu inicie o Windows?

Editar: Tentei fazer o download de uma versão diferente do Windows (abril de 2018 em vez do de outubro), o mesmo problema.

Editar: Tentei limpar e reinstalar o OVMF, mas sem sorte.

Editar: eu posso chegar ao gerenciador de inicialização digitando "exit" no shell, mas selecionando a unidade de DVD disponível (e todas as outras opções) imediatamente cai de volta para o gerenciador de inicialização.

Editar: Ran isso:

-name TESTVM,process=TESTVM \
-drive file=/media/big-tank-8TB/OSISOS/Windows/Win10_1803_English_x64.iso,index=1,media=cdrom  \
-drive file=/media/big-tank-8TB/OSISOS/Windows/virtio-win-0.1.160.iso,index=2,media=cdrom \
-smp 4 \
-cpu core2duo \
-m 4096 \
-device vfio-pci,host=43:00.0,multifunction=on \
-device vfio-pci,host=43:00.1 \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=/usr/share/OVMF/OVMF_VARS.fd 

Quando eu peguei o shell do uefi, digitei "exit" para acessar o gerenciador de inicialização. No gerenciador de inicialização, a seleção da unidade de DVD disponível caiu instantaneamente para o gerenciador de inicialização.

Em seguida, adicionei outra unidade de DVD pelo Boot Maintenance Manager > Opções de inicialização > Adicione a opção de inicialização e selecione-a no menu Gerenciador de inicialização. .

Issomedeuumbreve"pressione qualquer tecla para inicializar a partir do CD". Se eu for rápido o suficiente, isso é inicializado no instalador do Windows, MAS SOMENTE NA JANELA DO QEMU. A tela anexada ao cartão transmitido estava preta com um cursor simples, ao contrário do espelhamento, como no UEFI / Boot Manager.

Edit: Estou tentando passar por uma NVIDIA GTX1070. Mobo é ASRock x399 Taichi, CPU é Threadripper 1950X. OS é o Ubuntu Server com o XFCE instalado.

Editar: Se eu prosseguir com a instalação, ainda tenho o Windows na janela do QEMU e apenas uma tela inicial do TianoCore no cartão de passagem. Se eu for ao gerenciador de dispositivos, o Windows verá o cartão, mas ele será interrompido por algum motivo.

Edit:Eutenteiusar estas instruções para me livrar do código 43, sem sucesso. Para tentar isso, usei o virt-install em vez do qemu-system e, ao fazer isso, não há tela inicial do TianoCore. Mas ainda codifico 43 quando entro no Windows.

Editar: use o dmesg para verificar erros de reserva de memória conforme descrito aqui. Não encontrei nenhum. Edit: Também a partir do link acima, usado parser ROM e confirmou a presença de um "tipo 3 (EFI)"

    
por Thoughtcraft 27.10.2018 / 17:48

2 respostas

4

Você já está na faixa correta. O GPU Passthrough não é perfeito, especialmente se for um cartão NVidia (que você não menciona NVidia ou AMD). Conclua a configuração na janela do Qemu. Verifique se o Windows Machine está conectado à Internet e deixe o Windows Update instalar os drivers gráficos para você. Quando você voltar, você deve ser saudado por um segundo monitor, se não, reinicie. Eu normalmente removo o console do spice / vnc e só tenho o monitor da GPU conectado. Fazer com que o GPU Passthrough funcione é uma questão de tentativa e erro.

Outras coisas para tentar:

  • Instale o Windows sem passar pela GPU e tente passar pela GPU.
  • Instalar drivers via NVidia_drivers.exe
  • Instalar drivers pelo Windows Update
  • Bios vs UEFI
  • Q35 vs i440fx

Nota: O código 43 é um erro conhecido com NVidia relativo a drivers NVidia, verificando se eles estão sendo executados em uma VM. A NVidia vende cartões especificamente para execução em um ambiente de VM e tenta bloquear a instalação de drivers para cartões de nível de consumidor em uma VM. Você precisa se certificar de usar o seguinte em seu domínio.xml

<kvm>
 <hidden state='on'/>
</kvm>

Veja link e outros recursos para exemplos.

Aqui está uma captura de tela da minha configuração:

Aquiestáaparte"relevante" do meu domínio.xml, posso compartilhar toda a coisa se você quiser, mas tem um monte de coisas desnecessárias.

  <os>
    <type arch='x86_64' machine='pc-i440fx-2.10'>hvm</type>
    <loader readonly='yes' type='pflash'>/usr/share/edk2/ovmf/OVMF_CODE.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/Windows10_VARS.fd</nvram>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <kvm>
      <hidden state='on'/>
    </kvm>
    <vmport state='off'/>
  </features>
  <clock offset='localtime'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
    
por 01.11.2018 / 06:34
3

Eu fiz isso com isso:

sudo qemu-system-x86_64 --enable-kvm \
-name TESTVM,process=TESTVM \
-drive id=disk0,if=virtio,cache=none,format=raw,file=/dev/nvme-tank/ntfs-zvol,index=2 \
-smp 4 \
-cpu core2duo,kvm=off \
-m 4096 \
-device vfio-pci,host=43:00.0,multifunction=on \
-device vfio-pci,host=43:00.1 \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=/usr/share/OVMF/OVMF_VARS.fd 

e, em seguida, indo para a entrada GTX 1070 no Gerenciador de dispositivos e atualizando os drivers. Última vez (usando o virt-install) Eu instalei atualizações do site da NVIDIA. Agora, para obter este trabalho com virt-install para que eu possa ter um XML de domínio editável.

Edit: Até agora, ao usar o virt-install, eu agora (novamente) obtive a tela do Tiano, mas desta vez instalar os drivers como descrito acima não foi suficiente, nem funcionou para importar a instalação acima usando virt-install (em uma nota lateral, levei um tempo para perceber que tudo que eu tinha que fazer para fazer o virt-install funcionar com a minha instalação existente era incluir a iso de inicialização, permitindo que ele inicializasse da instalação sem erros).

Edit: Então, acho que estou trabalhando agora.

  1. Faça a instalação inicial usando o qemu-system-x86_64
  2. acima
  3. Drivers atualizados usando o Gerenciador de dispositivos
  4. Então faça o virt-install (mas obtenha o erro 43 novamente):

    virt-install \ --name myWINVM1 \ --boot uefi \ - 4096 - recursos kvm_hidden = em \ --hostdev 43: 00.0, address.type = pci, address.multifunction = on \ --hostdev 43: 00.1, address.type = pci \ --disk caminho = / dev / nvme-tank / ntfs-zvol-part2 \ --cpu core2duo \ - vcpus 4 \ janelas do tipo --os \ --os-variante win10 \ - ponte de rede = virbr0 \ --console pty, target_type = serial \ --disk /media/big-tank-8TB/OSISOS/Windows/WindowsOct2018.iso,device=cdrom \ --disk /media/big-tank-8TB/OSISOS/Windows/virtio-win-0.1.160.iso,device=cdrom

  5. Excluiu o dispositivo de elementos gráficos de especiaria do XML myWINVM1. Ainda não consegui passar pela TianoCore.

  6. adicionou a linha de ID do fornecedor falso ao meu XML

  7. Adicionado meus dispositivos USB

meu xml final:

<domain type='kvm' id='24'>
  <name>myWINVM1</name>
  <uuid>43e052b3-b3da-4025-92d8-ec7c8ff96ae9</uuid>
  <memory unit='KiB'>4194304</memory>
  <currentMemory unit='KiB'>4194304</currentMemory>
  <vcpu placement='static'>4</vcpu>
  <resource>
    <partition>/machine</partition>
  </resource>
  <os>
    <type arch='x86_64' machine='pc-i440fx-bionic'>hvm</type>
    <loader readonly='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/myWINVM1_VARS.fd</nvram>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <hyperv>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
      <vendor_id state='on' value='1234567890ab'/>
    </hyperv>
    <kvm>
      <hidden state='on'/>
    </kvm>
    <vmport state='off'/>
  </features>
  <cpu mode='custom' match='exact' check='full'>
    <model fallback='forbid'>core2duo</model>
    <feature policy='disable' name='ss'/>
    <feature policy='disable' name='monitor'/>
    <feature policy='require' name='cx16'/>
    <feature policy='require' name='x2apic'/>
    <feature policy='require' name='hypervisor'/>
    <feature policy='require' name='lahf_lm'/>
  </cpu>
  <clock offset='localtime'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
    <timer name='hypervclock' present='yes'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/bin/kvm-spice</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/dev/nvme-tank/ntfs-zvol-part2'/>
      <backingStore/>
      <target dev='hda' bus='ide'/>
      <alias name='ide0-0-0'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/media/big-tank-8TB/OSISOS/Windows/WindowsOct2018.iso'/>
      <backingStore/>
      <target dev='hdb' bus='ide'/>
      <readonly/>
      <alias name='ide0-0-1'/>
      <address type='drive' controller='0' bus='0' target='0' unit='1'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/media/big-tank-8TB/OSISOS/Windows/virtio-win-0.1.160.iso'/>
      <backingStore/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <alias name='ide0-1-0'/>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <alias name='usb'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <alias name='usb'/>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <alias name='usb'/>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <alias name='usb'/>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'>
      <alias name='pci.0'/>
    </controller>
    <controller type='ide' index='0'>
      <alias name='ide'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <alias name='virtio-serial0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:36:1d:c4'/>
      <source bridge='virbr0'/>
      <target dev='vnet0'/>
      <model type='rtl8139'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <source path='/dev/pts/4'/>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
      <alias name='serial0'/>
    </serial>
    <console type='pty' tty='/dev/pts/4'>
      <source path='/dev/pts/4'/>
      <target type='serial' port='0'/>
      <alias name='serial0'/>
    </console>
    <channel type='spicevmc'>
      <target type='virtio' name='com.redhat.spice.0' state='disconnected'/>
      <alias name='channel0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='tablet' bus='usb'>
      <alias name='input0'/>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='mouse' bus='ps2'>
      <alias name='input1'/>
    </input>
    <input type='keyboard' bus='ps2'>
      <alias name='input2'/>
    </input>
    <sound model='ich6'>
      <alias name='sound0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </sound>
    <video>
      <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
      <alias name='video0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <hostdev mode='subsystem' type='usb' managed='no'>
      <source>
        <vendor id='0x046d'/>
        <product id='0xc33b'/>
        <address bus='5' device='3'/>
      </source>
      <alias name='hostdev0'/>
      <address type='usb' bus='0' port='4'/>
    </hostdev>
    <hostdev mode='subsystem' type='usb' managed='no'>
      <source>
        <vendor id='0x046d'/>
        <product id='0xc52b'/>
        <address bus='5' device='4'/>
      </source>
      <alias name='hostdev1'/>
      <address type='usb' bus='0' port='5'/>
    </hostdev>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x43' slot='0x00' function='0x0'/>
      </source>
      <alias name='hostdev2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </hostdev>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x43' slot='0x00' function='0x1'/>
      </source>
      <alias name='hostdev3'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </hostdev>
    <redirdev bus='usb' type='spicevmc'>
      <alias name='redir0'/>
      <address type='usb' bus='0' port='2'/>
    </redirdev>
    <redirdev bus='usb' type='spicevmc'>
      <alias name='redir1'/>
      <address type='usb' bus='0' port='3'/>
    </redirdev>
    <memballoon model='virtio'>
      <alias name='balloon0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
    </memballoon>
  </devices>
  <seclabel type='dynamic' model='apparmor' relabel='yes'>
    <label>libvirt-43e052b3-b3da-4025-92d8-ec7c8ff96ae9</label>
    <imagelabel>libvirt-43e052b3-b3da-4025-92d8-ec7c8ff96ae9</imagelabel>
  </seclabel>
  <seclabel type='dynamic' model='dac' relabel='yes'>
    <label>+64055:+120</label>
    <imagelabel>+64055:+120</imagelabel>
  </seclabel>
</domain>
    
por 04.11.2018 / 20:57