Systems Admin

Hyper-V Storage Migration: Move a Live VM Between Disks With Zero Downtime

Disk fills up. Storage gets retired. A workload outgrows its tier. Whatever the trigger, sooner or later you need to move a Hyper-V VM’s files off one disk and onto another — and ideally without taking the guest down. Hyper-V’s built-in Move wizard handles this case live, copying the VHDX and configuration files to a new path while the guest keeps running, and cutting over at the end with no perceptible interruption. This post walks the same-host storage move (different disk on the same Hyper-V host) end-to-end and explains where each option fits.

The four flavours of Hyper-V move — pick the right one

Hyper-V’s “move” functionality bundles four distinct operations under one wizard. They’re named confusingly similarly so it’s worth being explicit about which one you want before you click anything:

  • Quick Migration — clustered hosts, briefly suspends the VM during failover. Used when you can tolerate a few seconds of pause but want low complexity.
  • Live Migration — clustered hosts, no downtime. The VM moves between hosts while running; storage stays on shared storage (CSV).
  • Storage Migration — same host, different disk. The VM stays on the host; only the VHDX and friends move. Live, no downtime. This is what this post covers.
  • Shared Nothing Live Migration — standalone hosts (no shared storage), no downtime. Moves both compute state AND storage between two hosts that share nothing in common except a network. The next post in this pathway covers this case.

Storage Migration is the most common operation by a wide margin. It’s the answer to “the C: drive is full and I need to move some VMs to D:” without taking the workload offline.

Pick the right move mode

The Storage Migration path itself has three sub-modes:

  • Move all VM data to a single location — everything (VHDX, configuration, checkpoints, smart paging) goes to one folder. Use this 95% of the time. Simplest, easiest to manage afterwards.
  • Move VM data to different locations — specify separate paths for the VHDX vs configuration files vs paging vs checkpoints. Useful when you have tiered storage (fast NVMe for VHDX, slower SATA for paging and checkpoints) and want to physically distribute the components.
  • Move only the virtual hard disk — just the VHDX moves; configuration files stay put. Rarely the right choice in practice; the small files are easier to keep with the VHDX than to manage separately.

The wizard makes you pick. There’s no “default” — even for the simplest case you have to actively select “all to one location.” Plan the destination layout before you start.

Before you start

  1. Pick the destination drive. Confirm it has space for the VHDX (and any future expansion). For a 60 GB VHDX, leave at least 100 GB of free space — growth headroom + temporary space the wizard uses for delta sync during the move.
  2. Decide the destination folder structure. Convention: one folder per VM under a top-level Hyper-V or HyperV-VMs directory. Predictable for backup software, predictable for the next admin.
  3. Set up downtime monitoring. A continuous ping is the simplest possible check. The expected result during the move is zero dropped packets — if you see any loss, something is wrong with the live-move path.
  4. Note the current path. Open Hyper-V Manager > right-click the VM > Settings > Hard Drive. Write down where the .vhdx lives now. After the move you’ll compare against the new path.
Hyper-V Manager main pane on the source host showing the EDGE virtual machine in a Running state with its current storage path visible in the lower details pane, the starting state before initiating the storage move
Starting state — EDGE is running, its files live in the default Hyper-V path on the C:\ drive of the same host, and the C:\ drive is the disk you want to move OFF of. This is the textbook Storage Migration scenario: same host, different disk.
File Explorer on the source host showing the current VM folder under the default Hyper-V storage path with the .vhdx, the .vmcx configuration file, and the smart paging directory all in their pre-move location
The current files. The .vhdx is the only large object; the .vmcx (configuration), checkpoints folder, and smart paging folder are all small. The wizard moves all of them in one operation when you pick the “all to one location” mode.

Step 1 — start the downtime monitor

Open an elevated PowerShell or cmd window on the host (or another machine on the same network as the guest). Start a continuous ping against the guest’s IP:

ping 10.15.1.166 -t

