Discrete Device Assignment を使用したグラフィックス デバイスのデプロイ

適用対象: Windows Server 2022、Windows Server 2016、Microsoft Hyper-V Server 2016、Windows Server 2019、Microsoft Hyper-V Server 2019

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

重要

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

DDA でデバイスを使用するには、次の 3 つの手順があります。

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

すべてのコマンドは、Windows PowerShell コンソール上のホストで管理者として実行できます。

DDA 用に VM を構成する

ソリューションの最初の手順は、VM に対する DDA の制限に対処することです。 Automatic Stop Action次の PowerShell コマンドレットを使用して TurnOff を有効にするように VM の構成を行います。

Set-VM -Name VMName -AutomaticStopAction TurnOff

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

ハードウェアによっては、特定の方法で VM を構成するとパフォーマンスが向上します。 ハードウェアに次の構成が必要かどうかの詳細については、ハードウェア ベンダーにお問い合わせください。 詳細については、「Discrete Device Assignment を使用したデバイスのデプロイの計画」を参照してください。

  1. 次のコマンドレットを使用して、CPU で書き込み結合を有効にします。

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

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

    Set-VM -HighMemoryMappedIoSpace 33280Mb -VMName VMName
    

    ヒント

    上記の MMIO スペースの値は、単一 GPU を試すために設定する妥当な値です。 VM の起動後に、デバイスでリソース不足に関連するエラーが報告される場合は、これらの値を変更する必要があります。 MMIO の要件を正確に計算する方法については、「個別のデバイスの割り当てを使用したデバイスのデプロイの計画」を参照してください。

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

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

オプション-パーティション ドライバーをインストールする

個別のデバイスの割り当てにより、ハードウェア ベンダーは、デバイスにセキュリティ対策ドライバーを提供することができます。 このドライバーは、ゲスト VM にインストールされるデバイス ドライバーと同じではないことに注意してください。 このドライバーを提供するのは、ハードウェア ベンダーの判断に委ねられます。 ただし、ドライバーが提供される場合は、ホスト パーティションからデバイスをマウント解除する前にドライバーをインストールします。 軽減ドライバーがあるかどうかの詳細については、ハードウェア ベンダーにお問い合わせください

パーティション分割ドライバーが提供されていない場合は、-Force オプションを使用してセキュリティの警告を回避する必要があります。 詳細については、「Discrete Device Assignment を使用したデバイスのデプロイの計画」を参照してください。

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

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

デバイスを無効にする

デバイス マネージャーまたは 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

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

VM に GPU をマウントする

この例では、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 スペースがデバイスに割り当てられていることを確認します。 詳しくは、「名前空間」を参照してください。

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

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

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

    Computer Configuration\Administrator Templates\Windows Components\Remote Desktop Services\Remote Desktop Session Host\Remote Session Environment\Use hardware graphics adapters for all Remote Desktop Services sessions.

    ポリシーが適用されたら、この値を [有効] に設定してから VM を再起動します。