Virtual Disk Allocation Failed: Real Fix for Hyper-V and VMware
You get this when creating or expanding a VHDX or VMDK. It's usually low host disk space or a SAN capacity issue. Here's the fix from real jobs.
When This Error Shows Up
You're building a new VM in Hyper-V Manager or vSphere. You click 'Create Virtual Hard Disk' or 'Expand' — and bam, you get a message like 'Cannot allocate virtual disk' or error code 0x80070070. Sometimes it's a thin disk that suddenly fails to grow. I had a client last month whose file server VM was stuck at 500GB because the host's C: drive had 2GB free. The error doesn't always say 'disk full' — it just dies with a generic allocation failure.
Why It Happens
The root cause is almost always one of three things:
- Host disk is out of space — The physical drive where the VHDX or VMDK lives is full. Hyper-V and vSphere need room for metadata, snapshots, and temp files.
- SAN or NAS quota exceeded — Your storage array has a thin provisioning limit or a hard quota. The host sees free space, but the array says no.
- Thick provision lazy zeroed failure — When you choose thick provision (eager zeroed), the host tries to write zeros across the whole disk. If the storage can't keep up or is fragmented, it fails.
I've also seen this happen when the Hyper-V host's VHDX file is on an NTFS volume that's 95% full. The OS reserves space for the MFT, so even if there's 5% free, the allocation fails.
The Fix — Step by Step
Skip the reboots and the 'repair disk' nonsense. Here's what works:
Step 1: Check Host Disk Space
Open File Explorer on the Hyper-V host or the ESXi host's datastore browser. Look at the drive where the virtual disk lives. You need at least 10% free, but 20% is safer. On Windows, run wmic logicaldisk get size,freespace,caption as admin. On ESXi, go to Storage > Datastores and check the capacity.
Step 2: Free Up Space or Move the Disk
If the host is full, delete old snapshots, export VMs you don't need, or move the VHDX to another drive. For Hyper-V, I use Move-VMStorage in PowerShell:
Move-VMStorage -VMName "FileServer" -DestinationStoragePath "D:\VMs\"
For vSphere, migrate the VM to another datastore using Storage vMotion or a cold migrate. If you don't have vMotion, shut down the VM, copy the VMDK to another datastore, then reattach it.
Step 3: Check SAN Quotas
Log into your SAN management interface (EMC Unity, NetApp ONTAP, etc.). Look at the LUN or volume where the datastore resides. See if there's a quota or thin provisioning limit. I've seen cases where the LUN reports 500GB free but the thin pool is 98% allocated. If so, expand the LUN or delete old snapshots on the array.
Step 4: Use Thick Provision Eager Zeroed with Caution
If you need thick provision, do it in smaller chunks. Or use vmkfstools on ESXi to create the disk from the command line:
vmkfstools -c 200G -d eagerzeroedthick /vmfs/volumes/datastore1/VM/disk.vmdk
This sometimes works when the GUI fails. It also gives you a clearer error if the storage can't handle it.
Step 5: Restart the Hyper-V Virtual Disk Service
On Hyper-V hosts, the Virtual Disk Service (VDS) can get stuck. Restart it:
net stop vds
net start vds
Then retry the allocation. This fixed it for a client who had a stuck metadata lock on the VHDX.
Still Fails? Check These
If you did all that and the error persists, look at these:
- NTFS fragmentation — Run
defrag C: /U /Von the host drive (not the VM). Heavy fragmentation can block allocation of large files. - Antivirus real-time scanning — Some AV software (especially Symantec Endpoint Protection) locks VHDX files during creation. Exclude the VM folder from scanning.
- Storage controller firmware — On older SAN arrays, a firmware bug can cause allocation to fail on large disks. Check your vendor's KB. I had a Dell MD3200 that needed a firmware update to handle disks over 2TB.
- Cluster shared volumes — If you're on a Hyper-V cluster, the CSV might have a conflicting reservation. Use
Get-ClusterSharedVolumein PowerShell and see if the volume is in a degraded state.
One last tip: try creating a tiny virtual disk first (1GB). If that works, your storage can allocate. If even 1GB fails, it's a fundamental problem with the host or array.
Was this solution helpful?