Chapter 16. Installing and managing Windows virtual machines

To use Microsoft Windows as the guest operating system in your virtual machines (VMs) on a RHEL 8 host, Red Hat recommends taking extra steps to ensure these VMs run correctly.

For this purpose, the following sections provide information on installing and optimizing Windows VMs on the host, as well as installing and configuring drivers in these VMs.

16.1. Installing Windows virtual machines

The following provides information on how to create a fully-virtualized Windows machine on a RHEL 8 host, launch the graphical Windows installer inside the virtual machine (VM), and optimize the installed Windows guest operating system (OS).

You can create a VM and install it using the virt-install command or the RHEL 8 web console.

Prerequisites

Procedure

  1. Create the VM. For instructions, see Section 2.2, “Creating virtual machines”.

    • If using the virt-install utility to create the VM, add the following options to the command:

      • The storage medium with the KVM virtio drivers. For example:

        --disk path=/usr/share/virtio-win/virtio-win.iso,device=disk,bus=virtio
      • The Windows version you will install. For example, for Windows 10:

        --os-variant win10

        For a list of available Windows versions and the appropriate option, use the following command:

        # osinfo-query os
    • If using the web console to create the VM, specify your version of Windows in the Operating System field of the Create New Virtual Machine window. After the VM is created and the guest OS is installed, attach the storage medium with virtio drivers to the VM using the Disks interface. For instructions, see Section 5.8.3, “Attaching existing disks to virtual machines using the web console”.
  2. Install the Windows OS in the VM.

    For information on how to install a Windows operating system, refer to the relevant Microsoft installation documentation.

  3. Configure KVM virtio drivers in the Windows guest OS. For details, see Section 16.2.1, “Installing KVM paravirtualized drivers for Windows virtual machines”.

Additional resources

16.2. Optimizing Windows virtual machines

When using Microsoft Windows as a guest operating system in a virtual machine (VM) hosted in RHEL 8, the performance of the guest may be negatively impacted.

Therefore, Red Hat recommends optimizing your Windows VMs by doing any combination of the following:

16.2.1. Installing KVM paravirtualized drivers for Windows virtual machines

The primary method of improving the performance of your Windows virtual machines (VMs) is to install KVM paravirtualized (virtio) drivers for Windows on the guest operating system (OS).

To do so:

  1. Prepare the install media on the host machine. For more information, see Section 16.2.1.2, “Preparing virtio driver installation media on a host machine”.
  2. Attach the install media to an existing Windows VM, or attach it when creating a new Windows VM.
  3. Install the virtio drivers on the Windows guest OS. For more information, see Section 16.2.1.3, “Installing virtio drivers on a Windows guest”.

16.2.1.1. How Windows virtio drivers work

Paravirtualized drivers enhance the performance of virtual machines (VMs) by decreasing I/O latency and increasing throughput to almost bare-metal levels. Red Hat recommends that you use paravirtualized drivers for VMs that run I/O-heavy tasks and applications.

virtio drivers are KVM’s paravirtualized device drivers, available for Windows VMs running on KVM hosts. These drivers are provided by the virtio-win package, which includes drivers for:

  • Block (storage) devices
  • Network interface controllers
  • Video controllers
  • Memory ballooning device
  • Paravirtual serial port device
  • Entropy source device
  • Paravirtual panic device
  • Input devices, such as mice, keyboards, or tablets
  • A small set of emulated devices
Note

For additional information about emulated, virtio, and assigned devices, refer to Chapter 8, Managing virtual devices.

Using KVM virtio drivers, the following Microsoft Windows versions are expected to run similarly to physical systems:

16.2.1.2. Preparing virtio driver installation media on a host machine

To install KVM virtio drivers on a Windows virtual machine (VM), you must first prepare the installation media for the virtio driver on the host machine. To do so, install the virtio-win package on the host machine and use the .iso file it provides as storage for the VM.

Prerequisites

  • Ensure that virtualization is enabled in your RHEL 8 host system.

