パソコンやスマホに関することを気ままに書いていきます!

ブログ

Windows Server 2019の仮想マシンでGPUパススルーをする

投稿日:2022年9月8日 更新日:

スポンサーリンク

はじめに

今回はWindows Server 2019の仮想マシン(Hyper-V)でGPUパススルーをやってみたので備忘録として残しておきます。ゲストOSはWindows11です。
調べてみると、2016だと出来て2019ではサポートしているものの出来ないという記事がありましたが僕の環境では問題なく動きました。もしかしたら最近のアップデートで対応したのかもしれませんね。
やり方のみ知りたい方は次の目次まで読み飛ばしてください。

仮想マシンでグラボを使うにはいくつか方法があります。

  • RemoteFX
  • DDA (Discrete Device Assignment)
  • GPU-PV

「RemoteFX」は脆弱性の問題から2021年4月の段階で無効化・削除されているため利用できません。
「GPU-PV」であれば1台のGPUリソースを最大で4つの仮想マシンに共有できますが、Windows Server2019ではサポートしていなかったため利用できませんでした。
最後に残ったのが「DDA」です。これはホストマシンのPCIに接続された物理デバイスを仮想マシンにパススルーするという機能になります。仮想マシンから直接グラボにアクセスできるようになります。
今回はこのDDAを使いHyper-VのWindows11へGPUパススルーを行います。

現在のマシンスペック(主なパーツ)

CPURyzen7 1700X
M/BASUS X370-F Gaming
RAM64GB (16GB×4)
GPU1GT710
GPU2RTX2060
OSWindows Server 2019 (1809)

今回パススルーに使うグラボはRTX2060です。
仮想マシンはすでに作成してあることを前提に進めていきます。
ちなみに今回はWindows11をゲストOSにするため仮想マシンは第2世代に設定します。
Windows11をインストールする場合は仮想マシンの設定から「暗号化のサポート"トラステッド プラットフォームモジュールを有効にする"」にチェックを入れる必要がありました。

GPUパススルーのやり方について

グラボのインスタンスIDを確認

仮想マシンを作成後シャットダウンして、管理者権限でパワーシェルを起動します。
下記コマンドを実行してパススルーしたいグラボのインスタンスIDを確認してメモしておきましょう。

Get-PnpDevice -PresentOnly | where {$_.InstanceID -like 'PCI*'} | select InstanceID,FriendlyName | sort FriendlyName

今回は「PCI\VEN_10DE&DEV_1F08&SUBSYS_152719DA&REV_A1\4&1DA95F35&0&0019 NVIDIA GeForce RTX 2060」と表示されています。RTX2060と記載されているため分かりやすいですが、もしどのデバイスかわからない場合はThe PCI ID Repositoryから「VEN」「DEV」を確認しておくと良いでしょう。
例) VEN_XXXX&DEV_XXXX → 各XXXXの4桁
必要な部分は「PCI\VEN_10DE&DEV_1F08&SUBSYS_152719DA&REV_A1\4&1DA95F35&0&0019」です。
メモしておきましょう。

デバイスIDへ代入

下記コマンドを入力し、デバイスIDへ先ほどメモした文字列を入力します。

$deviceID = '先ほどメモした文字列'

僕の環境では「$deviceID = 'PCI\VEN_10DE&DEV_1F08&SUBSYS_152719DA&REV_A1\4&1DA95F35&0&0019'」と入力しています。

ロケーションパスの取得

下記コマンドを入力し、ロケーションパスを取得します。

$locationPath = (Get-PnpDeviceProperty -KeyName DEVPKEY_Device_LocationPaths -InstanceID $deviceID).Data[0]

GPUをホスト上で無効化

下記コマンドを入力し、ホスト上からグラフィックボードを無効化します。

Disable-PnpDevice -InstanceId $deviceID

GPUをホストからアンマウント

下記コマンドを入力し、ホスト上からグラフィックボードをアンマウントします。

Dismount-VMHostAssignableDevice -force -LocationPath $locationPath

ここで「PCI Express バスをOSが制御できません」といったエラーが発生する場合はBIOSもしくはUEFIの設定を変更する必要があります。
SR-IOV」を有効にしてください。

