→ Applies to: Hyperion 9.x and above
By default, VMs created or converted for Hyperion may not include all available performance optimizations. syneto-vmtune allows you to audit and apply these optimizations in a few simple steps.
Step 1. Connect to Hyperion via SSH as admin
ssh admin@<your_ip_address_or_hostname>
Step 2. Get root privileges
sudo su -
Step 3. Download syneto-vmtune to the /tmp folder
wget -L -O /tmp/syneto-vmtune "https://files.syneto.eu/public.php/dav/files/YjKrGssMzHpGcqK"
Step 4. Make it executable
chmod +x /tmp/syneto-vmtune
Assessing Current VM State
assess reports each finding with a code (F = failure, W = warning, I = info). The section Understanding the Assessment Results explains each code and how to fix it.
Step 1. Check the current state of your VMs
/tmp/syneto-vmtune assess
Step 2 (Optional). View the full description of each optimization code
/tmp/syneto-vmtune assess --legendIMPORTANT
The sections Installing Guest Agent Tools, Migrating the Storage Bus to VirtIO, Binding Data Disks, and Swapping the Emulated NIC to VirtIO are independent optional modules — apply only the ones relevant to your VM, based on what assess reported. They are not a strict sequence, but some have prerequisites:
- Migrating the Storage Bus to VirtIO requires Installing Guest Agent Tools to be done first — the VirtIO Guest Tools ISO must already be mounted.
- Binding Data Disks requires Migrating the Storage Bus to VirtIO first, but only if assess reports F1 (data disk still on SATA/IDE).
- Swapping the Emulated NIC to VirtIO is independent — no prerequisite on the other modules — but the virtio-net driver must already be installed inside the guest.
Understanding the Assessment Results
assess reports each finding with a code:
- F (FAIL): a configuration problem that affects how the VM works or performs.
- W (WARNING): a missing or suboptimal optimization.
- I (INFO): information only, no action needed.
The tables below explain each code and how it is fixed.
Fixed automatically by apply
These codes are fixed by the command in the Applying General Optimizations section.
| Code | Meaning | Fix applied |
| F3 | No virtio memory balloon | Adds a virtio memory balloon device |
| F5 | Clock offset wrong for the OS (Windows must use localtime, Linux utc) | Sets the correct clock offset for the OS |
| F6 | Windows 11 / Server 2025 without virtual TPM 2.0 | Adds a virtual TPM 2.0 (through W11) |
| W4 | No virtio-rng device (slow boots and encryption in the guest) | Adds a virtio-rng device |
| W5 | No watchdog device | Adds a watchdog device |
| W6 | USB controller is not qemu-xhci | Changes the USB controller to qemu-xhci |
| W7 | No I/O threads, or OS disk not bound to an I/O thread | Adds I/O threads and binds the OS disk |
| W9 | [Windows] Hyper-V enlightenments missing or harmful ones present | Applies the recommended Hyper-V enlightenments |
| W10 | [Windows] Clock timers not tuned | Applies the recommended Windows clock timers |
| W11 | [Windows 8 / 2012 R2 and later] No TPM (BitLocker and VBS unavailable) | Adds a virtual TPM 2.0 |
| W12 | [Windows] No virtio-scsi controller | Adds a virtio-scsi controller |
| W13 | [Windows] Video memory below 64 MiB | Sets video memory to 64 MiB |
| W14 | [Windows] Disk has no serial number (drive letters may change) | Adds a serial number to the disk |
| W17 | OS disk queues do not match the current number of vCPUs | Refreshes the disk queues |
| W20 | ZFS Direct I/O enabled on the VM’s dataset (bypasses the cache) | Disables Direct I/O on the dataset |
NOTE
W20 is the only fix applied to the storage pool instead of the VM configuration. To skip it, add --skip-zfs-direct to the apply command.IMPORTANT
If assess reports W15, suspend BitLocker inside the VM before running apply. Adding a TPM (W11) to a BitLocker-protected VM triggers a BitLocker recovery prompt at the next boot.
Optional fixes
These codes are not fixed by default. Apply them only when the conditions are met.
| Code | Meaning | How to fix | Condition |
| F2 | Emulated network card (e1000, e1000e, rtl8139, vmxnet3) instead of VirtIO | apply <vm_name> --also F2 (see Swapping the Emulated NIC to VirtIO) | The virtio-net driver must be installed in the VM |
| W3 | Video model is not VirtIO (no acceleration) | apply <vm_name> --only W3 | The VirtIO video driver must be installed in the VM |
| W8 | VNC console accessible from any network address | apply <vm_name> --only W8 | Use only if console access from other machines is not needed |
| W18 | Data disks not bound to I/O threads on a multi-disk VM | apply <vm_name> --only W18 (see Binding Data Disks) | The disks must be on VirtIO |
| W21 | Nested virtualization exposed to the VM (slower performance) | apply <vm_name> --only W21 | Skip if the VM uses WSL2, Windows Sandbox, Hyper-V or VBS |
Fixed with migrate-bus
| Code | Meaning | How to fix |
| F1 | Disk on SATA/IDE instead of VirtIO | migrate-bus <vm_name> (see Migrating the Storage Bus to VirtIO). Windows VMs only |
Manual fixes
These codes are reported but not fixed by syneto-vmtune.
| Code | Meaning | How to fix |
| F4 | Machine type is not q35 or i440fx | Contact Syneto Support |
| W1 | CPU mode is not host-passthrough or host-model | Change the CPU mode in the VM settings |
| W2 | QEMU Guest Agent not connected | Install the Guest Agent Tools (see Installing Guest Agent Tools) |
| W15 | [Windows] BitLocker detected on the OS disk | Suspend BitLocker inside the VM before running apply |
| W19 | Network adapter has no network assigned | Select the network for the VM’s adapter in the SynetoOS GUI |
| W22 | CPU requires a feature the host cannot provide (the VM may fail to start) | Contact Syneto Support |
Information only
| Code | Meaning |
| I1 | Machine type and firmware (UEFI/BIOS) |
| I2 | Number of disks and network adapters |
| I4 | Detected operating system |
| I5 | CPU mode and model |
| I6 | Disk filesystems (shown only with --probe-disks) |
Applying General Optimizations
Step 1. Apply general optimizations (replace <vm_name> with the correct information)
/tmp/syneto-vmtune apply <vm_name>IMPORTANT
Ensure the VM is powered off before running this command.
A ZFS snapshot is automatically taken before any change is applied. All changes are fully reversible.NOTE
Ifassessreports W15 (BitLocker), suspend BitLocker inside the VM before runningapply. Otherwise the VM boots into BitLocker recovery.
Step 2. Disable nested virtualization (replace <vm_name> with the correct information)
/tmp/syneto-vmtune apply <vm_name> --only W21IMPORTANT
Ensure the VM is powered off before running this command.
Skip this step if the VM uses WSL2, Windows Sandbox, Hyper-V, or Virtualization Based Security (VBS/Credential Guard).
Installing Guest Agent Tools (Optional — apply if the VM needs VirtIO drivers for storage or NIC migration)
Step 1. Login to SynetoOS GUI
Step 2. From Virtualization menu, click on Virtual machines

