VMWARE → STACKIT · WINDOWS GUIDE
Migrating Windows virtual machines from VMware to STACKIT
A Windows VM moves to STACKIT as a disk image: you decide how the Windows licence is provided, convert the disk to qcow2 or raw, make sure the guest has the storage and network drivers of the new platform, choose a machine type that supports Windows, and import. This guide follows those steps on a demo estate of six Windows servers and one template that StackToIT assessed on 4 November 2026, and shows what the run flags and what it leaves to you.
A SQL Server VM with three disks
Left: the three disks of win-sql01 from the vDisk sheet. Right: the blocks of compute.tf for that server, without the review comments above each block.
VM,Disk,Capacity MiB,Raw,Disk Mode,Sharing mode,Thin,Controller,Shared Bus,Disk Path,VM UUID
win-sql01,Hard disk 1,102400,False,persistent,sharingNone,False,SCSI controller 0,noSharing,[ds-prod-01] win-sql01/win-sql01_0.vmdk,4202-vm12-0004
win-sql01,Hard disk 2,512000,False,persistent,sharingNone,False,SCSI controller 1,noSharing,[ds-prod-01] win-sql01/win-sql01_1.vmdk,4202-vm12-0004
win-sql01,Hard disk 3,204800,False,persistent,sharingNone,False,SCSI controller 2,noSharing,[ds-prod-01] win-sql01/win-sql01_2.vmdk,4202-vm12-0004resource "stackit_network_interface" "vm_win_sql01_nic1" {
project_id = var.project_id
network_id = stackit_network.network_PG_Win_Data.network_id
ipv4 = "10.30.20.31"
}
resource "stackit_server" "vm_win_sql01" {
project_id = var.project_id
name = "win-sql01"
machine_type = var.vm_win_sql01_machine_type
availability_zone = var.availability_zone
boot_volume = {
source_type = "image"
source_id = var.vm_win_sql01_image_id
size = 100
}
network_interfaces = [stackit_network_interface.vm_win_sql01_nic1.network_interface_id]
}
resource "stackit_volume" "vm_win_sql01_disk2" {
project_id = var.project_id
name = "win-sql01-disk2"
availability_zone = var.availability_zone
size = 500
performance_class = var.vmware_volume_performance_class
}
resource "stackit_server_volume_attach" "vm_win_sql01_disk2" {
project_id = var.project_id
server_id = stackit_server.vm_win_sql01.server_id
volume_id = stackit_volume.vm_win_sql01_disk2.volume_id
}
resource "stackit_volume" "vm_win_sql01_disk3" {
project_id = var.project_id
name = "win-sql01-disk3"
availability_zone = var.availability_zone
size = 200
performance_class = var.vmware_volume_performance_class
}
resource "stackit_server_volume_attach" "vm_win_sql01_disk3" {
project_id = var.project_id
server_id = stackit_server.vm_win_sql01.server_id
volume_id = stackit_volume.vm_win_sql01_disk3.volume_id
}Boot disk
Hard disk 1, 102400 MiB, becomes a boot volume of 100 GiB. The server starts from an image you supply through a variable.
Data disks
Hard disk 2 with 512000 MiB and hard disk 3 with 204800 MiB become volumes of 500 and 200 GiB, each attached by its own attach block. Their contents are copied after the volumes exist.
The image is not in the draft
StackToIT does not convert or upload disks. The image ID is an input, and the next section shows how it is declared.
What the draft asks you for
Left: the vInfo row of win-sql01. Right: the two variables its server reads, from variables.tf.
VM,Powerstate,Template,CPUs,Memory,NICs,Disks,Provisioned MiB,In use MiB,Primary IP Address,DNS Name,Datacenter,Cluster,Host,Folder,Firmware,HW version,Path,Annotation,OS according to the configuration file,OS according to the VMware Tools,VM UUID
win-sql01,poweredOn,False,8,65536,1,3,819200,573440,10.30.20.31,win-sql01.corp.example,DC-Munich,CL-Prod,esx11,prod,bios,vmx-19,[ds-prod-01] win-sql01/win-sql01.vmx,SQL Server 2019 Standard,Microsoft Windows Server 2019 (64-bit),Microsoft Windows Server 2019 Standard,4202-vm12-0004variable "vm_win_sql01_image_id" {
type = string
description = "STACKIT image converted from the boot disk of VM win-sql01 (qcow2 or raw)."
}
variable "vm_win_sql01_machine_type" {
type = string
description = "STACKIT machine type replacing VM win-sql01 (source 8 vCPU / 64 GiB). See https://docs.stackit.cloud/products/compute-engine/server/basics/machine-types/"
}Size is stated, not chosen
The source has 8 CPUs and 65536 MiB. The machine type variable repeats that as 8 vCPU and 64 GiB and links the STACKIT machine types, so you choose a catalogue name.
Windows narrows the choice
The machine type page has a Windows Server compatible column for each family. Check it before you pick.
Image from the boot disk
The image variable stands for the boot disk after conversion to qcow2 or raw.
The Windows template
Left: the vInfo row of tpl-win2022. Right: the line of the README in terraform/ that lists it under Left for the architect.
VM,Powerstate,Template,CPUs,Memory,NICs,Disks,Provisioned MiB,In use MiB,Primary IP Address,DNS Name,Datacenter,Cluster,Host,Folder,Firmware,HW version,Path,Annotation,OS according to the configuration file,OS according to the VMware Tools,VM UUID
tpl-win2022,poweredOff,True,2,4096,1,1,61440,30720,,,DC-Munich,CL-Prod,esx11,prod,efi,vmx-19,[ds-prod-01] tpl-win2022/tpl-win2022.vmx,"Golden image, sysprepped",Microsoft Windows Server 2022 (64-bit),,4202-vm12-0007| Source | Class | Why |
|---|---|---|
| `vm.tpl-win2022` | REPLATFORM / MEDIUM | VM template: convert the VMDK to qcow2/raw and upload it with stackit_image, or rebuild it from a STACKIT public image. |No image block is written
A template is classified REPLATFORM. The run writes no image for it: you convert the disk and upload it, or rebuild it from a STACKIT public image.
Firmware stays open
The template boots with EFI. The run leaves BIOS or EFI open and notes that it is a property of the uploaded image, which you create.
What the run says about each Windows VM
| VM in the demo estate | What the run reports | What you do |
|---|---|---|
| win-iis01, win-iis02 (Windows Server 2022, EFI) | Class RECONFIGURE. Info finding: prepare the image for the new virtual hardware (storage and network drivers) before conversion, and check how Windows licences are provided on STACKIT. | Pick the licence route and a Windows-compatible machine type. Confirm EFI on the uploaded image. Replace VMware Tools. |
| win-dc01 (Windows Server 2019, domain controller) | Same class and finding as the web servers. The note in the export says domain controller; the run does not interpret notes. | Treat it as an Active Directory task. As practice, many teams add a new domain controller on STACKIT instead of converting the disk of an existing one; agree this with your AD owner. |
| win-sql01 (Windows Server 2019, SQL Server) | Three disks drafted as boot volume plus two volumes. A memory reservation of 65536 is exported; the reservation is left open because a server cannot express it. | Choose a machine type that holds the memory. Plan the database move separately; see the database guide. |
| win-fs01 (Windows Server 2019, file server) | A 2097152 MiB data disk becomes a 2048 GiB volume. A snapshot of 18432 MiB is found; the finding says only the current state is migrated. | Consolidate the snapshot before export. Plan the data copy and its duration. |
| win-app12 (Windows Server 2012 R2) | Warning that the guest operating system is past its vendor's end of support and that STACKIT public images will not cover it. Also a snapshot finding and a finding for the legacy network adapter. | Upgrade first, or migrate it as a custom image at your own risk, as the finding says. Check the guest network configuration after conversion. |
| tpl-win2022 (template) | Class REPLATFORM, no image block written. Info finding for Windows. | Rebuild from a STACKIT public image or convert and upload the template. |
The statements in the middle column are the messages of assessment.json and engineering/architect-report.md of the run, shortened. The run reads the guest OS from the configuration file; the OS reported by VMware Tools is left to a person to compare.
The migration in order
Export all sheets and read the guest OS twice
Include vSnapshot and vMemory in the RVTools export so snapshots and reservations are known. Compare the configuration-file OS with the one VMware Tools reports: the end-of-support check reads only the first.
Decide the licence route per VM
As of November 2026, the STACKIT operating system images page lists Windows Server 2025, 2022, 2019 and 2016 Standard images with the licence included, or you bring your own image and licences. Section Licence decisions lists what each route means.
Choose machine types
Start from the exported CPUs and memory, then keep to the families marked compatible with Windows Server on the machine type page.
Prepare the guest
Consolidate snapshots. STACKIT's own Windows example installs the VirtIO drivers NetKVM, Viostor and Vioscsi, installs Cloudbase-Init and runs Sysprep before conversion. That example starts from Hyper-V, so treat it as a model and test the same steps on a copy of your VMware guest.
Convert and upload
Convert the disk with qemu-img to qcow2 or raw, create the image through the CLI or API, upload the file and wait until the image state is AVAILABLE. The custom image page states a maximum image size of 70 GB; check your converted disk against it.
Create volume, server and data volumes
Apply the draft once networks, image ID and machine type are filled. The server starts from the image; data volumes follow.
Join the domain and verify
The STACKIT domain join command needs DNS servers that resolve your domain and a domain controller reachable on the local network. Check Device Manager for missing drivers.
Cut over and retire
Move traffic when the checks pass. Keep the source VM stopped but intact until the owner signs off. This is general practice, not a run output.
Licence decisions
Licence included
With a STACKIT Windows Server Standard image the operating system licence is included, Client Access Licences are not required, and Remote Desktop subscriber licences are not provided or charged; you bring those.
Your own image and licences
For a customer-provided image STACKIT provides no Windows licence and the customer is responsible for proper licensing. The guide names this route FVB and attaches conditions such as subscription licences or active Software Assurance; server licences without it are listed as not eligible.
Custom image and licensing agent
The images page says Windows licences cannot be migrated and that a custom image needs contact with STACKIT to install the licensing agent, while the licensing guide says no scanning agent is installed on customer-provided images. Ask STACKIT which applies to you.
Versions STACKIT supports
STACKIT provides only Windows Server versions that Microsoft still supports; the images page lists Microsoft's end-of-support date per version, so recheck it when you plan. A 2012 R2 guest therefore needs an upgrade or a custom image at your own risk.
SQL Server and other products
The licensing guide treats server applications and SQL Server as allowed when properly licensed. Read its per-product list for your estate.
Questions Windows teams ask
Does StackToIT convert the Windows disk or install drivers?
No. It reads the export and writes the draft: servers, volumes, interfaces and the list of settings still open. Disk conversion, VirtIO drivers and the upload are steps for your team.
Can a Windows Server 2012 R2 VM move to STACKIT?
The run warns that STACKIT public images will not cover a guest past its vendor's end of support and that it can only be migrated as a custom image at your own risk, or upgraded first. Plan the upgrade where the application allows it.
Which file formats can STACKIT import?
The custom image page lists raw, qcow2 and iso. Other formats can be converted, for example with qemu-img convert, which that page shows for raw.
What stays open after the run for every Windows server?
Machine type, address handling, boot firmware, power state after cutover, source location and the guest OS as VMware Tools reports it are critical settings left for review. The report lists them per VM in engineering/architect-report.md.
Sources
- STACKIT documentation: Windows Server licensing guide
- STACKIT documentation: Windows Server operating system images
- STACKIT documentation: machine types
- STACKIT documentation: use custom images with the IaaS API
- STACKIT professional services: Windows BYOL migration example
- STACKIT documentation: join a Windows Server to a domain
Your next move: STACKIT.
Tell us about your estate. We show you what StackToIT delivers for it: target architecture, Terraform artifacts and a structured migration plan.