Recently I had to test a few things on Solaris 11 and wondered how well it works virtualized with KVM. It does – with a few tweaks.
Testing various different versions of operating systems is easy these days thanks to virtualization. However, I’m mainly used to Linux variants and hardly ever install any other kind of UNIX based OS. Thus I was curious if an installation of Solaris 11 on KVM / libvirt works.
For the test I actually used virt-manager since it does provide neat defaults during the VM setup. But the same comments and lessons learned are true for the command line tool as well.
Setting up the VM
virt-manager usually does not provide Solaris as an operating system type by default in the VM setup dialog. You first have to click on “OS Type”, “Show all OS options” as shown here:
Note, a Solaris 11 should have at least 2 GB RAM, otherwise the installation and also booting might take very long or run into their very own problems.
The installation runs through – although quite some errors clutter the screen (see below).
Errors and problems
As soon as the machine is started several error messages are shown:
WARNING: /pci@0,0/pci1af4,1100@6,1 (uhci1): No SOF interrupts have been received, this USB UHCI host controller is unusable WARNING: /pci@0,0/pci1af4,1100@6,2 (uhci2): No SOF interrupts have been received, this USB UHCI host controller is unusable
This shows that something is wrong with the interrupts and thus withe the “hardware” of the machine – or at least with the way the guest machine discovers the hardware.
Additionally, even if DHCP is configured, the machine is unable to obtain the networking configuration. A fixed IP address and gateway do not help here, either. The host system might even report that it provides DHCP data, but the guest system continues to request these:
Dez 23 11:11:05 liquidat dnsmasq-dhcp: DHCPDISCOVER(virbr0) 52:54:00:31:31:4b Dez 23 11:11:05 liquidat dnsmasq-dhcp: DHCPOFFER(virbr0) 192.168.122.205 52:54:00:31:31:4b Dez 23 11:11:09 liquidat dnsmasq-dhcp: DHCPDISCOVER(virbr0) 52:54:00:31:31:4b Dez 23 11:11:09 liquidat dnsmasq-dhcp: DHCPOFFER(virbr0) 192.168.122.205 52:54:00:31:31:4b Dez 23 11:11:17 liquidat dnsmasq-dhcp: DHCPDISCOVER(virbr0) 52:54:00:31:31:4b Dez 23 11:11:17 liquidat dnsmasq-dhcp: DHCPOFFER(virbr0) 192.168.122.205 52:54:00:31:31:4b ...
Also, when the machine is shutting down and ready to be powered off, the CPU usage spikes to 100 %.
The solution: APIC
The solution for the “hardware” problems mentioned above and also for the networking trouble is to deactivate a APIC feature inside the VM: x2APIC, Intel’s programmable interrupt controller. Some more details about the problem can be found in the Red Hat Bugzilla entry #1040500.
To apply the fix the virtual machine definition needs to be edited to disable the feature. The xml definition can be edited with the command
sudo virsh edit with the machine name as command line option, the change needs to be done in the section
cpu as shown below. Make sure tha VM is stopped before the changes are done.
$ sudo virsh edit krypton ... <cpu mode='custom' match='exact'> <model fallback='allow'>Broadwell</model> <feature policy='disable' name='x2apic'/> </cpu> $ sudo virsh start krypton
After this changes Solaris does not report any interrupt problems anymore and DHCP works without flaws. Note however that the CPU still spikes at power off. If anyone knows a solution to that problem I would be happy to hear about it and add it to this post.