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>

おすすめ記事