GPUを仮想マシンに割り当てる

続いて下記コマンドを入力し、仮想マシンにグラフィックボードを割り当てます。

Add-VMAssignableDevice -VMName '仮想マシンの名称' -LocationPath $locationPath -Verbose

僕の場合、仮想マシンの名前を「Windows11」にしたので「Add-VMAssignableDevice -VMName 'Windows11' -LocationPath $locationPath -Verbose」と入力しています。
これで完了です。

うまくいけばこの様になるはずです。

もし仮想マシンからGPUの割当を解除したくなった場合は下記コマンドでアンマウント出来ます。

Remove-VMAssignableDevice -VMName '仮想マシンの名称' -LocationPath $locationPath -Verbose

仮想マシンを起動して確認

では仮想マシンを起動してみましょう。

デバイスマネージャーを開いてみると「Microsoft Hyper-V ビデオ」のほかに「Microsoft 基本ディスプレイアダプター」と表示されています。

ドライバをインストールしたところ、無事に「NVIDIA RTX2060」と表示されました。
問題なくパススルー出来ています!

おわりに

今回はWindows Server 2019の仮想マシンでGPUパススルーを試してみました。
これで仮想マシン上でゲームなどが出来るはずです。リモートアクセスする場合、多少の遅延はありますが実用に耐えられるのか次回以降試してみようと思います。
今回のやり方だと、仮想マシンの数だけグラボが必要です。
そのため、1台のPCで複数のゲーム用仮想マシンを作るのはかなりのコストがかかる上、マザーボードによっては物理的に搭載できるグラボは限られておりCPU側のレーン数も足りなくなります。
本当であれば1台のGPUを複数の仮想マシンに利用できる「GPU-PV」を利用したかったのですが、僕の環境ではOSがサポートしていなかったためダメでした。Windows Server2022に移行すれば良いのですが費用と時間がかかるため正直面倒です…
複数のゲーム用仮想マシンを作るのはロマンですが、実際に複数人で使う機会があるかと言われると、うーん…
1台のPCで複数のゲーミング仮想マシンを運用するとなるとグラボだけでなくCPUもかなり高スペックが要求されます。初代Ryzen7 1700Xはあまりクロックが出ないし、8コア16スレッドなので3~4台の仮想マシンを動かすとなるとスペック的には微妙です。
いつかサーバを別の構成へ変えることがあればやってみたいですね。

スポンサーリンク

-ブログ


comment

メールアドレスが公開されることはありません。

関連記事

1台のPCで複数のマイクラサーバ(マルチ)を構築する方法

目次1 はじめに2 マイクラサーバの設定3 ポート開放4 マルチでプレイ5 まとめ はじめに 今回は複数のマイクラマルチサーバを1台のパソコンで構築する方法を紹介します!新しくマイクラ鯖を建てたいけど …

ウィルス解析と分散コンピューティング「Folding@home」導入方法と使い方について

目次1 はじめに2 導入方法2.1 ダウンロード2.2 インストール2.3 起動2.3.1 Webから参加2.3.2 アプリケーションから参加2.4 使用率の確認3 個人参加とチーム参加4 まとめ は …

【第1回】サイト高速化のために行った3つのこと

目次1 はじめに2 レンタルサーバーの設定変更3 高速化プラグイン導入3.1 W3 Total Cache3.1.1 設定3.1.1.1 基本設定3.1.1.2 モバイル用設定3.2 EWWW Ima …

カメラの保管・メンテナンス用品を買った

目次1 はじめに2 保管用品2.1 ドライボックス3 メンテナンス用品3.1 ボディブラシ3.2 レンズペン3.3 ブロワー3.4 クリーニングペーパー4 まとめ はじめに 今回はカメラの保管用品とメ …

iPhone6を大容量バッテリーに交換する

目次1 はじめに2 今回使うバッテリー3 いざ分解3.1 シャットダウン3.2 フロントパネルを開ける3.3 バッテリーを取り外す3.4 新しいバッテリーの取り付け3.5 外したパーツをもとに戻す3. …

スポンサーリンク