Replace 10.15.1.166 with the actual guest IP. Leave the window visible alongside Hyper-V Manager throughout the migration. The expected output is an unbroken stream of Reply lines — ZERO Request timed out entries.

Elevated PowerShell window running the continuous ping command against the guest VM’s IP, with the first dozen replies showing low latency and the time markers in the output proving the session is monitoring the guest in real time
Set up the downtime monitor BEFORE you start the move. The continuous ping is the simplest possible “is the guest still alive” check. For Shared Nothing Live Migration and same-host storage migration alike, the expected result is zero dropped packets — if you see Request timed out entries, something is wrong with the live-move path.

If the guest doesn’t respond to ICMP (firewall rule, security policy), substitute a TCP-based check: Test-NetConnection 10.15.1.166 -Port 3389 in a loop, or curl https://10.15.1.166/ against any web service the guest exposes. The point is continuous probing — the specific protocol doesn’t matter as long as it would notice an interruption.

Step 2 — open the Move wizard

In Hyper-V Manager, right-click the VM (EDGE in the screenshots, but yours will be different) and select Move.

Hyper-V Manager right-click context menu on the EDGE VM with the Move action highlighted, the entry point into the wizard that drives the rest of the migration
The wizard entry point. Right-click on the VM in Hyper-V Manager > Move. Note that there’s NO PowerShell-only option that does the equivalent end-to-end (Move-VMStorage exists but you have to chain it with other cmdlets to match the wizard’s behaviour) — for one-off moves the wizard is the right tool.

The wizard opens with an introduction page. Click Next.

Move wizard introduction screen explaining the wizard’s purpose with the Next button highlighted, ready to advance to the move-type selection
Wizard intro — click Next. There’s no configuration on this page; it just explains what you’re about to do. The wizard validates prerequisites in the background while you click through.

Step 3 — choose move type

Two options on this page:

  • Move the VM to another computer — this is Shared Nothing Live Migration; covered in the next post.
  • Move the VM’s storage to a new location — this is Storage Migration. Pick this one for the same-host scenario.

Select the second option and click Next.

Move wizard Choose Move Type page showing two radio options: Move the VM to another computer (Shared Nothing Live Migration) and Move the VM’s storage to a new location, with the second option selected for this same-host scenario
Choose move TYPE. Two options: cross-host (Shared Nothing Live Migration) or same-host (Storage Migration). For this post we’re on the same host moving to a different disk, so it’s the second option. The cross-host case is covered in a separate post.

Step 4 — choose move mode

Three radio buttons:

  • Move all of the VM’s data to a single location — pick this one for the textbook scenario.
  • Move the VM’s data to different locations — pick this when you have a tiered storage layout planned.
  • Move only the VM’s virtual hard disks — rare; usually not what you want.

Pick the first option and click Next.

Move wizard Choose Options for Moving Storage page showing three radio options: Move all VM’s data to a single location, Move VM’s data to different locations, and Move only the VM’s virtual hard disks, with the first option selected for the simplest move
Choose move MODE. Three options. “All VM data to one location” is the simplest and what you want 95% of the time. “Different locations” is for tiered storage (VHDX on fast SSD, paging on slower spinning rust). “Only the VHD” is rare in practice — the small files are easier to move with the VHD than to manage separately.

Step 5 — specify the destination path

Click Browse and navigate to the destination drive. Create a new folder for this VM if one doesn’t exist yet (the wizard’s browse dialog has a “Make New Folder” button).

Folder browse dialog overlaid on the wizard with the destination path being navigated to and a new folder being created on the target drive to receive the VM files
Browse to the destination drive and create a folder for the VM there. Convention: one folder per VM, named after the VM, under a top-level Hyper-V or HyperV-VMs directory. Keeps the file layout predictable for backup software and for the next person who has to find these files.

Select the folder and click Next. The wizard now shows the destination path it’s about to use.