Step 3. Select the VM on which you want to apply the optimizations

Scroll down to the OS Details section until you see the Install button.
Step 4. Click on Install/Mount (next to the Guest agent tools entry)

Step 5. Click on Install

The VirtIO Guest Tools ISO will automatically mount to the VM's optical drive and any previously mounted ISOs will be ejected.
Migrating the Storage Bus to VirtIO (Optional — requires Guest Agent Tools installed first)
Migrate storage bus from SATA/IDE to VirtIO (replace <vm_name> with the correct information)
/tmp/syneto-vmtune migrate-bus <vm_name>IMPORTANT
- Ensure that the QEMU Guest Agent and VirtIO drivers are installed inside the VM before running this command.
- The VM needs to be powered on during this operation. It will automatically reboot during the migration process.
- After migration, Windows may display the initial setup screen on first boot — ensure you have console or RDP access ready before proceeding.
NOTE
The VirtIO Guest Tools ISO needs to be mounted beforehand in order to migrate the storage bus.
Binding Data Disks (Multi-Disk VMs) (Optional — apply if the VM has multiple active disks)
Step 1. Sample the data disks to ensure they see meaningful traffic (replace <vm_name> with the correct information)
virsh domstats <vm_name> --block
Step 2. Bind data disks on a multi-disk VM (replace <vm_name> with the correct information)
/tmp/syneto-vmtune apply <vm_name> --only W18Before applying:
VM shape Without W18 With W18 1 disk Optimal No-op, nothing to bind 2 disks, data idle Optimal Wastes a kernel thread 2 disks, data hot (e.g. SQL log volume) Data is the bottleneck Likely +20–50% improvement 3+ active disks Severe bottleneck Big win IMPORTANT
Ensure the VM is powered off before running this command.
W18 only works on virtio-blk disks. If assess reports F1 (data disk on SATA/IDE), migrate the storage bus first — see Migrating the Storage Bus to VirtIO. There is nothing for the iothread to bind to until the disk is on virtio.
Swapping the Emulated NIC to VirtIO (Optional — apply if assess reports F2)
Step 1. Swap an emulated NIC to virtio (replace <vm_name> with the correct information)
/tmp/syneto-vmtune apply <vm_name> --also F2Three things can trigger F2, and one of them is invisible in the XML:
What “assess” sees What the guest actually gets <model type='e1000e'/>, e1000, rtl8139, ne2k_pciThat emulated NIC — usually a Windows install done with paravirt off <model type='vmxnet3'/>, pcnetLeftover from a VMware V2V import No <model>element at allQEMU's machine-type default — e1000e on q35, rtl8139 on i440fx NOTE
- The third row is the one to watch — the XML looks clean, with nothing explicitly saying
e1000e, yet the VM is still on an emulated NIC.assessnames the model QEMU will actually pick, so the finding reflects what you truly have, not just what's written in the XML.- SR-IOV passthrough interfaces (
type='hostdev') are exempt — the guest sees the physical NIC directly, so there is no model to choose.- The MAC address is preserved, so DHCP reservations and MAC-keyed firewall rules are not affected. However, Windows will still enumerate a new network adapter, since the underlying PCI device changes — this can affect static IP configurations, which will need to be reapplied to the new adapter.
- If the VM is still being installed (install ISO mounted with the guest agent disconnected — Syneto's standard paravirt-off installer flow), the fixer declines and reports "no change" for F2. Finish the OS installation first, then re-run this step.
- Use
--only F2instead if you want to change the NIC and nothing else.IMPORTANT
Ensure the VM is powered off before running this command.
The virtio-net driver must already be installed inside the guest before running this command. A guest without the driver comes back from this change with no network at all — nothing in the XML tells the tool whether the driver is present.
Step 2. Verify the change (replace <vm_name> with the correct information)
virsh dumpxml --inactive <vm_name> | grep -A4 "<interface"EXAMPLE OUTPUT
<interface type='network'> <mac address='52:54:00:91:f3:da'/> <source network='default'/> <model type='virtio'/> <link state='up'/>The interface should now read
<model type='virtio'/>.
Powering On and Verifying Results
Step 1. Power on the optimized VM
Step 2. Check network connectivity after VM has booted
virsh qemu-agent-command <vm_name> '{"execute":"guest-ping"}'EXAMPLE OUTPUT
{"return":{}}IMPORTANT
If the guest agent does not respond, or the VM has no network access after this change, the virtio-net driver was likely not actually present in the guest before the fix was applied. Roll back using the backup XML created.
Step 3. Check applied optimizations
/tmp/syneto-vmtune assessThe output should show no FAIL or WARNING codes for the optimizations applied in the previous steps.