Skip to content

Storage Spaces can report a drive larger than the disks in it

Thin provisioning means the size is a promise. How to read the pool rather than the volume, before it stops accepting writes.

6 min read

Storage Spaces pools several physical disks and presents virtual drives on top of them. The most useful and most dangerous feature is thin provisioning: a space can be created larger than the disks behind it, on the understanding that you will add disks before it fills.

The consequence is a drive that says 40 TB with plenty free, on a pool that is nearly out of physical capacity. Writes fail while Explorer still looks comfortable.

The three numbers to read

# Physical capacity and what the pool has actually used
Get-StoragePool | Where-Object IsPrimordial -eq $false |
  Select-Object FriendlyName, HealthStatus,
    @{n='SizeTB';e={[math]::Round($_.Size/1TB,2)}},
    @{n='UsedTB';e={[math]::Round(($_.Size - $_.AllocatedSize)/1TB,2)}}

# Each virtual disk, its resiliency and its real footprint
Get-VirtualDisk | Select-Object FriendlyName, ResiliencySettingName,
  ProvisioningType, HealthStatus,
  @{n='SizeTB';e={[math]::Round($_.Size/1TB,2)}},
  @{n='FootprintTB';e={[math]::Round($_.FootprintOnPool/1TB,2)}}

FootprintOnPool is the honest number: what this virtual disk costs the pool, resiliency included. Compare it with Size and the overhead becomes obvious.

Resiliency is a multiplier, not a setting

ResiliencyCosts per 1 TB storedSurvives
Simple1 TBNo disk failure
Two-way mirror2 TBOne disk
Three-way mirror3 TBTwo disks
ParityAbout 1.3 to 1.5 TBOne disk, slower writes

A two-way mirror over four 4 TB disks is a 16 TB pool that holds 8 TB of files. People frequently size the pool and then feel cheated by the volume, which is arithmetic rather than a fault.

When the pool fills

  1. Add a disk and the pool absorbs it, which is the intended answer.
  2. Optimize drive usage after adding one, so existing data spreads across the new disk.
  3. Delete files, then trim, because a thin space does not release blocks until it is told they are free.
  4. Check the health, since a pool with a failed disk reserves capacity for a rebuild.
# Spread data over newly added disks
Optimize-StoragePool -FriendlyName 'Pool'

# Return freed blocks to a thin space
Optimize-Volume -DriveLetter E -ReTrim -Verbose

The retrim step is the one people miss. Deleting 500 GB from a thinly provisioned space does not hand 500 GB back to the pool until the blocks are released, which is the same mechanism described for sparse files.

Whether to use it at all

For a pile of mismatched disks that should look like one drive, it is genuinely good. For a single machine with one SSD and one hard disk, two plain drives and a decision about what lives where is simpler, and that decision is covered in C drive against D drive.

Common questions

Why does my Storage Spaces drive show more space than my disks?

Because it is thinly provisioned. The volume size is a promise rather than physical capacity, on the assumption that disks are added before it fills.

How do I check how full a storage pool really is?

Get-StoragePool reports Size and AllocatedSize for the pool, and Get-VirtualDisk reports FootprintOnPool per volume. The footprint includes resiliency overhead, which the volume size does not.

How much space does a two-way mirror cost?

Twice what you store. Four 4 TB disks make a 16 TB pool that holds 8 TB of files. Three-way mirroring costs three times, and parity is roughly 1.3 to 1.5 times.

Why did deleting files not free space in the pool?

A thin space keeps the blocks until they are released. Run Optimize-Volume with -ReTrim to hand them back.

Read next