Move wizard Choose New Location page populated with the destination path that was just selected, ready to advance to the summary screen
The wizard now shows the destination path. Confirm and click Next.

Step 6 — confirm and start

The Summary page shows the source path, the destination path, and the move-mode selection one last time. This is your “last chance to bail” screen — review carefully:

  • Is the source path actually the one you intended to move?
  • Is the destination path on the right drive?
  • Is the destination folder empty (or at least, doesn’t already contain a different VM)?

If everything looks right, click Finish. The bytes start flowing immediately.

Move wizard Summary page showing the source path, the destination path, and the move-mode selection in a confirmation list with the Finish button highlighted, the last click before the bytes start moving
Summary screen — the last chance to bail. Source path, destination path, move mode all visible. Click Finish to start the bytes flowing.

Step 7 — watch the migration progress

Hyper-V Manager shows the percentage in the Status column on the VM row. The percentage is real — it’s the actual bytes-copied counter, not a placeholder. For a 60 GB VHDX on local SATA, expect ~10 minutes; on local NVMe, ~3 minutes; on iSCSI or SMB, depends entirely on the network path.

Hyper-V Manager Status column on the EDGE VM row showing a percentage progress indicator (early stage, around 12%) as the background copy of the VHDX runs from source disk to destination disk
Status column populates with a percentage as soon as the wizard exits. The bulk of the time is the .vhdx copy — for a 60 GB VHDX over local SATA expect ~10 minutes. The percentage is real (it’s the bytes-copied counter, not a fake progress bar).
Hyper-V Manager Status column on the EDGE VM row showing the percentage further along (around 78%) confirming the migration is making progress with the VM still in a Running state
Three-quarters done. Throughout this period the guest VM is fully responsive — users connected to it don’t notice anything different. The reads still come from the source disk; only writes land in two places (source AND destination) until the cutover.

Throughout the progress, the VM stays in Running state. The guest doesn’t notice the migration is happening — reads still come from the source disk, writes land in both places (source AND destination) until the cutover at the end.

Step 8 — verify zero downtime

Switch to the ping window. The stream of Reply lines should be unbroken throughout the move — no Request timed out entries.

PowerShell ping window during the migration showing an unbroken stream of successful Reply lines with no Request timed out entries, the live evidence that the move is happening with zero downtime to the guest
The ping window during the move. Unbroken successful replies. This is the load-bearing verification — even a single Request timed out would mean the live-move path failed and the cutover dropped the guest. Zero drops = success.

This is the load-bearing verification. If you see ANY packet loss during the move, something went wrong with the live-move path. Most likely cause: the cutover at the end took too long because the source disk was so heavily loaded that the delta sync couldn’t keep up with the rate of new writes. Stop the ping, document the loss, and investigate before doing this on another VM.

Step 9 — verify the new path

Once the wizard reports success, open the VM’s Settings dialog. Navigate to the Hard Drive page — the .vhdx path should now be the destination you specified. Check the Smart Paging Folder page too — same thing.

Hyper-V Manager Settings dialog for the EDGE VM after the move completes, with the Hard Drive page showing the .vhdx now at the new destination path and the Smart Paging Folder page showing the new directory, confirming the move landed cleanly
After the move, open the VM’s Settings dialog and check the Hard Drive page. The .vhdx now points to the destination path. The Smart Paging Folder also moved. Confirm both before declaring done — an incomplete move where some files moved and others didn’t is rare but worth catching.

If either page still shows the old path, the move was incomplete. This is rare (the wizard usually fails loudly if it can’t complete) but possible. If you see it, the recovery is to stop the VM, manually fix up the paths via Set-VM cmdlets, and re-validate.

Step 10 — stop the ping and confirm

Stop the ping with Ctrl+C. Look at the statistics summary at the bottom:

