web-dev-qa-db-ja.com

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の別のバージョン(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ドライブを選択すると、すぐにブートマネージャーに戻りました。

次に、Boot Maintenance Manager> Boot Options> Add boot optionで別のDVDドライブを追加し、Boot Managerメニューでそれを選択しました。 the boot entry I picked

これにより、非常に簡単な「任意のキーを押してCDから起動する」ことができました。私が十分速い場合、これはWindowsインストーラーで起動しますが、QEMUウィンドウでのみ起動します。パススルーされたカードに接続された画面は、UEFI /ブートマネージャーのようなミラーリングとは対照的に、単純なカーソルでは真っ黒でした。

編集:NVIDIA GTX1070を通過させようとしています。 MoboはASRock x399 Taichi、CPUはThreadripper 1950Xです。 OSは、XFCEがインストールされたUbuntuサーバーです。

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

編集:私は これらの指示 を使用してコード43を取り除きましたが、役に立ちませんでした。これを試すために、qemu-systemの代わりにvirt-installを使用しました。これを行うと、TianoCoreスプラッシュ画面は表示されません。しかし、それでも私がWindowsに入るときは43をコード化します。

編集:dmesgを使用して、説明に従ってメモリ予約エラーをチェックしました こちら 見つかりませんでした。編集:上記のリンクからもROMパーサーを使用して、「タイプ3(EFI)」の存在を確認しました

6
Stonecraft

あなたはすでに正しい軌道に乗っています。 GPUパススルーは、特にそれがNVidiaカード(NVidiaまたはAMDについて言及していない)である場合は、完璧ではありません。 Qemuウィンドウでセットアップを完了します。 Windowsマシンがインターネットに接続されていることを確認し、Windows Updateにグラフィックドライバをインストールさせます。戻ってきたら、セカンドモニターに迎えられます。そうでない場合は、再起動します。次に、通常はspice/vncコンソールを削除し、GPUモニターのみを接続します。 GPUパススルーを機能させるには、試行錯誤がすべてです。

他に試すこと:

  • GPUパススルーなしでWindowsをインストールしてから、GPUのパススルーを試みます。
  • NVidia_drivers.exe経由でドライバーをインストールする
  • Windows Update経由でドライバーをインストールする
  • BIOS vs UEFI
  • Q35対i440fx

注:コード43は、VMで実行されているかどうかを確認するNVidiaドライバーに関連するNVidiaの既知のエラーです。 NVidiaは、VM環境で実行するための特別なカードを販売しており、VMでのコンシューマグレードのカード用のドライバのインストールをブロックしようとします。domain.xmlで以下を使用する必要があります。

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

https://passthroughpo.st/apply-error-43-workaround/ およびその他のリソースの例を参照してください。

これが私の設定のスクリーンショットです:

QEMU GPU Passtrough Settings

これが私の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>
5

私はこれでそれをしました:

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サイトからアップデートをインストールしました。次に、virt-installでこれを機能させて、編集可能なドメインXMLを作成します。

編集:これまでのところ、virt-installを使用すると、Tiano画面が表示されますが、今回は上記のようにドライバーをインストールするだけでは不十分で、virt-installを使用して上記のインストールをインポートすることもできませんでした(余談ですが、virt-installを既存のインストールで機能させるために必要なのはboot 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\--network bridge = 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. 偽のベンダーID行をmy 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
Stonecraft

これは長い闘争の後に私のために働いたものです:

  • まず、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と入力します。

  • インストールウィンドウを開始する前に、他のすべてのディスプレイインターフェイスを仮想マシンから削除します(スパイス、ビデオ巻雲など)。

  • 18xxビルドのwindows10をインストールしないでください。完全なアップデート後でも完全に機能する16xxバージョンをインストールしました。

これは私の個人的な経験です。他に試したところ、エラーコード43が表示されました。

0
tarzanello666