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

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

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

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

前提条件

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

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

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

    • Windows Server 2016 以降。

    • Windows 10 以降。

  • Discrete Device Assignment を使用したデバイスの導入計画 を参照して、ハードウェアが DDA と互換性があることを確認してください。

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

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

DDA 用に VM を構成する

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

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

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

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

    Set-VM -Name VMName -AutomaticStopAction TurnOff
    

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

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

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

    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 スペースの値は、単一 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 を再起動します。