次の方法で共有


個別のデバイス割り当てを使用してグラフィックス デバイスを展開する

個別デバイス割り当て (DDA) を使用して、PowerShell を使用して PCIe デバイス全体を仮想マシン (VM) に渡す方法について説明します。 これにより、デバイスのネイティブ ドライバーを適用しながら、VM 内から NVMe ストレージ やグラフィックス カードなどのデバイスに高パフォーマンスでアクセスできます。 動作するデバイスとセキュリティへの影響の可能性の詳細については、「 個別のデバイス割り当てを使用してデバイスを展開する計画」を参照してください。

この記事では、DDA でデバイスを使用する手順について説明します。

  1. DDA 用に VM を構成する
  2. ホスト パーティションからデバイスをマウント解除する
  3. デバイスをゲスト VM に割り当てる

[前提条件]

DDA を使用してグラフィックス デバイスを展開するには、次のものが必要です。

  • Windows Server 2016 以降を実行している Hyper-V ホスト。

  • 次のいずれかのオペレーティング システムを実行している VM:

    • Windows Server 2016 以降。

    • Windows 10 以降。

  • 個別のデバイス割り当てを使用してデバイスを展開するための計画を確認し、ハードウェアが DDA と互換性があることを確認します。

    • SurveyDDA.ps1を実行 します。 サーバーが正しく構成されているかどうかを識別する PowerShell スクリプト。 スクリプトには、個別のデバイス割り当てを使用して渡すことができるデバイスも表示されます。
  • Hyper-V ホストに対する管理者権限。

  • (省略可能)必須ではありませんが、 単一ルート I/O 仮想化 (SR-IOV) が有効になっていないか、サポートされていない場合、DDA を使用してグラフィックス デバイスを展開するときに問題が発生する可能性があります。

DDA 用に VM を構成する

ソリューションの最初の手順は、VM に対する DDA の制限に対処することです。

  1. Hyper-V ホストに管理者としてサインインします。

  2. 管理者権限の PowerShell プロンプトを開きます。

  3. 次の PowerShell コマンドレットを使用して Automatic Stop Action を有効にするように VM のを構成します。

    Set-VM -Name VMName -AutomaticStopAction TurnOff
    

グラフィックス デバイス用の VM の準備

VM が特定の方法で構成されている場合、一部のハードウェアの方がパフォーマンスが向上します。 ハードウェアに次の構成が必要かどうかの詳細については、ハードウェア ベンダーにお問い合わせください。 詳細については、 個別のデバイス割り当てを使用してデバイスを展開するための計画 と、この ブログ投稿を参照してください。

  1. 次のコマンドレットを使用して、CPU の Write-Combining を有効にします。

    Set-VM -GuestControlledCacheTypes $true -VMName VMName
    
  2. 次のコマンドレットを使用して、32 ビット メモリ マップ IO (MMIO) 領域を構成します。

    Set-VM -LowMemoryMappedIoSpace 3Gb -VMName VMName
    
  3. 次のコマンドレットを使用して、32 ビットより大きい MMIO 領域を構成します。

    Set-VM -HighMemoryMappedIoSpace 33280Mb -VMName VMName
    

    ヒント

    表示される MMIO 空間値は、1 つの GPU で実験するために設定する妥当な値です。 VM を起動した後、デバイスが十分なリソースに関連するエラーを報告している場合は、これらの値を変更する必要がある可能性があります。 MMIO 要件を正確に計算する方法の詳細については、「 個別のデバイス割り当てを使用してデバイスを展開する計画」を参照してください。

ホスト パーティションからデバイスをマウント解除する

このセクションの手順に従って、デバイスをホスト パーティションからマウント解除します。

パーティション 分割ドライバーをインストールする (省略可能)

DDA を使用すると、ハードウェア ベンダーはデバイスにセキュリティ軽減ドライバーを提供できます。 このドライバーは、ゲスト VM にインストールされているデバイス ドライバーと同じではありません。 このドライバーを提供するのは、ハードウェア ベンダーの判断に委ねられます。 ただし、ドライバーが提供される場合は、ホスト パーティションからデバイスをマウント解除する前にドライバーをインストールします。 ハードウェア ベンダーに連絡して、軽減ドライバーがあるかどうかを確認してください。

パーティション 分割ドライバーが指定されていない場合は、マウント解除中に -Force オプションを使用してセキュリティ警告をバイパスする必要があります。 セキュリティへの影響の詳細については、「 個別のデバイス割り当てを使用してデバイスを展開する計画」を参照してください。

デバイスの場所のパスを見つける

デバイスをマウント解除してホストからマウントするには、PCI ロケーション パスが必要です。 場所のパスの例は次のようになります: PCIROOT(20)#PCI(0300)#PCI(0000)#PCI(0800)#PCI(0000)。 場所パスの検索の詳細については、「 個別のデバイス割り当てを使用してデバイスを展開する計画」を参照してください。

デバイスを無効にする

デバイス マネージャーまたは PowerShell を使用して、デバイスが 無効になっていることを確認します。

