Installing OEM branded media of Windows Server 2008 under KVM

Issue

I have an HP server that came with an OEM copy of Windows Server 2008. I have installed CentOS 5.4 on the hardware and am trying to install Windows Server 2008 as a KVM guest. When I attempt to install Windows Server 2008 it complains that I am trying to install on unsupported hardware. This issue is caused because the hardware SMBIOS information is not being passed to the KVM guest.

Background

Before I go any further I want to state that what I am trying to do is within the license. HP offers a supported solution for VMWare but does not have an official solution for KVM. After much research the platform I am going to use is CentOS and KVM so please do not suggest other platforms.

I emailed the KVM developers mailing list and was told that this is possible and was given the advice that:

"You can dump SLIC table of your host bios and provide it to guest bios using -acpitable parameter."

I used dmidecode and got the parameters that need to be passed, but I do not know where to pass the parameters into.

Update

Looks like CentOS 5.4 uses virt-install instead of qemu. Qemu is in the package manager and I was able to install it after uninstalling qemu-img (they conflict and qemu contains the packages in qemu-img). So now I know how to pass the acpitable parameters, but I am having trouble mapping what came out of dmidecode into -acpitable.


Solution 1:

Sorry for digging out old topic, but I found out this is possible:

The problem with branded media is that KVM's BIOS VM ships with diffrent ACPI tables. Installer on the other hand validates it. In the time of writing this I am using Debian 8 with virtlib 1.2.9 and qemu-system-x86 1.7.0 (qemu-kvm).

So simply you need to have matched ACPI (dmidecode -t 0 and dmidecode -t 1) tables on VM to get it done.

Those tables for Lenovo look like:

# dmidecode 2.12
SMBIOS 2.8 present.

Handle 0x0000, DMI type 0, 24 bytes
BIOS Information
        Vendor: LENOVO
        Version: FBKTB4AUS
        Release Date: 07/01/2015
        Address: 0xF0000
        Runtime Size: 64 kB
        ROM Size: 6656 kB
        Characteristics:
                PCI is supported
                BIOS is upgradeable
                BIOS shadowing is allowed
                Boot from CD is supported
                Selectable boot is supported
                BIOS ROM is socketed
                EDD is supported
                5.25"/1.2 MB floppy services are supported (int 13h)
                3.5"/720 kB floppy services are supported (int 13h)
                3.5"/2.88 MB floppy services are supported (int 13h)
                Print screen service is supported (int 5h)
                8042 keyboard services are supported (int 9h)
                Serial services are supported (int 14h)
                Printer services are supported (int 17h)
                ACPI is supported
                USB legacy is supported
                BIOS boot specification is supported
                Targeted content distribution is supported
                UEFI is supported
        BIOS Revision: 1.180
        Firmware Revision: 1.13

# dmidecode 2.12
SMBIOS 2.8 present.

Handle 0x0001, DMI type 1, 27 bytes
System Information
        Manufacturer: LENOVO
        Product Name: 30AH001GPB
        Version: ThinkStation P300
        Serial Number: S4M88119
        UUID: CECF333D-6603-E511-97D5-6C0B843F98BA
        Wake-up Type: Power Switch
        SKU Number: LENOVO_MT_30AH
        Family: To be filled by O.E.M.

For HP:

# dmidecode 2.11                                                                                                                                                                   
SMBIOS 2.7 present.                                                                                                                                                                

Handle 0x0000, DMI type 0, 24 bytes                                                                                                                                                
BIOS Information                                                                                                                                                                   
        Vendor: HP
        Version: W07
        Release Date: 05/05/2011
        Address: 0xF0000
        Runtime Size: 64 kB
        ROM Size: 8192 kB
        Characteristics:
                PCI is supported
                PNP is supported
                BIOS is upgradeable
                BIOS shadowing is allowed
                ESCD support is available
                Boot from CD is supported
                Selectable boot is supported
                EDD is supported
                Print screen service is supported (int 5h)
                8042 keyboard services are supported (int 9h)
                Serial services are supported (int 14h)
                CGA/mono video services are supported (int 10h)
                ACPI is supported
                USB legacy is supported
                BIOS boot specification is supported
                Function key-initiated network boot is supported
                Targeted content distribution is supported
        Firmware Revision: 2.23

