Hyper-V 2016 NVMeデバイス上の容量可変仮想ディスクの自動解放、unmapに対応しているかという調査をしているんですが、日本のサイト、ブログなどでは中々情報がないですね。


これについて、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について話していることを証明しているからです。


StorageServer


この機能、VMwareで言う、Raw Device Mapping(RDM)のようなイメージになりますが、何がいけてないかというと、ホスト側でデバイスマネージャーによる無効化が必要であるということです。これによりホスト側で再起動が必要です。


動作確認していませんが、ホスト側は無効になり、ゲストにパススルーするわけですが、これにより、ホスト側は管理できなくなります。さらに、複数対他の接続ができるかもわからないので、現状はこの機能は使いにくいですね。


ちなみに、冒頭に戻って、Hyper-V 2016 NVMeデバイス上の容量可変仮想ディスクの自動解放、unmapが動作するかというと、NVMeというキーワードを除き、外部ストレージを利用すれば、容量解放されると思います。ただし、VMwareでいうVAAIに対応していない場合は、自動解放されないと思われます。


また、自動で不要領域は解放されませんが、「最適化」することでWindowsの場合は、不良領域の開放が行われます。ただし、仮想サーバの停止を伴うので、運用によっては使いにくいですね。