デバイスのマウントを解除する

ベンダーが緩和ドライバーを提供したかどうかに応じて、以下のように、-Force オプションを使用するかどうかを判断する必要があります。

  • 軽減ドライバーがインストールされている場合は、次のコマンドレットを使用します。

    Dismount-VMHostAssignableDevice -LocationPath $locationPath
    
  • 軽減ドライバーがインストールされていない場合は、次のコマンドレットを使用します。

    Dismount-VMHostAssignableDevice -Force -LocationPath $locationPath
    

デバイスをゲスト VM に割り当てる

最後ステップでは、VM がデバイスにアクセスする必要があることを Hyper-v に指示します。 場所のパスと VM の名前を指定します。

Add-VMAssignableDevice -LocationPath $locationPath -VMName VMName

VM でタスクを完了する

デバイスが VM に正常にマウントされると、その VM を起動し、ベア メタル システムで実行しているかのようにデバイスと対話できるようになります。 これで、ハードウェア ベンダーのドライバーを VM にインストールできるようになり、アプリケーションでハードウェアを確認できるようになりました。 これを確認するには、ゲスト VM でデバイス マネージャーを開き、ハードウェアが使用可能であることを確認します。

デバイスを削除してホストに返す

デバイスを元の状態に戻す場合は、VM を停止し、次のコマンドを発行する必要があります。

# Remove the device from the VM
Remove-VMAssignableDevice -LocationPath $locationPath -VMName VMName

# Mount the device back in the host
Mount-VMHostAssignableDevice -LocationPath $locationPath

その後、デバイス マネージャーでデバイスを再度有効にすると、ホスト オペレーティング システムがデバイスとやり取りできるようになります。

例 - GPU を VM にマウントする

この例では、PowerShell を使用して ddatest1 という名前の VM を構成し、製造元の NVIDIA が利用できる最初の GPU を取得して VM に割り当てます。

# Configure the VM for a Discrete Device Assignment
$vm = "ddatest1"
# Set automatic stop action to TurnOff
Set-VM -Name $vm -AutomaticStopAction TurnOff
# Enable Write-Combining on the CPU
Set-VM -GuestControlledCacheTypes $true -VMName $vm
# Configure 32 bit MMIO space
Set-VM -LowMemoryMappedIoSpace 3Gb -VMName $vm
# Configure Greater than 32 bit MMIO space
Set-VM -HighMemoryMappedIoSpace 33280Mb -VMName $vm

# Find the Location Path and disable the Device
# Enumerate all PNP Devices on the system
$pnpdevs = Get-PnpDevice -presentOnly
# Select only those devices that are Display devices manufactured by NVIDIA
$gpudevs = $pnpdevs | Where-Object {$_.Class -like "Display" -and $_.Manufacturer -like "NVIDIA"}
# Select the ___location path of the first device that's available to be dismounted by the host.
$locationPath = ($gpudevs | Get-PnpDeviceProperty DEVPKEY_Device_LocationPaths).data[0]
# Disable the PNP Device
Disable-PnpDevice -InstanceId $gpudevs[0].InstanceId

# Dismount the Device from the Host
Dismount-VMHostAssignableDevice -Force -LocationPath $locationPath

# Assign the device to the guest VM.
Add-VMAssignableDevice -LocationPath $locationPath -VMName $vm

GPU のマウントに関する問題のトラブルシューティング

GPU を VM に渡しても、リモート デスクトップ サービスまたはアプリケーションが GPU を認識していない場合は、次の一般的な問題を確認してください。

  • GPU ベンダーでサポートされているドライバーの最新バージョンをインストールし、ドライバーがエラーを報告していないことを確認します。 これを行うには、デバイス マネージャーでデバイスの状態を確認します。

  • デバイスに VM 内に十分な MMIO 領域が割り当てられていることを確認します。 詳細については、 MMIO スペースを参照してください。

  • ベンダーがこの構成での使用をサポートしている GPU を使用していることを確認します。 たとえば、一部のベンダーでは、VM に渡されたときにコンシューマー カードが動作することを妨げている場合があります。

  • アプリケーションが VM 内での実行をサポートしていること、およびアプリケーションが GPU とそれに関連付けられているドライバーの両方をサポートしていることを確認します。 一部のアプリケーションには、GPU と環境の許可リストがあります。

  • ゲストでリモート デスクトップ セッション ホストの役割または Windows マルチポイント サービスを使用する場合は、既定の GPU の使用を許可するように特定のグループ ポリシー エントリが設定されていることを確認する必要があります。 ゲスト (またはゲストのローカル グループ ポリシー エディター) に適用されたグループ ポリシー オブジェクトを使用します。 次のグループ ポリシー項目に移動します。

    コンピューター構成\管理者テンプレート\Windows コンポーネント\リモート デスクトップ サービス\リモート デスクトップ セッション ホスト\リモート セッション環境\すべてのリモート デスクトップ サービス セッションでハードウェア グラフィックス アダプターを使用する

    グループ ポリシーの値を [有効] に設定し、ポリシーを適用した後で VM を再起動します。