Getting Ubuntu 14.04 LTS to Customize Properly With Microsoft’s Virtual Machine Manager 2012 R2

As most people do know, it is possible to get Microsoft’s Virtual Machine Manager to deploy and customize a Linux based OS automatically. Officially Microsoft supports Ubuntu 12.04 LTS as a one of Linux distributions they support, however in practice any Debian like distribution can be supported as long as the locations of the network configuration, hostname configuration and SSH Host Keys are in the same locations as Debian and/or Ubuntu place them.

However in the upcoming Ubuntu 14.04 LTS release, there were some changes that can potentially cause VMM’s guest agent not to customize the virtual machines properly. In order to make VMM’s guest agent to provision correctly there are 2 options:

  • Write your own VMM guest agent
  • Modify a few file paths so Ubuntu 14.04 will look somewhat like Ubuntu 12.04 LTS in terms of network configuration

I choose the latter option. Now I do have a custom VMM Guest Agent written for FreeBSD in Perl, however creating a VMM guest agent for this specific reason isn’t a good utilization of time.

I’ve taken the following actions to make Ubuntu 14.04 to appear like Ubuntu 12.04 by doing the following:

  • Remove the line in the /etc/network/interfaces file where it references to /etc/network/interfaces.d/*.cfg

Surprisingly there’s only one thing you really need to do. There’s more if you decide to be even lazier and download the cloud image provided here, but it’s beyond the scope of this tidbit.

Adding a New Linux Distribution on System Center VMM 2012 R2’s list of Operating Systems

For hosters who use Windows Azure Pack along with System Center VMM 2012 R2, they might find that sometimes they need to support a XYZ Linux distribution for their customers. However they’ll quickly find they can’t get that distribution to display correctly on the Azure Portal as the only option to choose is “Other Linux”. Here’s a SQL query that anybody can use to inject a custom Operating System into VMM’s database:

USE [VirtualManagerDB]
GO

INSERT INTO [dbo].[tbl_IL_OS]
([OSId]
,[Name]
,[Description]
,[Architecture]
,[OSFlags]
,[VMWareGuestId]
,[OSType])
VALUES
('EBAB54C0-A9FA-4A3F-A21C-94775B96A6E5' /* Generate UUID */
,'Debian GNU/Linux 6 (64-bit)' /* Limited to 64 Chars */
,'Debian GNU/Linux 6 (64-bit)' /* Longer description of Linux Distro */
,'amd64' /* Use x86 for i386, amd64 for x86_64 */
,'28' /* This remains constant */
,'otherLinux64Guest' /* This is meant for VMware, go lookup the VMX spec files for this value */
,'1') /* Leave this at one, that's what the other OSes looked like */
GO

If you installed VMM 2012 R2 with a different SQL database name, adjust the USE statement accordingly.

Hyper-V Generation 2 Support for Linux Guests

Recently Microsoft announced Generation 2 Virtual Machines which really is an UEFI guest without the emulated PCI bus. Initially the only supported Operating Systems were:

  • Windows 8 (Integration Services Update Required)
  • Windows 8.1
  • Windows Server 2012 (Integration Services Update Required)
  • Windows Server 2012 R2

Well, now you can add pretty much any Linux distribution to the list right now. Thanks to the hard work being done by the Linux Integration Services team, they’ve got the mainline Linux kernel working right on Hyper-V under a Generation 2 platform. However the only distribution that will install correctly inside a Generation 2 Virtual Machine is OpenSuSE 13.1.

However if you want your Linux distribution to run inside a Generation 2 VM right now, you’ll have to install it manually via debootstrap or something similar. One thing to keep min mind is if your kernel is older than 3.11, you’ll need to either backport specific changes or upgrade to a newer mainline version of the kernel before you can even proceed to install your favorite distribution inside a generation 2 virtual machine.

Integration components wise, most of the modules will load just fine except hyperv_fb, the framebuffer device driver for Hyper-V guests. Unfortunately hyperv_fb is broken under a generation 2 VM hence why you’ll need to have EFI framebuffer support compiled in your kernel or you won’t get any video at all! The same goes for GRUB, it’ll also need efi_uga and efi_gop modules built in your bootx64.efi GRUB image. And oh, did I forget to mention that you’ll also have to disable Secure Boot as Hyper-V doesn’t support any way to loading public certificates into the Secure Boot database?

So if you want to take the plunge on having a Linux Generation 2 VM, be my guest. Start reading those git commit logs and start cherry picking! Remember, your mileage may vary. 😉