Procedure

  1. Download the drivers

    1. Browse to Download Red Hat Enterprise Linux.
    2. Select the Product Variant relevant for your system architecture. For example, for Intel 64 and AMD64, select Red Hat Enterprise Linux for x86_64.
    3. Ensure the Version is 8.
    4. In the Packages, search for virtio-win.
    5. Click Download Latest.

      The RPM file downloads.

  2. Install the virtio-win package from the download directory. For example:

    # yum install ~/Downloads/virtio-win-1.9.9-3.el8.noarch.rpm
    [...]
    Installed:
      virtio-win-1.9.9-3.el8.noarch

    If the installation succeeds, the virtio-win driver files are prepared in the /usr/share/virtio-win/ directory. These include ISO files and a drivers directory with the driver files in directories, one for each architecture and supported Windows version.

    # ls /usr/share/virtio-win/
    drivers/  guest-agent/  virtio-win-1.9.9.iso  virtio-win.iso
  3. Use the virtio-win.iso file as a disk when creating a new Windows VM, or add the file as a disk to an existing Windows VM.

Additional resources

16.2.1.3. Installing virtio drivers on a Windows guest

To install KVM virtio drivers on a Windows guest operating system (OS), you must add a storage device that contains the drivers - either when creating the virtual machine (VM) or afterwards - and install the drivers in the Windows guest OS.

Prerequisites

Procedure

  1. In the Windows guest OS, open the File Explorer application.
  2. Click This PC.
  3. In the Devices and drives pane, open the virtio-win medium.
  4. Based on the architecture of the VM’s vCPU, run one of the installers on the medium.

    • If using a 32-bit vCPU, run the virtio-win-gt-x86 installer.
    • If using a 64-bit vCPU, run the virtio-win-gt-x64 installer.
    virtio win installer 1
  5. In the Virtio-win-guest-tools setup wizard that opens, follow the displayed instructions until you reach the Custom Setup step.

    virtio win installer 2
  6. In the Custom Setup window, select the device drivers you want to install. The recommended driver set is selected automatically, and the descriptions of the drivers are displayed on the right of the list.
  7. Click next, then click Install.
  8. After the installation completes, click Finish.
  9. Reboot the VM to complete the driver installation.

Verification

  1. In This PC, open the system disk. This is typically (C:).
  2. In the Program Files directory, open the Virtio-Win directory.

    If the Virtio-Win directory is present and contains a sub-directory for each of the selected drivers, the installation was successful.

    virtio win installer 3

Additional resources

16.2.2. Enabling Hyper-V enlightenments

Hyper-V enlightenments provide a method for KVM to emulate the Microsoft Hyper-V hypervisor. This improves the performance of Windows virtual machines.

The following sections provide information about the supported Hyper-V enlightenments and how to enable them.

16.2.2.1. Enabling Hyper-V enlightenments on a Windows virtual machine

Hyper-V enlightenments provide better performance in a Windows virtual machine (VM) running in a RHEL 8 host. For instructions on how to enable them, see the following.

Procedure

  1. Edit the XML configuration of the VM, adding the Hyper-V enlightenments. In the following commands, replace $VMNAME with the name of the Windows VM.

    # virt-xml $VMNAME --edit --features hyperv_relaxed=on,hyperv_vapic=on,hyperv_spinlocks=on,hyperv_spinlocks_retries=8191,hyperv_vpindex=on,hyperv_runtime=on,hyperv_synic=on,hyperv_stimer=on,hyperv_frequencies=on
    
    # virt-xml $VMNAME --edit --clock hypervclock_present=yes
  2. Restart the VM

Verification

  • Use the virsh dumpxml command to display the XML configuration of the modified VM. If it includes the following segments, the Hyper-V enlightenments are enabled on the VM.

    <hyperv>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
      <vpindex state='on'/>
      <runtime state='on' />
      <synic state='on'/>
      <stimer state='on'/>
      <frequencies state='on'/>
    </hyperv>
    
    <clock offset='localtime'>
      <timer name='hypervclock' present='yes'/>
    </clock>

16.2.2.2. Supported Hyper-V enlightenments

The following is a list of Hyper-V enlightenments with a description of the functionality of each enlightenment:

Hyper-V enlightenments

