# Install Windows VirtIO Drivers

## Overview

VirtIO provides an efficient abstraction for hypervisors and a common set of IO virtualization drivers. It was chosen to be the main platform for IO virtualization in KVM. Currently, the following four drivers are available:

* Balloon - The balloon driver affects the memory management of the guest OS.
* VIOSERIAL - The serial driver affects single serial device limitation within KVM.
* NetKVM - The network driver affects Ethernet network adapters.
* VIOSTOR - The block driver affects SCSI-based controllers.

Windows-based systems require VirtIO drivers primarily to recognize the VirtIO (SCSI) controller and network adapter presented by the IONOS Cloud KVM-based hypervisor. This can be accomplished in a variety of ways depending on the state of the virtual machine.

IONOS Cloud provides pre-configured Windows Server images that already contain the required VirtIO drivers and the optimal network adapter configuration. Additionally, a VirtIO ISO to simplify the driver installation process for Windows 2008 R2, Windows 2012 & Windows 2012 R2 systems is also available. This ISO can be found in the CD-ROM drop-down menu under **IONOS Cloud Images** which can be used for new Windows installations (only required for customer-provided images), as well as **Windows images** that have been migrated from other environments. Example: via VMDK upload.

{% hint style="info" %}
**Note:** We recommend using the latest Windows VirtIO driver from IONOS Cloud.
{% endhint %}

## Install Windows VirtIO drivers

To install Windows VirtIO drivers, follow these steps:

1. Add a CD-ROM drive.
2. Log in to the DCD with your username and password, and follow these instructions:\
   a. In the Workspace, select the required server.\
   b. In the Inspector pane, select the **Storage** tab.\
   c. Click **CD-ROM** to add a CD-ROM drive.\
   d. In the dialog box, enter the following:

   * Choose an IONOS Cloud **Image** with drivers (`windows-VirtIO-driver-<version>.iso`).
   * Select the **Boot from Device** checkbox.
   * Confirm your action by clicking **Create CD-ROM Drive**.

   e. Provision your changes.\
   f. Connect to the server using the Remote Console. The installation menu opens.\
   g. Follow the options provided by the installation menu.\
   h. Remove the CD-ROM drive as soon as the menu asks you to do so, and shut down the VM.\
   i. In the DCD, specify from which storage to boot.\
   j. Restart the server using the DCD.\
   k. Provision your changes.\
   l. Connect to the server again using the Remote Console to make further changes.
3. Set optimal values: For an optimal configuration, apply the following settings:
   * **MTU**:
     * Internal network interface: 1500 MTU
     * External network interface: 1500 MTU
   * **Offloading for Receive (RX) and Transmit (TX)**:
     * Offload Tx IP checksum: Enabled
     * Offload Tx LSO: Enabled
     * Offload Tx TCP checksum: Enabled
     * Fix IP checksum on LSO: Enabled
     * Hardware checksum: Enabled
4. Disable TCP Offloading/Chimney:

   * Default: `netsh int tcp set global chimney=disabled`
   * Everything:

   ```
   rss=disabled
   chimney=disabled
   congestionprovider=none
   netdma=disabled dca=disabled
   ecncapability=disabled
   timestamps=enabled
   ```

   * Alternatively, modify the Windows registry:

   ```
   [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
   "EnableTCPA"=dword:00000000
   "EnableRSS"=dword:00000000
   "EnableTCPChimney"=dword:00000000
   ```

{% hint style="success" %}
**Result:** The installation will be active after a restart. You can use the `netsh interface tcp show global` command to verify the status of the configurations.
{% endhint %}

5. Set correct values for any network adapter automatically by executing the `Get-NetAdapter` command via PowerShell. The following output is displayed:\
   a. In the **Name** field, use the output value instead of **Ethernet**.\
   b. Create a new file from the **File** > **New** menu in the PowerShell ISE.\
   c. Copy and paste the following code and remember to update `$name ="Ethernet"` appropriately:

   ```
   Clear-Host
   $name ="Ethernet"
   Set-NetAdapterAdvancedProperty-name $name -RegistryKeyword "MTU" -Registryvalue 1500
   Set-NetAdapterAdvancedProperty -name $name -RegistryKeyword "*rss" -Registryvalue 0
   Set-NetAdapterAdvancedProperty -name $name -RegistryKeyword"*TCPChecksumOffloadIPv4" -Registryvalue 0
   Set-NetAdapterAdvancedProperty -name $name -RegistryKeyword "*UDPChecksumOffloadIPv4" -Registryvalue 0
   netsh interface tcp set global chimney=disabled
   netsh interface tcp set global autotuninglevel=normal
   netsh interface tcp set global netdma=disabled
   netsh interface tcp set global dca=disabled
   netsh interface tcp set global ecncapability=disabled
   netsh interface tcp set global timestamps=enabled
   Get-NetAdapterAdvancedProperty
   netsh int tcp show global
   ```

   d. Click **File** > **Execute**.\
   e. Verify the settings.\
   f. Restart the VM.

**Result:** The correct settings are applied automatically.

6\. Activate TCP/IP auto-tuning. It ensures optimal data transfer between the client and the server by monitoring network traffic and automatically adjusting the **Receive Window Size**. You must permanently activate the option for optimal performance.

* Execute the `netsh interface tcp set global autotuninglevel=normal` command to activate TCP/IP auto-tuning.
* Execute the `netsh interface tcp show global` command to check the current setting.