# dmidecode 2.11
SMBIOS 2.7 present.

Handle 0x0100, DMI type 1, 27 bytes
System Information
        Manufacturer: HP
        Product Name: ProLiant ML330 G6
        Version: Not Specified
        Serial Number: CZ104601XF      
        UUID: 30303734-3536-5A43-3130-343630315846
        Wake-up Type: Power Switch
        SKU Number: 470065-183      
        Family: ProLiant

For IBM:

# dmidecode 2.12
# SMBIOS entry point at 0x7f6be000
SMBIOS 2.5 present.

Handle 0x002F, DMI type 0, 24 bytes
BIOS Information
        Vendor: IBM Corp.
        Version: -[D6E154AUS-1.13]-
        Release Date: 09/23/2011
        Address: 0xE0000
        Runtime Size: 128 kB
        ROM Size: 4096 kB
        Characteristics:
                PCI is supported
                PNP is supported
                BIOS is upgradeable
                BIOS shadowing is allowed
                Boot from CD is supported
                Selectable boot is supported
                EDD is supported
                3.5"/2.88 MB floppy services are supported (int 13h)                                                                                                               
                Print screen service is supported (int 5h)                                                                                                                         
                8042 keyboard services are supported (int 9h)                                                                                                                      
                Serial services are supported (int 14h)                                                                                                                            
                CGA/mono video services are supported (int 10h)                                                                                                                    
                ACPI is supported                                                                                                                                                  
                USB legacy is supported                                                                                                                                            
                LS-120 boot is supported                                                                                                                                           
                ATAPI Zip drive boot is supported                                                                                                                                  
                Function key-initiated network boot is supported                                                                                                                   
                Targeted content distribution is supported                                                                                                                         
        BIOS Revision: 0.0                                                                                                                                                         
        Firmware Revision: 0.0                                                                                                                                                     

# dmidecode 2.12                                                                                                                                                                   
# SMBIOS entry point at 0x7f6be000                                                                                                                                                 
SMBIOS 2.5 present.                                                                                                                                                                

Handle 0x0030, DMI type 1, 27 bytes                                                                                                                                                
System Information                                                                                                                                                                 
        Manufacturer: IBM                                                                                                                                                          
        Product Name: System x3650 M3 -[7945J4G]-                                                                                                                                  
        Version: 00                                                                                                                                                                
        Serial Number: KD50NCR                                                                                                                                                     
        UUID: 49B2EFEE-5E45-3522-8FE3-C230FF137F25                                                                                                                                 
        Wake-up Type: Other
        SKU Number: XxXxXxX
        Family: System x

I had to install Lenovo's Windows 2012 Fundation branded media on Lenovo hardware.

I achieved it by adding to qemu parammeters:

-smbios type=1,manufacturer=LENOVO,product=30AH001GPB,version=ThinkStation P300,serial=S4M88119,uuid=cecf333d-6603-e511-97d5-6c0b843f98ba,sku=LENOVO_MT_30AH,family=P300 -acpitable file=/var/lib/libvirt/images/slic.bin -acpitable file=/var/lib/libvirt/images/msdm.bin

Or by adding to libvirtd's VM xml file:

<domain type='kvm' id='18' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
#                           ^^^ be aware of XML's namespace for the prefixes ^^^
#                               without it qemu:arg tag won't work
...
  <qemu:commandline>
    <qemu:arg value='-smbios'/>
    <qemu:arg value='type=0,vendor=LENOVO,version=FBKTB4AUS,date=07/01/2015,release=1.180'/>
    <qemu:arg value='-smbios'/>
    <qemu:arg value='type=1,manufacturer=LENOVO,product=30AH001GPB,version=ThinkStation P300,serial=S4M88119,uuid=cecf333d-6603-e511-97d5-6c0b843f98ba,sku=LENOVO_MT_30AH,family=P300'/>
    <qemu:arg value='-acpitable'/>
    <qemu:arg value='file=/var/lib/libvirt/images/slic.bin'/>
    <qemu:arg value='-acpitable'/>
    <qemu:arg value='file=/var/lib/libvirt/images/msdm.bin'/>
  </qemu:commandline>
