When you are deploying PVS infrastructure based on Hyper-V you can observe Blue Screen (BSOD) during VM boot. SYSTEM_THREAD_EXCEPTION_NOT_HANDLED (CVhdMp.sys).
It’s caused by incorrect streaming NIC identifier. The same issue you can observe, when you create new VM with existing disk (and OS). This problem was described in MSDN post:
Hyper-V: Why is networking reset in my VM when I copy a VHD?
Citrix post KB: Hyper-V Synthetic Network Interface Card Reinitializes on New Target Devices
I was wondering what is the root case and why this problem does not occur on XenServer or VMware.
DELL LAPTOP
From John’s post we know, that each NIC has it’s own GUID. Let’s try to find it for our NICs. Here it the example for my Dell laptop:
PS C:\> Get-NetAdapter | select ifDesc, ifAlias, PnPDeviceID ifDesc ifAlias PnPDeviceID ------ ------- ----------- Intel(R) Dual Band Wireless-AC 8260 Wi-Fi PCI\VEN_8086&DEV_24F3&SUBSYS_00508086&REV_3A\F48C50FFFFCC6D9D00 Intel(R) Ethernet Connection I219-LM Ethernet PCI\VEN_8086&DEV_156F&SUBSYS_06DE1028&REV_21\3&11583659&0&FE
PnPDeviceID (from MSDN): Indicates the Win32 Plug and Play device ID of the logical device.
As you can see, I have 2 Network Adapters, both on PCI. We can look for the first device:
PCI\VEN_8086&DEV_24F3&SUBSYS_00508086&REV_3A\F48C50FFFFCC6D9D00
We have: VEN_xxxx (Vendor ID: 8086), DEV_xxxx (Device ID: 24F3). Let’s decode it:
VEN_8086
Intel Corporation
DEV_24F3
Intel(R) Dual Band Wireless-AC 8260
Intel(R) Dual Band Wireless-N 8260
SUBSYS_00508086
Intel(R) Dual Band Wireless-AC 8260
Vendor list: https://driverlookup.com/hardware-id/pci
As you can see, who ever install this adapter in computer/laptop then he will see the same GUID.
XENSERVER
Let’s do the same on XenServer Virtual Machines.
PS C:\> Get-NetAdapter | select ifDesc, ifAlias, PnPDeviceID ifDesc ifAlias PnPDeviceID ------ ------- ----------- XenServer PV Network Device #0 Ethernet XENVIF\VEN_XS0002&DEV_NET&REV_00000000\0
We can check it on other VMs:
All VMs have the same GUID for all NICs.
Hyper-V Virtual Machine
So now we can check it on VMs on Hyper-V.
PS C:\> Get-NetAdapter | select ifDesc, ifAlias, PnPDeviceID ifDesc ifAlias PnPDeviceID ------ ------- ----------- Microsoft Hyper-V Network Adapter #2 Data VMBUS\{F8615163-DF3E-46C5-913F-F2D2F965ED0E}\{38A2857B-7740-47D9-BE64-53561AD3F981} Microsoft Hyper-V Network Adapter Streaming VMBUS\{F8615163-DF3E-46C5-913F-F2D2F965ED0E}\{E5D7B629-A61A-4788-9304-E192F3F8B8F6}
OK, that’s strange. This ID is in complete different format then it should be. The second part of this description is generated randomly for each new Virtual Machine. And this cause the problem. When you create the image – using PVS Imagining Wizzard – GUID for streaming network adapter is stored. When we create new VM (on Hyper-V) is will get the new GUID and when we try to boot it Windows can’t find the proper NIC and just crash (BSOD).
John also pointed, that this ID is stored in VM XML file. But it’s not supported just to change it right there.
SOLUTION
This GUID remain when you clone the VM. So unfortunately, you have to grab the image from one VM and then you have to clone it as many times as you need Target Devices.
Citrix also published KB: How to Manually Create Hyper-V GEN2 Provisioning Services Target Devices but I have’t test it yet.