GPUパススルーはUEFIファームウェアでは機能しますが、Windows isoでは機能しません。

GPUパススルーはUEFIファームウェアでは機能しますが、Windows isoでは機能しません。

パススルーグラフィックを含む仮想マシンを設定しようとしています。 UEFIシェルへのパススルーが正しく機能するようにできましたが、公式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シェルが表示されます。

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年10月バージョンではなく2018年4月)をダウンロードしてみましたが、同じ問題が発生しました。

編集:OVMFを消去して再インストールしてみましたが、成功しませんでした。

編集:シェルに「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シェルを取得したら、「exit」と入力してブートマネージャに入りました。ブートマネージャで利用可能なDVDドライブを選択すると、すぐにブートマネージャに戻ります。

その後、スタートアップメンテナンスマネージャ>スタートオプション>スタートオプションの追加で別のDVDドライブを追加し、スタートアップマネージャメニューからドライブを選択しました。 私が選んだスタートアップアイテム

これは私に非常に簡単な「CDから起動するために任意のキーを押してください」を与えました。十分に速い場合は、Windowsセットアッププログラムで起動しますが、QEMUウィンドウでのみ起動します。パススルーカードに接続されている画面は、UEFI / Boot Managerイメージとは異なり、単純なカーソルで黒で表示されます。

編集:NVIDIA GTX1070でこれを試しています。マザーボードはASRock x399 Taichiで、CPUはThreadripper 1950Xです。オペレーティングシステムは、XFCEがインストールされたUbuntu Serverです。

編集:インストールを続けても、QEMUウィンドウにはまだWindowsがあり、パススルーカードにはTianoCoreスプラッシュ画面しかありません。デバイスマネージャに行くと、Windowsにカードが表示されますが、何らかの理由で停止しました。 エラー43

編集:私は試してみました。このガイドラインコード43を削除しても役に立ちません。これを試みるためにqemu-systemの代わりにvirt-installを使用しましたが、これを実行したときにTianoCoreスプラッシュ画面がありませんでした。しかし、Windowsに入ると、まだコード43です。

編集:記載されているように、dmesgを使用してメモリ予約エラーを確認してください。ここで。それが見つかりませんでした。編集:また、上記のリンクからROMパーサーを使用して「Type 3(EFI)」があることを確認してください。

答え1

あなたはすでに正しい道を行っています。 GPUパススルーは完璧ではありません。特にNVidiaカードの場合(NVidiaまたはAMDは言及していません)。 Qemuウィンドウで設定を完了します。 Windowsコンピュータがインターネットに接続されていることを確認し、Windows Updateにグラフィックドライバをインストールしてください。戻ると、2番目のモニターが表示されます。そうでない場合は、再起動してください。その後、通常SPICE / VNCコンソールを取り外し、GPUモニターのみを接続します。 GPUパススルーが機能するには試行錯誤が必要です。

その他試してみる:

  • GPUパススルーなしでWindowsをインストールし、GPUパススルーを試してみてください。
  • NVidia_drivers.exeによるドライバのインストール
  • Windows Updateによるドライバのインストール
  • 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 Webサイトからアップデートをインストールしました。次に、編集可能なドメインXMLを持つことができるようにvirt-installを使用してこれを行います。

編集:これまで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\--disk path=/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,device=cdrom

  4. myWINVM1 XMLからSPICEグラフィックスデバイスを削除しました。まだTianoCoreを通過できません。

  5. 私のXMLに偽のベンダーID行を追加しました。

  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もう一度Enterを押します。

  • Windowsのインストールを開始する前に、仮想マシンから他のすべてのディスプレイインターフェイス(SPICE、Video Cirrusなど)を削除してください。

  • Windows 10の18xxバージョンをインストールしないでください。 16xxバージョンをインストールしましたが、フルアップデート後もうまくいきます。

これは私の個人的な経験です。別の試みをすると、エラーコード43が発生します。

関連情報