Hyper-V generation 2 virtual machines – part 10
Part 1: Introduction to generation 2 virtual machines
Part 2: Networking and boot order
Part 3: Storage
Part 4: Keyboard for Windows 8 & Windows Server 2012
Part 5: Kernel debugging
Part 6: Secure Boot
Part 7: FAQ
Part 8: Manually migrating generation 1 virtual machines to generation 2
Part 9: Installing from ISO
Part 10: Utility for converting generation 1 virtual machines to generation 2 (Convert-VMGeneration)
The final part (at least for now, I’m hoping a guest author will write part 11) of this series on generation 2 virtual machines in Hyper-V re-visits conversion of a generation 1 virtual machine to a generation 2 virtual machine. Part 8 walked through the manual process, assuming it is possible. However, there is an easier way with a PowerShell script I wrote and recently released. Called Convert-VMGeneration.ps1, it can be downloaded from https://code.msdn.microsoft.com/ConvertVMGeneration. The script is intended to make life as simple as possible, reducing as many as reasonably possible manual post-migration fix-ups that may be required.
Convert-VMGeneration.ps1 is self-documenting – after downloading to a local drive, running get-help .\Convert-VMGeneration.ps1 –full will give you everything you need to know on how to use. I will assume that you have read part 8 of this series before use so you understand the three phases of conversion – capture, apply and clone.
A few tips worth mentioning:
- Run reagentc /disable in the guest operating system prior to shutting down and converting (if reagentc /info indicates it is enabled). After conversion, in the generation 2 virtual machine, run reagentc /enable. This makes life a lot easier in terms of the Windows Recovery Environment and (lack of) manual intervention.
- I strongly recommend you use the –Path parameter. Alternately, after a VM has been created, move the VM and its related storage to the right path using Hyper-V Manager. Note that if you subsequently perform a storage move, data-disks which were in use by the generation 1 virtual machine will no longer be valid from its perspective.
- For the first few times of use, you might want to specify the name of the temporary .WIM file using the –WIM parameter, combined with –KeepWIM. That’ll save some time if a failure occurs during the apply or clone phases as you’ll not need to redo the potentially time-consuming capture phase. Using the -WIM parameter also makes it easier if you are running short of disk space and want to use an alternate location.
- Be aware that you may not be able to start both the generation 1 and generation 2 virtual machines simultaneously (for example if they share a data VHDX). In reality, you really don’t want both machines on the network at the same time anyway. Be cautious of other implications too such as domain joined machine account passwords changing and so on.
- Perform a move of the VM and all its data to another path after migration and you’ve verified the functionality of the converted generation 2 virtual machine. This will make it much cleaner to delete the old generation 1 virtual machine and clean up any old files which may be lingering.
- The conversion performs a highly destructive step which completely wipes a disk. If everything is to plan, it’s the blank VHDX used as the boot disk for the generation 2 virtual machine. However, things could go wrong. For that reason, I strongly recommend you heed the warning (which cannot be suppressed) and make appropriate verifications. Should data loss occur for reasons such as coding error, no liability is assumed. If in doubt, export the generation 1 virtual machine, and import it onto a scratch box. Then do the conversion. That way, you are assured you will not lose anything important IF there is a bug.
- Similar to HVRemote which some of you may have used, this script is not supported or endorsed by Microsoft Corporation.
- Don’t close the PowerShell window while a conversion is in progress. Due to a bug in Windows, you may leave your system in a state whereby a drive letter is ‘leaked’ – it will be visible in Windows File Explorer, but unusable until the system is restarted. To cancel the script while it is progress, use Control-C and wait for it to clean-up instead.
Here’s an example of the conversion of a Windows Server 2012 virtual machine. The original virtual machine is highly available. The resulting generation 2 virtual machine will need to be made highly available after migration has completed.
Here’s an example where there are some (potential) issues to resolve. One is that there is an additional data partition on the boot disk for the source VM. Windows Recovery Environment was left enabled during the migration and will not operate correctly in the generation 2 virtual machine. Lastly, the original source boot disk was a differencing disk. Appropriate fix-ups may be required to mirror the configuration on the generation 2 virtual machine.
There are some VM configurations which aren’t handled, and the script will block the conversion:
- The VM is running. The reason is simply that you cannot reasonably expect an operating system to continue running correctly if the firmware is fundamentally changed from under it.
- Checkpoints (snapshots) are in use by the generation 1 virtual machine. The reasons partly relate to the above statement – an online checkpoint is equivalent to a running VM. While offline checkpoints could be converted in theory, there are further problems:
- The mount-diskimage cmdlet that the script uses under the covers does not support .AVHDX files which are used by checkpoints. Further, the time to do the conversion would be prohibitive – each checkpoint would have to done individually.
- Rebuilding the checkpoint tree with parent/child would be pretty much impossible – at best an individual offline checkpoint could be converted to a ‘standalone’ generation 2 virtual machine.
- Hyper-V replica is enabled. The reason was simply my time to validate this scenario. In theory it should work. Obviously replica would need to be re-enabled after the conversion. The workaround is to disable replica prior to conversion, or use the “-IgnoreReplicaCheck” parameter.
- When a guest cluster is configured in the generation 1 virtual machine using a shared VHDX. A highly available/clustered VM from the parent partition perspective works fine though. I am somewhat doubtful a guest cluster would come across cleanly, and have done no validation. The script hard blocks if any VHDX in the generation 1 virtual machine is shared.
I hope you find Convert-VMGeneration.ps1 useful. I’ll try to fix any bugs you report as time permits! A note for PowerShell aficionados reading the code – I make no apologies for my lack of PowerShell skills. This was the first time I’ve undertaken writing anything of reasonable complexity in PS. I’m sure there are many ways to make the code more powershellesque in efficiency.
So with that, I’ve reached the end of the planned parts of this series on generation 2 virtual machines in Hyper-V in Windows 8.1 and Windows Server 2012 R2. I hope you enjoyed them and found them and the conversion utility useful. As always, comments, questions and feedback are welcome.
Cheers,
John.
Comments
Anonymous
January 01, 2003
Allen - it's next to impossible to give you an indication. It's so highly dependent on the speed of your storage. Open Resource Monitor and go to the Disk Tab and sort by total (B/Sec). If the interim WIM and the new VHDX are still making a lot of reads/writes, it's still going. If they've stalled and the overall disk I/O is next to zero, then there's something else wrong. I guess you could take a comparative look at the size of the new VHDX to see how close it is to the source VHD(X) as well to determine progress, but it may not necessarily be a direct correlation in the case of the source being a dynamically expanding VHD(X)Anonymous
January 01, 2003
Mur - yes, use the "-WIM" parameter to specify the full file path for where the interim WIM is stored.Anonymous
January 01, 2003
John,Thanks for another great series of articles. Also enjoyed your SR-IOV insight emensly.A couple of small things:- Does a generation 2 conversion trigger a reactivation of the OS? (HAL being replaced?)- Having a problem with a 2012VM claiming integration comp. need upgrading. Doing so produces no change.VM has SR-IOV enabled.Anonymous
January 01, 2003
I'm not the right person to comment on how Windows deals with reactivation triggers, although in the past it is true that hardware was a part of that. So on that basis, I would not be surprised if re-activation of non VL OS installations is triggered if a conversion is performed as generation 1 vs generation 2 hardware has significant differences. There is however a known bug you're hitting - there is a KB in the pipeline for publishing. When a 2012 VM runs on 2012 R2 and the VM is restarted with SR-IOV in use, we will incorrectly display that the Integration Services are out of date. This is display only. However, you should verify that they are indeed up to date by turning SR-IOV off temporarily.Anonymous
January 01, 2003
There is no effect on licensing, although reactivation MAY be triggered due to the hardware changes depending on the SKU and VL vs non-VL.Anonymous
November 14, 2013
The comment has been removedAnonymous
November 14, 2013
The comment has been removedAnonymous
November 14, 2013
The comment has been removedAnonymous
November 15, 2013
The comment has been removedAnonymous
November 21, 2013
Conversion worked on a DC (VM-2012R2), but unfortunately there is no Network Adapter at all installed now? Is it possible to get a "Microsoft Hyper-V Network Adapter" working manually? (I added such, but have "This device cannot start (Code 10)Anonymous
November 21, 2013
Fridolin - thanks for reporting this. I assume the network adapter was working before the conversion. A question worth asking just in case. We can't think of any obvious reason this would be the case, and unfortunately code 10 is a very generic code. Can you try in device manager removing the device and letting it re-enumerate by right-clicking on the computer and scanning for changes to see if it comes back correctly. Also, windowsinfsetupapi.dev.log would be an interesting file to get ahold of to see if there any errors (you can email it using the link at the top right) if the remove/reinstall doesn't work. And lastly, if there's anything interesting in the event logs. Select the device in device manager, properties and on the events tab. Thanks, John.Anonymous
November 22, 2013
Working again. I had some problems, because on my Server2012R2 (the virtualization host) the physical network adapter was gone completely after the update to R2 (ASUS-Mini ITX.... board) I checked what NIC was in and found new drivers on the Intel page, which are working perfectly [PROWinx64.exe for 64-bit (x64) editions of Windows Server 2012 R2*.] Then (after conversion to Gen2 - which by the way was working perfectly, just could not map the previously mapped ISO / CD Drive) just Do not start the VM but first go to settings, add Network Adapter => Virtual Switch => Ext .... Then start the new VM Gen2... and everything was fine. Again thanks a lot for your great support!Anonymous
January 04, 2014
The comment has been removedAnonymous
January 04, 2014
The comment has been removedAnonymous
January 04, 2014
The comment has been removedAnonymous
January 04, 2014
The comment has been removedAnonymous
January 04, 2014
The comment has been removedAnonymous
March 12, 2014
Hello John,
Thanks for the utility, is there a way to change the temp path to another drive because I am currently getting the error
" There is not enough space on the disk. The DISM log file can be found at C:WindowsLogsDISMdism.log error code 112
Completed with error. Trace status code 830"Anonymous
March 14, 2014
John...
Thank you so much for your time and effort to create this script. I am currently in the process of testing it out. I am wondering if there is a way to tell how long a conversion will take to complete.
I started the conversion on a VHD that is 30GB in size, and 4 hours later, it still says" Applying image. This will take some time..."
Since I do not know how long the conversion will take, I am left wondering if the script has frozen or if it is still running.
It would be helpful to know an average time per GB it will take to convert an image.Anonymous
March 25, 2014
Is there anything that will convert a Windows 7 VM to Gen 2?Anonymous
March 25, 2014
Duh, I should have read up more on Gen 2 VMs before asking my last questions. I see now why only Windows 8 and Server 2012R2 support Gen 2Anonymous
April 14, 2014
Hi John,
Thanks for your amazing script ! I tried it on few VM, works like a charm ! But on few VMs (our Exchange DAG), it keeps stucked a "bios" level with "Getting devices ready".
What could be the mistake ?Anonymous
May 13, 2014
John when I runnig this script I recived the error:
CatgoryInfo: Security Error: PSsecurityException
FullQualifiedErrorID: UnauthorizedAccess
Can help me?
MarcusAnonymous
May 15, 2014
Just upgraded my virtual Exchange 2013 (SP1) server with this (after running two ADDCs since months as Gen2 :-)), working like a charm... THX again for this great tool.Anonymous
May 24, 2014
Hi, What effect (if any) does this have on the license of the converted VM?Anonymous
June 24, 2014
Conversion worked fine (it was a vmware to hyper-v converted machine - Gen1) but now something strange happens. The virtual machine is seen in Hyper-v hosts (Hyper-v 2012R2) and in failover cluster manager console but not in SCVMM 2012R2 console. All other virtual machines converted from VMware and newlly created are seen except this one converted.
Any ideias?
Thanks.Anonymous
November 07, 2014
Great scrip thank you very much. I just did a test Win 8.1 VM and it worked great. A few notes:
1) I got the warning "WARNING: WinRE is configured and will need manual fixing after migration" even though it was disabled already. No worries the Gen 2 booted right up.
2) I found if you do a little maintenance on your Gen 1 VM first you can reduce your conversion time. I like to do a Disk Cleanup (2012 you need Desktop experience for this) first. Then I like to defrag twice on the VM first to do free space consolidation then a normal optimization. Finally I compact the VM's disk. This gets the VM disk as small as possible before the conversion. Just a personal preference I thought I would share.
Now off to do my dev server VMs.
Thank you very much once again!Anonymous
August 03, 2015
Recently, Microsoft released an updated Demonstration VM for Dynamics AX 2012 R3 CU9. You can find itAnonymous
August 03, 2015
Recently, Microsoft released an updated Demonstration VM for Dynamics AX 2012 R3 CU9. You can find it