問題
Ubuntu19.10からKVMでGPUをパススルーし、Windowsのゲストを起動したところ以下の問題が発生しました。
- ログインパスワードを入力した段階でフリーズ
- ログイン後数秒で画面が出力されない
- 画面描写のフレームレートが著しく低い
解決策
該当VMのxmlのos
feature
内を以下のようにします。
ポイントはq35チップセットを使う点と、 <ioapic driver="kvm"/>
(重要) を追加する点です。
<os>
<type arch="x86_64" machine="pc-q35-4.0">hvm</type>
<loader readonly="yes" type="pflash">/usr/share/OVMF/OVMF_CODE.fd</loader>
<nvram>/var/lib/libvirt/qemu/nvram/Windows_Main_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="129286789ab"/>
</hyperv>
<kvm>
<hidden state="on"/>
</kvm>
<vmport state="off"/>
<ioapic driver="kvm"/>
</features>
原因
NvidiaのドライバーがGPU Passthroughされていることを感知すると、動作を停止させるようです (Error 43問題)
これを回避するために、xmlを以下のようにする手法が、いくつかのサイトで紹介されています。
<features>
<hyperv>
...
<vendor_id state='on' value='whatever'/>
...
</hyperv>
...
<kvm>
<hidden state='on'/>
</kvm>
</features>
しかしこれはqemu4.0未満の環境の設定であり、ubuntu19.10で採用されているqemu4.0では追加で<ioapic driver="kvm"/>
の記述が必要なようです。