「設定 - KVMのGPUパススルー」の版間の差分

ナビゲーションに移動 検索に移動
667行目: 667行目:


== エラー時の対処方法 ==
== エラー時の対処方法 ==
==== ゲストOSがopenSUSEの場合 ====
==== ネットワーク ====
ゲストOSがopenSUSEの場合、/etc/default/grubファイルの<code>GRUB_CMDLINE_LINUX_DEFAULT</code>項目に、<code>pci=noaer</code>オプションを追記する。<br>
GRUB_CMDLINE_LINUX_DEFAULT="... pci=noaer"
<br>
==== AMD CPUのパフォーマンスの改善 ====
以前、AMD CPUでは、Nested Page Tables(NPT)を無効化することでKVMのGPU性能を引き上げることができた。<br>
これは、バグが原因で、トレードオフとしてCPUの性能が落ちて、がたつきが発生することがあった。<br>
<br>
Linuxカーネル 4.9以降からこの問題を解決するカーネルパッチがマージされている。<br>
LinuxカーネルまたはLinux-LTSカーネルを使用している場合、パッチは既に適用されている。<br>
<br>
<u>※注意</u><br>
<u>QEMU 3.1以降、TOPOEXTフラグは標準で無効化されており、</u><br>
<u>AMD CPUでハイパースレッディングを使用するには、以下のように、手動で有効にする必要がある。</u><br>
<u>cache passthroughの設定は、実際のCPUキャッシュ情報を仮想マシンに渡す。</u><br>
<syntaxhighlight lang="xml">
<!-- ゲストOSがWindows 10またはSUSEの場合 -->
<cpu mode="host-passthrough" check="none">
  <topology sockets="1" cores="4" threads="2"/>
  <cache mode="passthrough"/>
  <feature policy="require" name="topoext"/>
</cpu>
 
<!-- ゲストOSがWindows 7の場合 -->
<cpu mode="host-passthrough">
  <topology sockets="1" cores="4" threads="2"/>
  <cache mode="passthrough"/>
  <feature policy='disable' name='hypervisor'/>
</cpu>
</syntaxhighlight>
<br>
更にパフォーマンスを向上させるため、以下のように、hypervエレメントを設定する。<br>
<syntaxhighlight lang="xml">
<!-- ゲストOSがWindows 10の場合 -->
<hyperv>
  <relaxed state="on"/>
  <vapic state="on"/>
  <spinlocks state="on" retries="8191"/>
  <vendor_id state="on" value="0123456789ab"/>
  <vpindex state="on"/>
  <synic state="on"/>
  <stimer state="on"/>
  <frequencies state="on"/>
</hyperv>
<!-- ゲストOSがopenSUSEの場合 -->
<hyperv>
  <relaxed state='on'/>
  <vapic state='on'/>
  <spinlocks state='on' retries='8191'/>
  <vendor_id state='on' value='0123456789ab'/>
</hyperv>
</syntaxhighlight>
<br>
 
==== 仮想マシンのGPUパススルーに関するエラー(error code 43) ====
仮想マシンのデバイスマネージャでグラフィックボードを確認すると、"エラー43:ドライバーの読み込みに失敗しました"と表示されて、正常に機能しない場合がある。<br>
この問題は、NVidia GeForceシリーズのみ起こり(QuadroやTeslaにはこの問題は無い)、ユーザが仮想マシンでそれらを使用しようとすると、機能を意図的に無効化する。<br>
理由としては、仮想マシンでグラフィックカードを実行できるようになると、自社の製品の売上に悪影響を与える可能性があるからである。<br>
<br>
GeforceのGPUパススルーを正常に動作させるには、ハイパーバイザがその存在を隠すことで出来る。<br>
具体的な手順は以下の通りである。<br>
<br>
'''手動での設定'''<br>
# まず、仮想マシンを停止する。
# GPUパススルーを行う仮想マシンのxmlファイルを、以下のように編集する。
#: sudo EDITOR=nano virsh edit <仮想マシン名>
#: <br>
#: 以下に示すように、<code>vendor_id</code>項目を<code><hyperv></code>セクション内に追記する。この時、<code>value=</code>の値はどんなものでもよい。
#: <vendor_id state="on" value="123456789ab"/>
#: <br>
#: 次に、状態を非表示にするようにkvmに指示するため、<code><hyperv></code>セクション外の直下に次のコードを追記する。
#: <kvm><br>&nbsp;&nbsp;<hidden state="on"/><br></kvm>
#: <br>
#: <span style="color:#C00000"><u>上記のvendor_idおよびhidden stateの2つの設定は、Quadro 2000以降のQuadroカードでは不要である。</u></span>
#: <br>
# また、QEMU 4.0上において、仮想マシンにQ35チップセットを使用する場合、<code>features</code>セクション内に以下の設定を記述する。<br><code><ioapic driver="kvm"/></code>
# 最後に、libvirtdを再起動する。
#: sudo systemctl restart libvirtd
<br>
'''自動での設定'''<br>
GitHubにあるvirsh-patcherパッケージは、簡単に上記の方法を行うことができる。<br>
git clone https://github.com/PassthroughPOST/virsh-patcher virsh-patcher
<br>
以下のコマンドを実行して修正を適用する。<br>
sudo virshpatcher --error43 --vendor-id 123456789ab <仮想マシン名>
<br><br>
 
===== ネットワーク =====
VM起動時に下記のエラーが出力されて、VMが起動できないことがある。<br>
VM起動時に下記のエラーが出力されて、VMが起動できないことがある。<br>
  ERROR    Requested operation is not valid: network 'default' is not active
  ERROR    Requested operation is not valid: network 'default' is not active
803行目: 715行目:
  sudo virsh net-define --file default.xml
  sudo virsh net-define --file default.xml
<br>
<br>
 
==== ファイアーウォール ====
===== ファイアーウォール =====
VM起動時に下記のエラーが出力されて、VMが起動できないことがある。<br>
VM起動時に下記のエラーが出力されて、VMが起動できないことがある。<br>
  error: Failed to start network default
  error: Failed to start network default
816行目: 727行目:
  sudo systemctl restart libvirtd
  sudo systemctl restart libvirtd
<br>
<br>
===== DNSマスカレード =====
==== DNSマスカレード ====
VM起動時に下記のエラーが出力されて、VMが起動できないことがある。<br>
VM起動時に下記のエラーが出力されて、VMが起動できないことがある。<br>
  error: Failed to start network default
  error: Failed to start network default

案内メニュー