</domain>

There is also more elegant way of doing it, but unfortunately my libvirt didn't want to pass ACPI tables to VM:

<os>
....
<sysinfo type='smbios'>
 <bios>
  <entry name='vendor'>LENOVO</entry>
 </bios>
 <system>
  <entry name='manufacturer'>HP</entry>
  <entry name='product'>30AH001GPB</entry>
  <entry name='serial'>S4M88119</entry>
  <entry name='sku'>LENOVO_MT_30AH</entry>
 </system>
</sysinfo>
</os>

How to create dump of ACPI table? Simply:

root@node0:/sys/firmware/acpi/tables# ls -l
total 0
-r-------- 1 root root    146 Sep 23 13:44 APIC
-r-------- 1 root root    165 Sep 23 13:44 ASF!
-r-------- 1 root root     56 Sep 23 13:44 BGRT
-r-------- 1 root root     52 Sep 23 13:44 DBGP
-r-------- 1 root root    184 Sep 23 13:44 DMAR
-r-------- 1 root root  96238 Sep 23 13:44 DSDT
drwxr-xr-x 2 root root      0 Sep 23 13:44 dynamic
-r-------- 1 root root    268 Sep 23 13:44 FACP
-r-------- 1 root root     64 Sep 23 13:44 FACS
-r-------- 1 root root    156 Sep 23 13:44 FIDT
-r-------- 1 root root     68 Sep 23 13:44 FPDT
-r-------- 1 root root     56 Sep 23 13:44 HPET
-r-------- 1 root root 207330 Sep 23 13:44 LUFT
-r-------- 1 root root     60 Sep 23 13:44 MCFG
-r-------- 1 root root     85 Sep 23 13:44 MSDM
-r-------- 1 root root    374 Sep 23 13:44 SLIC
-r-------- 1 root root   1337 Sep 23 13:44 SSDT1
-r-------- 1 root root   2776 Sep 23 13:44 SSDT2
-r-------- 1 root root    877 Sep 23 13:44 SSDT3
-r-------- 1 root root  13608 Sep 23 13:44 SSDT4
root@node0:/sys/firmware/acpi/tables# cat SLIC > /var/lib/libvirt/images/slic.bin 

It'll work for Windows 2008/2012 branded media. It's very important to check if those arguments are passed correctly, check VM's log in : /var/log/libvirt/vm_name.log. Run some live distro in VM, for example sysresccd and check output of dmidecode -t 0; dmidecode -t 1 it must match with hardware version.

As a prof (Windows 2012 Foundation AFAIK is branded only): Windows 2012 Foundation in Qemu-KVM

Solution 2:

Extract the SLIC tables from your motherboard and roll your own seabios using: https://github.com/ghuntley/seaslic

Solution 3:

Unfortunately the answer involving the Windows signed drivers does not reflect the OEM / SLP activation. These drivers may improve performance but the Windows OEM / SLP activation strictly involves data stored in the BIOS, specifically the ACPI tables.

Michael Tokarev was able to do this himself through modifying the source to include the SLIC table in the whole table format but he also mentions that this can be done using several options to -acpitable (http://kerneltrap.org/mailarchive/linux-kvm/2010/3/24/6260060). The change he made to the source simply allowed him to include an entire ACPI table instead of passing several arguments to include different aspects of it on the command line.

I am looking into this myself now as I would like to implement this for testing purposes on some setups in our office. We have a lot of OEM machines and we can install fine on each machine but virtualization gives a lot of benefits for testing as well as very rapid deployment so I would like to see this through.

I would like to the OP of this post, rancidfishbreath, what he extracted from dmidecode, how he formatted this in the options he gave kvm, etc. If you can add any input the developers gave you on this, I would appreciate it.