<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Ben Armstrong’s Virtualization Blog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/virtual_pc_guy/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/virtual_pc_guy/feed.xml</link>
    <description>Hyper-V Program Manager</description>
    <lastBuildDate>Mon, 01 Jan 2018 20:00:34 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Moving to a new home...</title>
      <link>https://docs.microsoft.com/archive/blogs/virtual_pc_guy/moving-to-a-new-home</link>
      <pubDate>Mon, 01 Jan 2018 12:00:30 GMT</pubDate>
      <dc:creator><![CDATA[Benjamin Armstrong]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/virtual_pc_guy/?p=15115</guid>
      <description><![CDATA[This is the last blog post that I am going to write as Virtual PC Guy. But do not fear, I am...]]></description>
      <content:encoded><![CDATA[This is the last blog post that I am going to write as Virtual PC Guy. But do not fear, I am starting a new blog over at <a href="https://american-boffin.com/">american-boffin.com</a>, and all the Virtual PC Guy posts are going to remain intact.

You may wonder why I am making this change?

Well, there are several reasons.
<ul>
 	<li>It’s been a long time. I have written 1399 blog posts over 14 years – averaging one new post every other working day. When I started this blog, I had more hair and fewer children.</li>
 	<li>The world has changed. When I started writing as Virtual PC Guy, virtualization was a new and unknown technology. Cloud computing was not even invented yet. It is amazing to think about how far we have come!</li>
 	<li>The scope and impact of my work has drastically increased. When I started blogging, there were a very select group of people who cared about virtualization. Now, between cloud computing, the rise of virtualization and containerization as standard development tools – and the progress we have been making on delivering virtualization based security for all environments – more and more people are affected by my work.</li>
 	<li>I am a manager now. When I started on this blog I was a frontline program manager – and most of my time was spent thinking about and designing technology. I have been a program manager lead for almost a decade now – and while I do still spend a lot of time working with technology – I spend more time working with people.</li>
 	<li>Maintaining multiple blogs is hard. I have tried, from time to time, to start up separate blogs for different parts of my life. But maintaining a blog is a lot of work. Maintaining multiple blogs is just too much work for me.</li>
 	<li>Virtual PC Guy has a very distinctive style. Over the years I have toyed with the idea of switching up the style of Virtual PC Guy – but I have never been able to bring myself to do it.</li>
</ul>
For all these reasons – I have decided that the best thing to do would be to archive Virtual PC Guy (I have posts that are 10 years old and are still helping people out!) and to start a new blog.

On my new blog – I will still talk about technology – but I will also spend time talking about working with customers, working with people in a corporate environment, and about whatever hobbies I happen to be spending my time on.

I hope you come and join me on my <a href="https://american-boffin.com/">new blog</a>!

Cheers,
Ben]]></content:encoded>
    </item>
    <item>
      <title>Getting VM Memory Usage and Demand Programmatically</title>
      <link>https://docs.microsoft.com/archive/blogs/virtual_pc_guy/getting-vm-memory-usage-and-demand-programmatically</link>
      <pubDate>Mon, 12 Jun 2017 08:26:29 GMT</pubDate>
      <dc:creator><![CDATA[Ben Armstrong [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/virtual_pc_guy/?p=15095</guid>
      <description><![CDATA[A couple of people have recently asked me how to get virtual machine memory usage and memory demand...]]></description>
      <content:encoded><![CDATA[<p>A couple of people have recently asked me how to get virtual machine memory usage and memory demand programmatically.&nbsp; What I am referring to is the information that we display here in Hyper-V Manager:</p><p><a href="https://msdnshared.blob.core.windows.net/media/2017/06/image327.png" target="_blank"><img width="644" height="387" title="image" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/06/image_thumb310.png" border="0"></a></p><p>I have blogged about this <a href="https://blogs.msdn.microsoft.com/virtual_pc_guy/2010/09/08/scripting-dynamic-memory-part-2-displaying-current-usage-information/" target="_blank">in the past</a> – but things have changed a bit since then – so I thought I would post an updated code sample.&nbsp; Right here:</p><p><script src="https://gist.github.com/BenjaminArmstrong/d891426a2847f16b4b8a82da0fd55fd9.js"></script><br></p><p>There are two main things to call out about this sample:</p><ul><li>This information is all exposed on <a href="https://msdn.microsoft.com/en-us/library/hh850217(v=vs.85).aspx" target="_blank">Msvm_SummaryInformation</a> – which is documented here.</li><li>Memory demand is actually reported as a percentage of the used memory in the underlying API.&nbsp; So to get the same information as is displayed by Hyper-V Manager – you have to do some math (included in the sample above)</li></ul><p>Cheers,<br>Ben</p>]]></content:encoded>
    </item>
    <item>
      <title>Using Hyper-V Resource Pools to ease migration between different configurations</title>
      <link>https://docs.microsoft.com/archive/blogs/virtual_pc_guy/using-hyper-v-resource-pools-to-ease-migration-between-different-configurations</link>
      <pubDate>Wed, 03 May 2017 07:56:53 GMT</pubDate>
      <dc:creator><![CDATA[Ben Armstrong [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/virtual_pc_guy/?p=15067</guid>
      <description><![CDATA[Today I was asked about the following configuration:

A user has a stretched Hyper-V cluster...]]></description>
      <content:encoded><![CDATA[Today I was asked about the following configuration:

A user has a stretched Hyper-V cluster running between two datacenters.  This stretched cluster is sitting on top of replicated storage.  However, the storage appears in a different location on either side of the cluster.  How can this be made to work?

So the configuration is like this:

<a href="https://msdnshared.blob.core.windows.net/media/2017/05/image35.png"><img width="955" height="449" title="image" style="border: 0px currentcolor" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/05/image_thumb38.png" border="0" /></a>

The problem is that when a virtual machine moves from one side of the cluster to the other – it needs to have its storage path changed automatically.

Fortunately, Hyper-V has all the infrastructure you need for this.  The key piece of technology to use here is Hyper-V storage resource pools.  Hyper-V storage resource pools allow you to remove path details from the virtual machine configurations.

For this configuration what I want to do is to:
<ol>
 	<li>Create a storage resource pool – with the same name – on each node in the cluster.</li>
 	<li>Configure the storage resource pool to point to the right storage path for each node.</li>
 	<li>Configure my virtual machines to utilize this storage resource pool.</li>
</ol>
Creating the storage resource pool is done using PowerShell.

On the first two nodes I want to run this command:

<code>New-VMResourcePool -Name "VHDs" -ResourcePoolType VHD -Paths "E:\"</code>

Then on the second two nodes I want to run this command:

<code>New-VMResourcePool -Name "VHDs" -ResourcePoolType VHD -Paths "F:\</code>"

Once I have configured these storage resource pools – the Hyper-V UI will magically detect them.  Now when I go to configure the virtual hard drives I see a resource pool option:

<a href="https://msdnshared.blob.core.windows.net/media/2017/05/image36.png"><img width="1086" height="1034" title="image" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/05/image_thumb39.png" border="0" /></a>

Once I have selected the appropriate resource pool – I can now move this virtual machine (with import / export, quick migration or live migration) and the virtual hard disk path will be automatically updated to the correct path for the Hyper-V host it is running on.

Cheers,
Ben]]></content:encoded>
    </item>
    <item>
      <title>Performance Tuning Windows Server 2016</title>
      <link>https://docs.microsoft.com/archive/blogs/virtual_pc_guy/performance-tuning-windows-server-2016</link>
      <pubDate>Tue, 02 May 2017 03:48:10 GMT</pubDate>
      <dc:creator><![CDATA[Ben Armstrong [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/virtual_pc_guy/?p=15035</guid>
      <description><![CDATA[While we were working on developing Windows Server 2016 – we had a team dedicated to testing the...]]></description>
      <content:encoded><![CDATA[<p>While we were working on developing Windows Server 2016 – we had a team dedicated to testing the many aspects of the performance of Windows.&nbsp; We rely heavily on this team to make sure that we are continuously improving our performance in many ways.</p><p>Well – they have recently created an amazing set of documentation on performance tuning Windows Server 2016.</p><p>You can read it all here:</p><p><a title="https://docs.microsoft.com/en-us/windows-server/administration/performance-tuning/" href="https://docs.microsoft.com/en-us/windows-server/administration/performance-tuning/">https://docs.microsoft.com/en-us/windows-server/administration/performance-tuning/</a></p><p>Note that while there is lots of good Hyper-V information in this documentation, there is also information about many other Windows Server roles as well.</p><p>Cheers,<br>Ben</p>]]></content:encoded>
    </item>
    <item>
      <title>Editing a .VMCX file</title>
      <link>https://docs.microsoft.com/archive/blogs/virtual_pc_guy/editing-a-vmcx-file</link>
      <pubDate>Tue, 18 Apr 2017 17:28:10 GMT</pubDate>
      <dc:creator><![CDATA[Ben Armstrong [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/virtual_pc_guy/?p=15025</guid>
      <description><![CDATA[In Windows Server 2016 we moved from using .XML for our virtual machine configuration files to using...]]></description>
      <content:encoded><![CDATA[<p>In Windows Server 2016 we moved from using .XML for our virtual machine configuration files to using a binary format – that we call .VMCX.</p><p>There are many benefits to this – but one of the downsides is that it is no longer possible to easily edit a virtual machine configuration file that is not registered with Hyper-V.&nbsp; Fortunately – we provide all the APIs you need to do this without editing the file directly.</p><p><script src="https://gist.github.com/BenjaminArmstrong/1a8d6531231ee020c67d752df63029f1.js"></script></p><p>This code sample takes a virtual machine configuration file – that is not registered with Hyper-V.&nbsp; It then:</p><ul><li>Loads the virtual machine into memory – without actually importing it into Hyper-V</li><li>Changes some settings on the virtual machine</li><li>Exports this changed virtual machine to a new .VMCX file</li></ul><p>Using this method you can make any changes you need to a .VMCX file without actually having to import the virtual machine.&nbsp; The key piece of information here is that when you perform a traditional import of a virtual machine you use ImportSystemDefinition to create a planned virtual machine (in memory copy) which you then realized to complete the import operation.&nbsp; But if you do not want to import the virtual machine – but just want to edit it – you can modify the planned virtual machine and pass it into ExportSystemDefinition to create a new configuration file.</p><p>Cheers,<br>Ben</p>]]></content:encoded>
    </item>
    <item>
      <title>Phone Emulator + Containers + VMs + Networking == Finally working!</title>
      <link>https://docs.microsoft.com/archive/blogs/virtual_pc_guy/phone-emulator-containers-vms-networking-finally-working</link>
      <pubDate>Mon, 20 Mar 2017 10:37:01 GMT</pubDate>
      <dc:creator><![CDATA[Ben Armstrong [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/virtual_pc_guy/?p=15015</guid>
      <description><![CDATA[I have had a problem for a little while now – the problem is that on my personal laptop I want to...]]></description>
      <content:encoded><![CDATA[I have had a problem for a little while now – the problem is that on my personal laptop I want to use:
<ul>
 	<li>Visual Studio with the Windows Phone Emulator</li>
 	<li>The Hololens emulator</li>
 	<li>Windows Containers</li>
 	<li>Linux Containers (through Docker for Windows)</li>
 	<li>My virtual machines</li>
</ul>
However, all of these solutions keep on tripping over each other.  Specifically, they keep on tripping over each other when it comes to networking configuration.  I have spent the last couple of months complaining to the various teams involved in this – and I finally have it all working!  Yay!

There were three key things that came together to make this all work:
<ol>
 	<li><strong><strong><strong><strong><strong>Improved guidance around Container and VM networking</strong></strong></strong></strong></strong>

The networking team has been doing a great job of updating the <a target="_blank" href="https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/user-guide/setup-nat-network">NAT</a> and <a target="_blank" href="https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/container-networking">Container networking</a> documentation.  If you read these documents a couple of months ago – I would highly recommend you revisit them as there is a ton of new information in there.</li>
 	<li><strong>New installation experience for Windows Containers on Windows 10</strong>

Another thing that has changed in the last couple months is the process for getting <a target="_blank" href="https://docs.microsoft.com/en-us/virtualization/windowscontainers/quick-start/quick-start-windows-10">Windows Containers up and running on Windows 10</a>.  Specifically – we now utilize Docker for Windows to get you up and running.  Not only does this make it much easier to get things setup – it means you get very clear error messages when things go wrong.  In my case – I received this handy error message:

<a target="_blank" href="https://msdnshared.blob.core.windows.net/media/2017/03/NAT-Error.png"><img width="559" height="485" title="NAT Error" alt="NAT Error" src="https://msdnshared.blob.core.windows.net/media/2017/03/NAT-Error_thumb.png" border="0" /></a></li>
 	<li><strong>Learning about XDECleanup</strong>

It turns out that my problem was that I had a stale network configuration from the Windows Phone emulator.  Handily, the Windows Phone Emulator team ship a tool to help out here – XDECleanup.  If you open an administrative command prompt and run “C:\Program Files (x86)\Microsoft XDE\&lt;version&gt;\XdeCleanup.exe” – it will delete and recreate all networking associated with the Windows Phone Emulator.</li>
</ol>
For me – updating my container setup to use Docker for Windows combined with running XDECleanup finally got me to a world where all my virtualization based development tools happily work side by side.

Cheers,
Ben]]></content:encoded>
    </item>
    <item>
      <title>New Hypervisor Top-Level Functional Specification</title>
      <link>https://docs.microsoft.com/archive/blogs/virtual_pc_guy/new-hypervisor-top-level-functional-specification</link>
      <pubDate>Mon, 13 Mar 2017 14:03:31 GMT</pubDate>
      <dc:creator><![CDATA[Ben Armstrong [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/virtual_pc_guy/?p=14995</guid>
      <description><![CDATA[At the end of last week we published version 5.0 of the Hypervisor Top Level Functional...]]></description>
      <content:encoded><![CDATA[<p>At the end of last week we published version 5.0 of the Hypervisor Top Level Functional Specification.&nbsp; This version details the state of the hypervisor in Windows Server 2016.&nbsp; You can download it from here: </p><p><a title="https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs" href="https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs">https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs</a></p><p>Be warned – this is a very complicated technical document.&nbsp; However, it has also become the first place that I point anyone who wants to know more about the internal workings of Hyper-V towards.</p><p>Cheers,<br>Ben</p>]]></content:encoded>
    </item>
    <item>
      <title>Giving a Workgroup Server an FQDN</title>
      <link>https://docs.microsoft.com/archive/blogs/virtual_pc_guy/giving-a-workgroup-server-an-fqdn</link>
      <pubDate>Fri, 10 Mar 2017 13:39:27 GMT</pubDate>
      <dc:creator><![CDATA[Ben Armstrong [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/virtual_pc_guy/?p=14986</guid>
      <description><![CDATA[Recently I needed to be able to securely, remotely manage a set of Windows Servers that were not...]]></description>
      <content:encoded><![CDATA[Recently I needed to be able to securely, remotely manage a set of Windows Servers that were not domain joined.  One problem that I hit while setting this up was that each of the servers did not believe that they had a valid FQDN.

For example – I could:
<ul>
 	<li>Set the name of a computer to “HyperVSV1”</li>
 	<li>Create a DNS entry that said that “HyperVSV1.mydomain.com” resolved to that computer</li>
 	<li>I could then correctly ping the computer at that address</li>
</ul>
But when I tried to use tools like PowerShell Remoting or Remote Desktop – they would complain that “HyperVSV1.mydomain.com” did not believe it was “HyperVSV1.mydomain.com”.

Thankfully, this is relatively easy to fix.

If you open PowerShell and run the following two commands:

<code>Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\" -Name Domain -Value "mydomain.com"
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\" -Name "NV Domain" -Value "mydomain.com"</code>

After this your workgroup server will correctly identify itself with a valid FQDN.

Cheers,
Ben]]></content:encoded>
    </item>
    <item>
      <title>Hyper-V vs. KVM for OpenStack performance</title>
      <link>https://docs.microsoft.com/archive/blogs/virtual_pc_guy/hyper-v-vs-kvm-for-openstack-performance</link>
      <pubDate>Fri, 03 Feb 2017 13:10:17 GMT</pubDate>
      <dc:creator><![CDATA[Ben Armstrong [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/virtual_pc_guy/?p=14985</guid>
      <description><![CDATA[During the development of Windows Server 2016 we spent a lot of time working on delivering the best...]]></description>
      <content:encoded><![CDATA[<p>During the development of Windows Server 2016 we spent a lot of time working on delivering the best core performance as a cloud platform.&nbsp; At the same time the Cloudbase team have spent a lot of time optimizing the performance of the Hyper-V OpenStack drivers as part of their work on the Mitaka release of OpenStack.</p><p>Just recently, they sat down and did a series of OpenStack benchmarks that compared OpenStack on KVM to OpenStack on Windows Server 2012 R2 and OpenStack on Windows Server 2016.</p><p>You can read about it in this series of blog posts:</p><ul><li><a title="https://cloudbase.it/openstack-kvm-vs-hyper-v-part-1/" href="https://cloudbase.it/openstack-kvm-vs-hyper-v-part-1/">https://cloudbase.it/openstack-kvm-vs-hyper-v-part-1/</a></li><li><a title="https://cloudbase.it/openstack-kvm-vs-hyper-v-part-2/" href="https://cloudbase.it/openstack-kvm-vs-hyper-v-part-2/">https://cloudbase.it/openstack-kvm-vs-hyper-v-part-2/</a></li><li><a title="https://cloudbase.it/openstack-newton-benchmarking-part-3/" href="https://cloudbase.it/openstack-newton-benchmarking-part-3/">https://cloudbase.it/openstack-newton-benchmarking-part-3/</a></li><li><a title="https://cloudbase.it/openstack-newton-benchmarking-part-4-hadoop/" href="https://cloudbase.it/openstack-newton-benchmarking-part-4-hadoop/">https://cloudbase.it/openstack-newton-benchmarking-part-4-hadoop/</a></li><li><a title="https://cloudbase.it/openstack-newton-benchmarking-part-5/" href="https://cloudbase.it/openstack-newton-benchmarking-part-5/">https://cloudbase.it/openstack-newton-benchmarking-part-5/</a></li></ul><p>Hopefully, you will not be surprised to hear that Windows Server 2016 wins the performance race in this comparison :-)</p><p>Cheers,<br>Ben</p>]]></content:encoded>
    </item>
    <item>
      <title>Bulk changing virtual hard disk path</title>
      <link>https://docs.microsoft.com/archive/blogs/virtual_pc_guy/bulk-changing-virtual-hard-disk-path</link>
      <pubDate>Thu, 26 Jan 2017 11:17:48 GMT</pubDate>
      <dc:creator><![CDATA[Ben Armstrong [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/virtual_pc_guy/?p=14975</guid>
      <description><![CDATA[I received this in email today:

"I have XCOPY’d a bunch of VHDX files from one volume to another...]]></description>
      <content:encoded><![CDATA[I received this in email today:

"I have XCOPY’d a bunch of VHDX files from one volume to another on WS2016.    What’s the easiest / fastest way to fix up the paths for the VM’s???”

The answer to this is quite simple.  Open PowerShell and run:

<code>$oldPath = "C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks"
$newPath = "D:"
get-vm | Get-VMHardDiskDrive | ? path -Like $oldPath* | %{Set-VMHardDiskDrive -VMHardDiskDrive $_ -Path $_.path.Replace($oldPath, $newPath)}</code>

A couple of details on this answer:
<ol>
 	<li>PowerShell is wonderful for these kinds of bulk operations</li>
 	<li>While we do not allow you to edit the virtual hard disk path on a saved virtual machine using Hyper-V manager – we do allow you to do this through PowerShell.  In fact – there are a lot of things that are blocked in Hyper-V manager that are possible through PowerShell.</li>
</ol>
Cheers,
Ben]]></content:encoded>
    </item>
  </channel>
</rss>