essay / July 29, 2026 / 9 min read
I Put Windows in a VM So I Never Have to Dual-Boot Again
A beginner's guide to running Windows on Linux with KVM, including disk conversion, FL Studio, RDP, shared files, USB devices and optional GPU passthrough.
I love Linux. Unfortunately, some software still prefers Windows.
FL Studio itself can run through Wine, but music production is more than the main program. Plugin installers, copy protection, audio drivers and random old VSTs make the experience fragile. I want to make music, not debugging a new DLL.
Dual-booting works, but I dislike Windows enough that booting it as my main operating system ruins the mood before I open FL Studio. A virtual machine is the compromise: Linux remains in charge, Windows opens in a window, and I can close it when I am done.
These are the steps I use, including the failures that took the longest to diagnose.
My machine
My host is not a special server:
- Ubuntu 26.04 LTS with Linux 7.0
- AMD Ryzen 7 7800X3D
- 32 GB RAM
- NVIDIA RTX 3090 24 GB
- ASRock B850 Pro RS WiFi motherboard
I give the Windows VM 8 virtual CPUs and 12 GB of RAM. That leaves Linux enough memory to stay responsive. FL Studio does not need the RTX 3090, so my everyday setup uses Remote Desktop rather than passing through the GPU.
Older Intel graphics setups gave me repeated driver and passthrough trouble. That experience was one reason I chose the boring VM route rather than designing everything around a fragile graphics configuration. Your hardware may behave perfectly; mine did not.
What we are building
graph LR
Linux[Ubuntu host] --> KVM[KVM + QEMU]
KVM --> Windows[Windows 10 VM]
Linux -->|RDP window| Windows
Linux -->|Samba share| Windows
Linux -->|optional USB device| Windows
KVM lets the Linux kernel run the guest efficiently. QEMU provides virtual hardware. libvirt manages it, and virt-manager gives the whole stack a graphical interface.
Windows code runs directly on the CPU’s virtualization features, so this setup is much faster than old-fashioned software emulation.
1. Check virtualization
Enter your motherboard firmware and enable SVM on AMD or VT-x on Intel. Ubuntu can then confirm that KVM exists:
ls -l /dev/kvm
If that file exists, KVM can access the CPU’s virtualization support.
Install the tools:
sudo apt update
sudo apt install qemu-kvm qemu-utils libvirt-daemon-system virt-manager ovmf swtpm
sudo usermod -aG libvirt,kvm "$USER"
Log out completely and log back in after adding the groups. This caught me: virt-manager could not connect even though I had run the correct command, because my existing desktop session had not received the new group membership.
You can verify it with:
groups
Both libvirt and kvm should appear.
2. Install Windows or import an old disk
The easiest route is a fresh Windows 10 ISO. Open virt-manager, create a new virtual machine, select the ISO, then choose:
- UEFI firmware
- X vCPUs
- X GB RAM
- 100 GB or more of disk space
- the default NAT network
Windows 11 may ask for TPM. Add a TPM 2.0 emulator in virt-manager; the swtpm package provides it.
I already had a Windows installation stored as a VHDX backup, so I converted it instead:
qemu-img info Windows-System.VHDX
qemu-img convert -p -f vhdx -O qcow2 \
Windows-System.VHDX Windows-System.qcow2
Keep the original VHDX until the VM has booted and your files are verified. Conversion should create a new file, not modify the backup.
Move the QCOW2 image into libvirt’s image directory, then create a VM in virt-manager using Import existing disk image. QCOW2 supports snapshots and sparse storage, making it a better native format for QEMU.
3. Fix an imported machine that boots into GRUB
My imported disk was previously dual-booted. It contained Windows, Linux and an EFI partition. The VM found the old GRUB bootloader first, then dropped into a GRUB prompt instead of Windows.
The Windows installation was fine. The boot choice was wrong.
In virt-manager:
- Open the VM’s Details.
- Confirm it uses UEFI/OVMF, not legacy BIOS.
- Open Boot Options.
- Put the Windows disk first.
- Use the UEFI boot menu to select Windows Boot Manager.
If Windows Boot Manager is missing, boot a Windows installer ISO, choose Repair your computer → Troubleshoot → Command Prompt, then rebuild the Windows EFI boot files with bcdboot. Do not format partitions blindly. An imported dual-boot disk may contain data you still need.
A blank GRUB screen does not mean your Windows backup is corrupt. Inspect the EFI entries first.
4. Install the virtual hardware drivers
Windows can boot with generic drivers, but disk, network and display performance will be poor. Download the virtio-win driver ISO, attach it as a CD-ROM in virt-manager, and run its guest tools installer inside Windows.
For a normal console, SPICE plus QXL or Virtio video is adequate. I initially saw Microsoft Basic Display Adapter and could not set a sensible resolution. Windows was missing the guest display driver.
I eventually stopped fighting console resolution and used RDP instead. It gives me dynamic resolution, a shared clipboard and better everyday desktop behavior.
5. Use Remote Desktop as the display
RDP hosting requires Windows Pro or a higher edition; Windows Home cannot act as the built-in RDP server.
Inside Windows:
- Open Settings → System → Remote Desktop.
- Turn Remote Desktop on.
- Give your Windows account a password. Blank-password accounts are blocked by default.
- Allow Remote Desktop through Windows Firewall.
- Open an Administrator terminal and confirm the service is listening:
netstat -ano | findstr :3389
My first Remmina attempts failed with a useless “fatal error.” Nothing was listening on port 3389. TermService appeared to be running, but the listener had not been created. I toggled Remote Desktop off and on, then used an Administrator terminal to confirm that the port had opened.
On Ubuntu, find the VM’s address:
virsh domifaddr flstudio-win
I use FreeRDP because its behavior is explicit:
sudo apt install freerdp3-x11
xfreerdp3 /v:192.168.122.215 /u:YOUR_WINDOWS_USER \
/w:2560 /h:1440 /bpp:32 /dynamic-resolution \
/clipboard /wallpaper /audio-mode:server /cert:ignore
Replace the address and username. Let FreeRDP ask for the password, or store it in your desktop keyring. Do not put the password directly in a public script.
These flags fixed the annoyances I hit:
/dynamic-resolution: resize Windows with the RDP window/bpp:32: full color, avoiding obvious banding/clipboard: copy and paste between Linux and Windows/wallpaper: keep the wallpaper instead of RDP’s default black background/audio-mode:server: play Windows audio on the Linux machine
I have two 2560×1440 monitors. Remmina initially created a tiny session, then a badly scaled one that looked almost 4K. Explicit width, height and 32-bit color fixed the guesswork. If text is still the wrong size, adjust Windows display scaling separately; resolution and scaling are not the same thing.
6. Make the VM feel like an app
Create a small launcher at ~/.local/bin/windows-music:
#!/usr/bin/env bash
set -euo pipefail
VM="flstudio-win"
IP="192.168.122.215"
USER="YOUR_WINDOWS_USER"
virsh domstate "$VM" | grep -q running || virsh start "$VM"
for _ in {1..60}; do
timeout 1 bash -c "echo >/dev/tcp/$IP/3389" 2>/dev/null && break
sleep 1
done
exec xfreerdp3 /v:"$IP" /u:"$USER" \
/w:2560 /h:1440 /bpp:32 /dynamic-resolution \
/clipboard /wallpaper /audio-mode:server /cert:ignore
Then:
chmod +x ~/.local/bin/windows-music
The script starts Windows if needed, waits until RDP is ready, and opens it. Reserve the VM’s address in libvirt’s DHCP settings or use its hostname so the launcher does not break when the IP changes.
A desktop launcher or a KWin/GNOME window rule can send this window to a chosen monitor and make it fullscreen. At that point FL Studio feels less like a second operating system and more like one awkward Linux application.
7. Share projects safely
I use a Samba share for project files rather than attaching the same writable disk to Linux and Windows simultaneously.
Install Samba:
sudo apt install samba
mkdir -p ~/Music/Windows-Share
sudo smbpasswd -a "$USER"
Add a share to /etc/samba/smb.conf:
[music]
path = /home/YOUR_LINUX_USER/Music/Windows-Share
browseable = yes
read only = no
guest ok = no
Restart Samba:
sudo systemctl restart smbd
In Windows Explorer, open \\HOST_IP\music and sign in with the Samba user. Keep active FL Studio projects on the VM’s virtual SSD if plugins dislike network paths, then copy exports and backups to the share.
Never mount the same NTFS volume read-write on the host while Windows is using it. Two operating systems can then alter the filesystem without coordinating and corrupt your work.
8. Audio and USB devices
RDP audio is convenient for arranging, installing plugins and casual playback. It is not ideal for live monitoring because network audio adds latency.
For serious recording, pass a dedicated USB audio interface to the VM:
- Shut the VM down.
- Open Add Hardware → USB Host Device in virt-manager.
- Select the interface.
- Start Windows and install the manufacturer’s ASIO driver.
The host loses access while the device belongs to Windows. Passing through an entire USB controller can improve reliability for several studio devices, but only do that if its IOMMU group is separate and none of your Linux keyboard, mouse or boot devices depend on it.
Make a snapshot before installing old plugins or copy-protection software. VM snapshots are one of the best parts of this arrangement.
What about GPU passthrough for gaming?
You can give a physical GPU directly to Windows using VFIO. With the RTX 3090 passed through, games can run close to native performance. Linux loses access to that GPU until the VM releases it.
A passthrough machine needs:
- a second GPU or integrated graphics for Linux
- IOMMU enabled in firmware
- the GPU and its HDMI audio function in safe IOMMU groups
- VFIO binding before the normal graphics driver claims the card
- a monitor input, second monitor, or Looking Glass for the Windows picture
GPU passthrough deserves a hardware-specific guide because one copied command can leave the host without a display. Check groups with:
find /sys/kernel/iommu_groups/ -type l
Then read the Arch Wiki VFIO guide before changing boot arguments. Don’t assume that a motherboard, reset quirk or IOMMU layout from someone else’s machine matches yours.
For FL Studio, I avoid all of that. A virtual display and RDP are simpler, and the RTX 3090 remains available to Linux and local AI workloads.
Why this is better than dual-booting for me
The VM consumes RAM while open. USB and low-latency audio need extra setup. Anti-cheat games may reject virtualization, and GPU passthrough adds more ways to break the host display.
But my normal operating system never disappears. I can browse Linux files, copy a command into Windows, make music, close the window and immediately return to work. Windows cannot take over the boot process, fill my Linux session with notifications or turn a five-minute task into a reboot.
That trade is easy for me. I get the one Windows application I need without accepting Windows as the place where I live.