Sent = 420, Received = 420, Lost = 0 (0% loss)
PowerShell ping window after stopping the ping with Ctrl+C, showing the statistics summary (Sent / Received / Lost / 0% loss) that proves zero packets were dropped during the entire migration window
Stop the ping with Ctrl+C and look at the statistics. Sent = N, Received = N, Lost = 0 (0% loss). That’s the “zero downtime” promise made concrete. If you see any loss, something went wrong — investigate before doing this on a production VM.

Sent and Received should match exactly, Lost should be 0. That’s the “zero downtime” promise made concrete. The VM moved between disks while users kept working against it without noticing.

Where Storage Migration sits vs Shared Nothing Live Migration

Storage Migration (this post) and Shared Nothing Live Migration (next post) sound similar but solve different problems:

Scenario Use this
Same host, move to a different disk on the same host Storage Migration
Two standalone hosts, no shared storage, move VM between them Shared Nothing Live Migration
Clustered hosts, move VM between cluster nodes (storage stays on CSV) Live Migration
Clustered hosts, brief downtime acceptable Quick Migration

The decision tree is: clustered or standalone? same host or different host? same disk or different disk? The right answer is one of the four operations above and the wizard structure follows the same logic.

Things that bite people

Source disk runs out of space mid-move

The migration writes deltas to BOTH the source and the destination during the live-move phase (so that a failure mid-move doesn’t leave the VM stranded). If the source disk fills up during this period, the move stalls and may fail. Counter-intuitive: even though you’re moving OFF the source, you need free space ON the source for the move to complete cleanly. Free up some space on the source before starting if it’s very tight.

Destination is on a slow disk

The move is bottlenecked by the slowest disk in the path. If you’re moving to a USB external drive (slow), the move takes hours. If you’re moving to a network share over a gigabit link, the move takes hours. Test-write the destination first — copy a 1 GB file and time it — to size expectations before starting on a 200 GB VM.

Differencing disks need their parents to move with them

If the VHDX is a differencing disk (it has a parent), the parent VHDX moves automatically with it. But if the parent is on a different volume, the wizard might not let you proceed cleanly. Check Get-VM | Get-VMHardDiskDrive | Get-VHD before starting; if the chain spans volumes, consolidate first via Merge-VHD or pick a destination that can hold the entire chain.

Checkpoints prolong the move significantly

If the VM has checkpoints, EACH checkpoint is its own VHDX file and ALL of them have to move. A VM with 5 checkpoints takes ~5x as long as the same VM with no checkpoints. If you don’t need the checkpoints, delete them before the move (Remove-VMSnapshot). Hyper-V will merge them with the base VHDX, leaving you with one file to move.

Anti-virus on the host slows the copy

Some host-based anti-virus products scan VHDX files as they’re being written. This can slow the copy by 50% or more. Either temporarily exclude the VM’s destination folder from the AV scanner (and the source folder if you’re seeing slow reads), or schedule the move for a maintenance window when AV impact is acceptable.

The wizard runs as your account, not as the system

This means: your account needs read access to the source path AND write access to the destination path. Failures with “access denied” messages partway through the move usually trace back to a missing permission on the destination folder. Right-click the destination folder > Properties > Security and confirm your account can write before starting.

Pause/resume during the move can leave the VM in odd states

Don’t pause or save the VM during a Storage Migration. The wizard handles state transitions internally; if you intervene with the VM’s state from outside the wizard, the move might fail and recover the VM to a state that doesn’t match either the source or destination cleanly.

Where this fits

Storage Migration is the day-to-day workhorse of Hyper-V file management — you’ll do this dozens of times across the life of any non-trivial Hyper-V deployment. For the cross-host case (Shared Nothing Live Migration), see the next post in the Hyper-V Virtualization pathway. For the broader story on Hyper-V VM management, the same pathway covers VM creation, golden images, checkpoints, and the rest of the lifecycle. For the underlying storage performance characteristics that drive when you’d want to move VMs between disks, see the storage-related posts in the Windows Server Administration pathway.

Leave a Reply