GPU 直通适用于 UEFI 固件,但不适用于 Windows iso

GPU 直通适用于 UEFI 固件,但不适用于 Windows iso

我正在尝试设置具有直通图形的虚拟机。我能够使 UEFI shell 的直通工作正常,但不能使官方 Windows 安装程序。我可以让 Windows 安装程序运行,但只能使用模拟图形

这将在 QEMU 窗口中启动 Windows 安装程序:

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

这也会在 QEMU 窗口中启动 Windows 安装程序(仍然没有直通)

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 

但是,如果我指定 UEFI 固件的路径,我会在连接到我的直通显卡的显示器上和 QEMU 窗口中看到 Tiano slpash 屏幕,然后看到 UEFI shell。

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 

为什么直通仅在没有 UEFI 文件的情况下才起作用?或者,为什么指定 UEFI 文件会阻止我启动 Windows?

编辑:尝试下载不同版本的 Windows(2018 年 4 月而不是 10 月的版本),同样的问题。

编辑:尝试清除并重新安装 OVMF,但没有成功。

编辑:我可以通过在 shell 中键入“exit”来进入启动管理器,但选择可用的 DVD 驱动器(以及所有其他选项)会立即回退到启动管理器。

编辑:跑这个:

-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 

当我获得 uefi shell 后,我输入“exit”进入启动管理器。在启动管理器中,选择可用的 DVD 驱动器会立即返回到启动管理器。

然后,我通过“启动维护管理器”>“启动选项”>“添加启动选项”添加了另一个 DVD 驱动器,然后在“启动管理器”菜单中选择了该驱动器。 我选择的启动项

这给了我一个非常简短的“按任意键从 CD 启动”。如果我足够快,它会启动到 Windows 安装程序,但仅限于 QEMU 窗口。连接到直通卡的屏幕是黑色的,带有一个简单的光标,这与 UEFI/启动管理器的镜像不同。

编辑:我正在尝试通过 NVIDIA GTX1070。主板是华擎x399 Taichi,CPU是Threadripper 1950X。操作系统是安装了 XFCE 的 Ubuntu Server。

编辑:如果我继续安装,QEMU 窗口中仍然有 Windows,并且直通卡上只有 TianoCore 启动屏幕。如果我转到设备管理器,Windows 会看到该卡,但由于某种原因它被停止了。 错误43

编辑:我尝试使用这些说明摆脱代码43,无济于事。为了尝试这个,我使用了 virt-install 而不是 qemu-system,并且在执行此操作时没有 TianoCore 启动屏幕。但当我进入 Windows 时仍然是代码 43。

编辑:使用 dmesg 检查内存预留错误,如所述这里。没有找到。编辑:同样从上面的链接,使用 ROM 解析器并确认存在“类型 3 (EFI)”

答案1

你已经走在正确的轨道上了。 GPU 直通并不完美,特别是如果它是 NVidia 卡(您没有提到 NVidia 或 AMD)。完成 Qemu 窗口上的设置。确保 Windows 计算机已连接到 Internet,并让 Windows Update 为您安装显卡驱动程序。当您回来时,您应该会看到第二台显示器,如果没有,请重新启动。然后我通常会删除 SPICE/VNC 控制台,只连接 GPU 监视器。让 GPU 直通发挥作用需要反复试验。

其他要尝试的事情:

  • 安装没有 GPU 直通的 Windows,然后尝试直通 GPU。
  • 通过 NVidia_drivers.exe 安装驱动程序
  • 通过 Windows 更新安装驱动程序
  • Bios 与 UEFI
  • Q35 与 i440fx

注意:代码 43 是 NVidia 的一个已知错误,与 NVidia 驱动程序检查它们是否在虚拟机中运行有关。 NVidia 销售专门用于在 VM 环境中运行的卡,并尝试阻止在 VM 中安装消费级卡的驱动程序。您需要确保在您的domain.xml中使用以下内容

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

https://passthroughpo.st/apply-error-43-workaround/以及其他资源的示例。

这是我的配置的屏幕截图:

QEMU GPU 通道设置

这是我的domain.xml 的“相关”部分,如果您愿意,我可以共享整个内容,但它有一堆不必要的东西。

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

答案2

我是用这个做的:

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 

然后转到设备管理器中的 GTX 1070 条目并更新驱动程序。上次(使用 virt-install)我从 NVIDIA 网站安装了更新。现在让这个与 virt-install 一起工作,这样我就可以拥有可编辑的域 XML。

编辑:到目前为止,当使用 virt-install 时,我现在(再次)看到 Tiano 屏幕,但是这次按照上述方式安装驱动程序还不够,也无法使用 virt-install 导入上述安装(在旁注,我花了一段时间才意识到,要使 virt-install 与我现有的安装一起工作,我所要做的就是包含引导 iso,允许它从安装引导而不会出现错误)。

编辑:所以,我想我现在可以使用它了。

  1. 使用上面的 qemu-system-x86_64 进行初始安装
  2. 使用设备管理器更新驱动程序
  3. 然后执行 virt-install (但再次出现错误 43):

    virt-install \ --name myWINVM1 \ --boot uefi \ --ram 4096 \ --features kvm_hidden=on \ --hostdev 43:00.0,address.type=pci,address.multifunction=on \ --hostdev 43: 00.1,address.type=pci \ --磁盘路径=/dev/nvme-tank/ntfs-zvol-part2 \ --cpu core2duo \ --vcpus 4 \ --os-type windows \ --os-variant win10 \ --networkbridge=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,设备=cdrom

  4. 从 myWINVM1 XML 中删除了 SPICE 图形设备。仍然无法通过TianoCore。

  5. 将假供应商 ID 行添加到我的 XML 中

  6. 添加了我的 USB 设备

我的最终XML:

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

答案3

经过长期斗争后,这对我有用:

  • 首先,这样编辑 qemu VM 配置文件:

     cd /etc/libvirt/qemu    
     sudo virsh define win10_GPU.xml
     sudo virsh edit win10_GPU
    

    其中“win10_GPU”当然是您的虚拟机名称并添加

     <qemu:commandline>
       <qemu:arg value='-cpu'/>
       <qemu:arg value='host,hv_time,kvm=off,hv_vendor_id=null,-hypervisor'/>   
     </qemu:commandline>
    

    </devices>几乎在文件末尾后
    ,按 ctrl+O(保存)、ctrl+X(退出)并 sudo virsh define win10_GPU.xml再次输入;

  • 在开始安装 Windows 之前,从虚拟机中删除所有其他显示接口(例如 SPICE、Video Cirrus 等);

  • 不要安装 windows10 的 18xx 版本。我安装了 16xx 版本,即使在完全更新后也能正常工作。

这是我的个人经历。我尝试过的任何其他操作都会导致错误代码 43。

相关内容