Migrating from ESXi 5.5 to Hyper-V 2016

This guide explains how to migrate from ESXi 5.5 to Hyper-V 2016.

I am was a happy user of VMWare ESXi. I started with 5.0, migrated to 5.1 and then to 5.5. However, over the years VMWare has shown little love to the smaller labs. They have been migrating over to web management which requires much more setup to manage my (1!) VMWare server. For now I have always accepted this burden, but this week I finally gave up on VMWare for the following reasons:

  1. My server has 64 GB of RAM meaning I have to buy (and renew!) a license. But there is nothing to renew because they aren’t maintaining the management tool. Hyper-V is free!
  2. My virtualized development machines could not run any emulators (because they are all hyper-v based). I tried a lot (it should be possible with some hacks), but couldn’t get it to work.
  3. No complex web management, I can connect to the Hyper-V server from a local Hyper-V manager instance.

Tools

Below are the tools I used for the migration:

Tool Description
CopyFile Can copy extremely large files (the virtual hard disks) with resume options in case your network has a hickup
StarWind V2V Converter Converts your VMWare disks to the required vhdx format

Prerequisite steps

Before shutting down your VMWare server, perform the following steps.

  1. Uninstall VMWare tools from all virtual machines (you won’t be needing them)
  2. Shut down all the virtual machines
  3. Backup the virtual machines (in my case, to a NAS). You can use the CopyFile utility here.
  4. Convert the disks using the StarWind V2V Converter. I enabled Windows Repair Mode on all conversions, but not sure if that was really required. This step takes a long time, make sure to start this a soon as possible.

Hyper-V installation

Now we have a backup of all the virtual machines, it’s time to start the installation of Hyper-V. Burn an image of the Hyper-V server installation media so it’s ready.

  1. [optional]. Upgrade the drivers of your raid controller. I have an intel raid controller and had a terrible copy file performance (lots of hickups, 4 MB / s). After trying a lot, I decided to update the raid controller drivers. After this upgrade, the problems were gone so I recommend to do this as a first step to not lose a day like I did.
  2. Insert the Hyper-V media and install Hyper-V server

Post Hyper-V installation steps

  1. Enable remote management (if you are not in a domain, scroll to the bottom)
  2. Connect to the remote Hyper-V server using Hyper-V Manager on any Windows machine (in my case, my computer running Windows 10).
  3. Enable remote file access:
    netsh advfirewall firewall set rule group=”File and Printer Sharing” new enable=Yes
  4. Enable remote desktop access using option 7 in the Hyper-V configuration command line

Migration steps

Once Hyper-V is installed and configured, you can start adding your virtual machines.

  1. Copy the vhdx files to your Hyper-V server using CopyFile. Note that you need to use this destination folder:
    \\[servername]\C$\Users\Public\Documents\Hyper-V\Virtual hard disks\[vmname]
  2. Now the file is copied, create a new virtual machine but don’t forget to connect the existing virtual hard disk.
  3. By default Hyper-V will create a virtual machine with a single CPU. Go to the settings of the virtual machine to update it to the correct number (e.g. 4).
  4. Start the virtual machine, it should start without any issues.

Discovering open source WPF components – Orc.Wizard

In the discovering open source WPF components series, I will look into useful open source components that can be used to create WPF apps. This weeks component is Orc.Wizard.

A wizard is a great way to guide users through a process. Every wizard should behave the same, but there is no great out-of-the-box experience in WPF. The wizard included in this library has a few nice features:

  1. Automatic page management (with everything you expect from next / previous / finish, etc)
  2. Automatic (but optional) summary page that gathers all the information from each page to summarize what has been selected inside the wizard
  3. Optional pages that allow users to skip to a next page. It is also possible to enforce validation on a wizard page.
  4. Nice looking wizard header that is generated automatically based on the accent color

In summary, this library allows you to focus on the actual wizard content (the pages), not the wizard itself which is fully taken care of for you.

wizard

Creating wizard pages

A wizard page contains of three parts which are explained below.

Creating the wizard page model

The wizard model will hold all the information of the wizard page and return the summary (which is optional).

Creating the wizard page view model

The view model is responsible for the actual view logic. There can be a lot of stuff in here that is view-specific, as long as the results are stored into the model. This example uses the ViewModelToModel feature of Catel to automatically map the values between the view model and model. As you can see this example even contains validation, so users cannot continue to the next page when the validation does not succeed.

Creating the wizard page view

Below is the xaml view for the wizard page. Note that it’s just an ordinary Catel UserControl.

Creating the wizard

Once all the wizard pages have been created, it’s time to wrap it inside an actual wizard. Below is an example:

Using the wizard

Using the wizard can be done via the IWizardService. Below is an example on how to show a wizard:

Discovering open source WPF components – Orc.WorkspaceManagement

In the discovering open source WPF components series, I will look into useful open source components that can be used to create WPF apps. This weeks component is Orc.WorkspaceManagement.

Workspaces are a great way to empower your end-users to customize the layout of the screen to their own good. There are a lot of different components that can be customized inside an application (some views need settings to be stored, others should be ignored, etc). Orc.WorkspaceManagement provides a nice wrapper around this so whenever the user wants to store a workspace, each component can be stored separately using providers.

orc_workspacemanagement

Retrieving a list of workspaces

Retrieving the current workspace

Retrieving the currently selected workspace is very easy:

To get a typed instance:

Implementing providers

Providers are classes that do the hard work. They will take care of actually saving and loading the state of a specific workspace. Below is a provider that will store the IsMinimized state of a ribbon:

Storing and saving workspaces

The last step is storing workspaces and saving workspaces to disk. Since all the hard work is done by the IWorkspaceManager, it’s very easy to implement this final step.

Storing the workspace means the workspace manager will call all providers to gather their data so the UI state as it’s currently visible on the screen will be persisted into the current active workspace:

To save all workspaces in the workspace manager to disk, use the following code: