とある変人のお道具箱

技術系のことにについて幅広く触れていくブログです

ESXi6.7でPCIeパススルーをしてゲストOSのWindows10でグラフィックボードを使用する

環境

www.henjins-toolbox.tech

Dell Precision Tower 7910

Windows 10 Pro(64bit)

Xeon E5-2640v4(2.4GHz) x2

NVIDIA Quadro K420

メモリ 64GB

500GB HDD + 1TB HDD

今回パススルーしたいデバイスはQuadro K420です。

またこのマシンにはESX6.7.0 Update 3 (Build 14320388)が導入されています。

ホストマシンのBIOSからの設定

やるべきことは以下の4つ。

  • PCIeグラフィックカードの有効化
  • 内蔵グラフィックの無効化
  • オンボードオーディオの無効化
  • 仮想化系の有効化

以下はDell Precision Tower 7910での設定方法を記載している。他メーカーのBIOSだと項目名が若干異なる可能性があるがすることは同じ。

  • Settings > System Configuration > AudioのEnableチェックを外してDisableにする
  • Settings > Video>Primary Video SlotからPCIeに接続しているグラフィックボードを選択
  • Settings > Virtualization Support > VirtualizationをEnableにする
  • Settings > Virtualization Support > VT for Direct I/OをEnableにする

ESXiのWebUIからの設定

ホストの設定

ナビゲータ > ホスト> 管理 > ハードウェア > PCIデバイスからパススルーしたいグラボにチェックを入れる。このときにAudio Controllerにもチェックが入ってしまうが問題ない。

チェックを入れたら、パススルーの切り替えボタンを押す。このあとESXi自体を再起動する必要がある。仮想マシンは停止してESXiを再起動し、再度WebUIからログインする。 再起動すると先ほど選択したデバイスのパススルーの項目が無効からアクティブに変わっている。 f:id:toaru_henjin:20210828151936p:plain

認識させたい仮想マシンの設定

認識させたい仮想マシンの設定をする。今回は事前にインストール済みのWindows10proが入った仮想マシンにパススルーさせる。

パススルーデバイスの選択

仮想マシンの設定の編集 > 仮想ハードウェア > その他デバイスの追加 > PCIデバイスをクリックし、先程パススルーさせたグラフィックボードを選択する。 f:id:toaru_henjin:20210828152154p:plain

割り当てメモリの予約

PCIデバイスを仮想マシンにパススルーしたときには、割り当てたメモリを全て予約しなければ起動することができない。 設定の編集 > 仮想ハードウェア > メモリ全てのゲストメモリを予約(すべてロック)にチェックを入れる。 f:id:toaru_henjin:20210828152318p:plain

パラメーター設定

NVIDIAのGPUのドライバーでは、仮想マシンであることを検知するとドライバが動作を停止してしまうことがある。そのため、パラメーターを設定して、対処が必要。 設定の編集 > 仮想マシンオプション > 詳細 > 構成パラメータからパラメータを追加をクリックし、「"hypervisor.cpuid.v0" : "FALSE"」を追加する。 f:id:toaru_henjin:20210828152421p:plain

設定を保存して、仮想マシンを起動する。

注意

このときはグラフィックボードに映像ケーブルを接続しないようにしましょう。接続してしまうとパススルーされてるのでそのケーブルから映像が出力されてモニターに表示されるので、ESXiのWebUIから映像を確認することができません。これのせいで、仮想マシン起動してるのに画面真っ暗やんけ!とn時間つまりました(n敗)

仮想マシンからの設定

仮想マシンにドライバをインストール

NVIDIAのサイトからグラフィックボードにあう、ドライバを検索しダウンロードする。 このあたりは仮想マシンであることは意識せず、自作PCと同様のことをすれば問題ない。

ドライバ停止対策

このままWindowsを再起動すると、次に起動したときにグラフィックボードのドライバが停止してしまいややこしいことになる(n敗) f:id:toaru_henjin:20210828152918p:plain

シャットダウンや再起動前にデバイスマネージャーからドライバを無効化し、起動後にデバイスマネージャーから有効化することで回避できるが、毎度手動で無効化有効化をするのはめんどくさいし、絶対に忘れるのでスクリプトを登録する。まずWindows Driver Kitに含まれているdevcon.exeを導入する。導入方法はこちらの記事に載せている。

スタートアップ時に有効化するスクリプト

devcon enable "PCI\VEN_10DE&DEV_0FF3"

シャットダウン時に無効化するスクリプト

devcon disable "PCI\VEN_10DE&DEV_0FF3"

これらのスクリプトをそれぞれ任意の名前のbatファイルとして保存し、それぞれ

  • C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup
  • C:\Windows\System32\GroupPolicy\Machine\Scripts\Shutdown に格納する。

引数のデバイスインスタンスパスはグラフィックボードの種類ごとに異なる。この例はQuadro K420のもので、デバイスマネージャーのプロパティ > 詳細 > デバイスインスタンスパスの値から確認できるので、各自の環境に合わせたパスを設定する。 f:id:toaru_henjin:20210828153028p:plain

コントロールパネルからローカルグループポリシーエディタを開き、スタートアップ、シャットダウン時に実行されるスクリプトとして登録します。 f:id:toaru_henjin:20210828153018p:plain

これで一度シャットダウンしてから起動しても正常にグラフィックボードが認識されるようになります。

参考文献

VMware ESXi 7.0 での GPU パススルー設定手順 - setodaNote

技術メモメモ: ESXi上の仮想マシンでNVIDIA GTX1650を直接使えるようにしてみた (GPUパススルー)

ESXi6.7でGPUパススルーしてCUDA10とChainer4.4を使ってみる - Qiita