clock
Defines the virtual time source and offset to use with the Windows virtual machine.
frequencies
Enables Hyper-V frequency Machine Specific Registers (MSRs).
relaxed
Disables a Windows sanity check that commonly results in a BSOD when the VM is running on a heavily loaded host. This is similar to the Linux kernel option no_timer_check, which is automatically enabled when Linux is running on KVM.
runtime
Specifies the virtual processor’s run time.
spinlock
  • Used by a virtual machine’s operating system to notify the hypervisor that the calling virtual processor is attempting to acquire a resource that is potentially held by another virtual processor within the same partition.
  • Used by the hypervisor to indicate to the virtual machine’s operating system the number of times a spinlock acquisition should be attempted before indicating an excessive spin situation to the hypervisor.
synic
Together with stimer, activates the synthetic timer. Windows 8 uses this feature in periodic mode.
vapic
Provides accelerated MSR access to the high-usage, memory-mapped Advanced Programmable Interrupt Controller (APIC) registers.
vpindex
Specifies the virtual processor’s index.

16.2.3. Configuring NetKVM driver parameters

After the NetKVM driver is installed, you can configure it to better suit your environment. The parameters listed in this section can be configured using the Windows Device Manager (devmgmt.msc).

Important

Modifying the driver’s parameters causes Windows to reload that driver. This interrupts existing network activity.

Prerequisites

Procedure

  1. Open Windows Device Manager.

    For information on opening Device Manager, refer to the Windows documentation.

  2. Locate the Red Hat VirtIO Ethernet Adapter.

    1. In the Device Manager window, click + next to Network adapters.
    2. Under the list of network adapters, double-click Red Hat VirtIO Ethernet Adapter. The Properties window for the device opens.
  3. View the device parameters.

    In the Properties window, click the Advanced tab.

  4. Modify the device parameters.

    1. Click the parameter you want to modify. Options for that parameter are displayed.
    2. Modify the options as needed.

      For information on the NetKVM parameter options, refer to Section 16.2.4, “NetKVM driver parameters”.

    3. Click OK to save the changes.

16.2.4. NetKVM driver parameters

The following table provides information on the configurable NetKVM driver logging parameters.

Table 16.1. Logging parameters

ParameterDescription 2

Logging.Enable

A Boolean value that determines whether logging is enabled. The default value is Enabled.

Logging.Level

An integer that defines the logging level. As the integer increases, so does the verbosity of the log.

  • The default value is 0 (errors only).
  • 1-2 adds configuration messages.
  • 3-4 adds packet flow information.
  • 5-6 adds interrupt and DPC level trace information.
Note

High logging levels will slow down your virtual machine.

The following table provides information on the configurable NetKVM driver initial parameters.

Table 16.2. Initial parameters

ParameterDescription

Assign MAC

A string that defines the locally-administered MAC address for the paravirtualized NIC. This is not set by default.

Init.ConnectionRate(Mb)

An integer that represents the connection rate in megabits per second. The default value for Windows 2008 and later is 10G (10,000 megabits per second).

Init.Do802.1PQ

A Boolean value that enables Priority/VLAN tag population and removal support. The default value is Enabled.

Init.MTUSize

An integer that defines the maximum transmission unit (MTU). The default value is 1500. Any value from 500 to 65500 is acceptable.

Init.MaxTxBuffers

An integer that represents the number of TX ring descriptors that will be allocated.

The default value is 1024.

Valid values are: 16, 32, 64, 128, 256, 512, and 1024.

Init.MaxRxBuffers

An integer that represents the number of RX ring descriptors that will be allocated.

The default value is 256.

Valid values are: 16, 32, 64, 128, 256, 512, and 1024.

Offload.Tx.Checksum

Specifies the TX checksum offloading mode.

In Red Hat Enterprise Linux 8, the valid values for this parameter are:

* All (the default) which enables IP, TCP, and UDP checksum offloading for both IPv4 and IPv6

* TCP/UDP(v4,v6) which enables TCP and UDP checksum offloading for both IPv4 and IPv6

* TCP/UDP(v4) which enables TCP and UDP checksum offloading for IPv4 only

* TCP(v4) which enables only TCP checksum offloading for IPv4 only