よろづやアンテナ

ITから生活の参考になる情報を備忘録代わりに残していきます

WindowsServer2016のHyper-vディスクリートデバイス割り当て

マイクロソフトVMwareCiscoなど海外製品の情報を収集するならやっぱり海外ブログ、サイトが参考になります。日本は体質上、中々ブログなどで技術情報を公開しにくい面があるので、難しいのでしょう。


そして、WindowsServer2016のHyper-vディスクリートバイス割り当てについても海外ブログが参考になりました。なぜ、この情報が必要かと言うと、NVMeのようなSAS、SATと違い、コントローラを介さず直接、ディスクと接続するようなケースでは、パススルー機能を使うことで、ゲストOSがNVMeを利用することができるようになるそうです。


情報元はこちら。

https://blogs.technet.microsoft.com/virtualization/2015/11/19/discrete-device-assignment-description-and-background/ 


Windows Server 2016では、Hyper-VにDiscrete Device Assignmentという新しい機能を導入しています。ユーザーはシステム内のPCI Expressバイスの一部を取り出し、ゲストVMに直接渡すことができます。これは、実際には過去にSR-IOVネットワーキングに使用してきた技術とほとんど同じです。

続いてNVMeについて言及されています。一度はセキュリティの観点で廃止になった機能のようですが、市場のニーズに合わせて2016では機能を復活させたようです。

さらに、NVMe(Non-Volatile Memory Express)も登場しています。NVMeを介して接続されたSSDは、SATAまたはSASを介して接続されたSSDより数倍高速になります。また、NVMeでSR-IOVを実行する方法の完全な仕様が得られるまで、ストレージアプライアンスVMで完全なパフォーマンスを実現するには、デバイス全体を通過させることが唯一の選択肢です。

Windows Server 2016では、NVMeデバイスをゲストVMに割り当てることができます。これらのVMは、ホストとハイパーバイザーを管理する同じ管理チームの管理下にあるVMであることが推奨されます。

 

設定は、PowerShellを介してのみ利用可能で、Hyper-Vマネージャには何も設定がないそうです。

 

次に示すのは、システム内のすべてのNVMeコントローラを検出し、そこからデフォルトのドライバをアンロードし、管理OSからマウント解除し、ゲストVM用のプールで使用できるようにするPowerShellスクリプトです。

# get all devices which are NVMe controllers

$pnpdevs = Get-PnpDevice -PresentOnly | Where-Object {$_.Class -eq "SCSIAdapter"} | Where-Object {$_.Service -eq "stornvme"}

 

# cycle through them disabling and dismounting them

foreach ($pnpdev in $pnpdevs) {

disable-pnpdevice -InstanceId $pnpdev.InstanceId -Confirm:$false

$locationpath = ($pnpdev | get-pnpdeviceproperty DEVPKEY_Device_LocationPaths).data[0]

dismount-vmhostassignabledevice -locationpath $locationpath

$locationpath

}


すでにNVMeコントローラを使用しているかどうかによって、実際にNVMeコントローラを無効にしてから取り外すまで再起動する必要があります。しかし、両方を無効にして(ドライバを削除して)、マウント解除すると(管理OSから離れてしまった)、それらをすべてプール内で見つけることができます。もちろん、このプロセスをMount-VMHostAssignableDeviceコマンドレットとEnable-PnPDeviceコマンドレットで逆にすることもできます。

上記のスクリプトを私のテストマシン上で実行した結果、唯一のNVMeコントローラがあり、次にプール内のデバイスのリストを尋ねる。

[jakeo-t620]: PS E:\test> .\dismount-nvme.ps1
PCIROOT(40)#PCI(0200)#PCI(0000)
[jakeo-t620]: PS E:\test> Get-VMHostAssignableDevice

InstanceID : PCIP\VEN_144D&DEV_A820&SUBSYS_1F951028&REV_03\4&368722DD&0&0010
LocationPath : PCIROOT(40)#PCI(0200)#PCI(0000)
CimSession : CimSession: .
ComputerName : JAKEO-T620
IsDeleted : False


ディスマウントされたPCI ExpressバイスのプールにNVMeコントローラが追加されたので、それらをVMに追加できます。上記のInstanceIDを使用し、LocationPathを使用して「プールから任意のデバイスを取得する」と言うだけで、基本的に3つのオプションがあります.VMに複数のデバイスを追加できます。また、VMの実行中であっても、いつでも追加または削除できます。このNVMeコントローラを「StorageServer」というVMに追加します。


[jakeo-t620]: PS E:\test> Add-VMAssignableDevice -LocationPath "PCIROOT(40)#PCI(0200)#PCI(0000)" -VMName StorageServer


スクリプトが好きではない場合、InstanceIDはDevice Managerの[Details]タブの[Device Instance Path]にあります。ロケーションパスも詳細の下にあります。ここでデバイスを無効にしてから、PowerShellを使用してデバイスをマウント解除できます。
最後に、スクリーンショットのないブログ投稿ではありません。そのVMのデバイスマネージャーは、「View by Connection」で再整理されています。これは、単にVMについて話していることを証明しているからです。

 

f:id:merrywhite:20200421043055p:plain



手順がちょっと複雑なので、少し勉強する必要がありそうです。手順が整理できたらまたブログでアップします。