Windows ยท Storage Spaces

Storage Spaces

Storage Spaces turns a pile of ordinary disks into pooled, resilient storage without a hardware RAID controller, and almost every configuration choice – simple, mirror, or parity – is really just deciding how many disks you’re willing to lose before data goes with them.

Quick idea: Storage Spaces groups physical disks into a storage pool, then carves virtual disks out of that pool’s free space – each virtual disk configured with a resiliency type that decides how it survives a disk failure. Get the resiliency type and disk count right for the workload, and the rest of Storage Spaces is mostly plumbing.
Storage Pool

A collection of physical disks grouped together so their capacity can be allocated as a single resource.

Virtual Disk

Space carved from a pool with a chosen resiliency type – what Windows shows the OS as a regular disk.

Resiliency Type

How a virtual disk protects against disk failure: simple (none), mirror, or parity.

What Is Storage Spaces?

Storage Spaces is a Windows and Windows Server technology that virtualizes storage by grouping physical disks into storage pools, then creating virtual disks – also called storage spaces – from the pool’s available capacity. A virtual disk appears to Windows as an ordinary disk, on top of which you create formatted volumes the same way you always have.

Think of a storage pool as a shared reservoir and each virtual disk as a pipe drawing from it at a chosen pressure setting. The reservoir doesn’t care which pipe drew how much; each pipe just has its own rule for how it behaves if part of the reservoir fails – some pipes stop entirely, some keep flowing because they never relied on just one source.

You can’t install Windows onto a storage space – it’s for data volumes, not the boot disk. And once physical disks join a pool, they’re expected to stay blank; Storage Spaces manages their partitioning itself.

Resiliency Types

Every virtual disk gets one of three resiliency types, chosen when it’s created and driving both how many disks it needs and what it survives.

Resiliency Type How It Works Minimum Disks
Simple Stripes data across disks with no extra copies or parity. Maximizes capacity and throughput; survives no disk failures. 1
Mirror Stripes data while writing two (two-way) or three (three-way) copies. Higher throughput and lower latency than parity. 2 (two-way, tolerates 1 failure); 5 (three-way, tolerates 2 failures)
Parity Stripes data and parity information across disks, journaling writes to protect against corruption on unplanned shutdown. 3 (single parity, tolerates 1 failure); 7 (dual parity, tolerates 2 failures)
Key rule: Never use simple resiliency for data you can’t afford to lose – it provides no protection at all against a disk failure. It exists for temporary, easily recreated, or already-replicated-elsewhere data where raw performance and capacity matter more than resilience.

Mirror is the default recommendation for most deployments – general-purpose file shares, VHD libraries – because it offers the best combination of throughput and latency. Parity suits highly sequential workloads like backup or archival storage, where the reduced write performance of parity calculations matters less than maximizing usable capacity.

Pools, Hot Spares, and Provisioning

Disks join a pool as either active members or hot spares – reserved capacity Storage Spaces automatically uses to rebuild a mirror or parity space when a disk fails, instead of running in a degraded state until someone manually replaces the failed disk.

Every virtual disk is also either thin-provisioned, allocating space from the pool only as data is actually written, or fixed-provisioned, reserving its full stated size from the pool immediately. Thin provisioning makes better use of available storage but requires watching pool free space so you don’t over-allocate across multiple thin disks and run out unexpectedly; fixed provisioning is required for storage tiers and for clustered storage pools.

Requirements and Version Boundaries

Storage Spaces works with SAS, SATA, iSCSI, and Fibre Channel disks, plus USB drives (not recommended for servers). Whatever the bus type, every disk must be blank and unpartitioned before it joins a pool – Storage Spaces refuses to pool a disk with existing volumes on it.

Any host bus adapter used must have RAID functionality fully disabled – Storage Spaces needs direct, unabstracted access to each physical disk, so an HBA that caches data or hides the individual disks behind its own RAID logic isn’t compatible.

Version note: Storage Spaces has been part of Windows Server since Windows Server 2012 and client Windows since Windows 8. Clustered deployments – where the pool is shared across multiple servers – have their own separate prerequisites, including a narrower list of supported resiliency types and disk bus types than a stand-alone server. Storage Spaces Direct, which pools local disks across cluster nodes over the network instead of shared storage, is a distinct, newer technology built on the same pool and virtual disk concepts.

Creating a Storage Pool

In Server Manager, storage pools are managed under File and Storage Services > Storage Pools. Unassigned disks start in a built-in primordial pool; creating a real pool moves them out of it.

# List physical disks available to pool from the primordial pool
Get-StoragePool -IsPrimordial $true | Get-PhysicalDisk -CanPool $True

# Create a pool from every disk currently available to pool
New-StoragePool -FriendlyName StoragePool1 `
  -StorageSubsystemFriendlyName "Windows Storage*" `
  -PhysicalDisks (Get-PhysicalDisk -CanPool $True)

# Create a pool from four specific disks instead of everything available
New-StoragePool -FriendlyName StoragePool1 `
  -StorageSubsystemFriendlyName "Windows Storage*" `
  -PhysicalDisks (Get-PhysicalDisk PhysicalDisk1, PhysicalDisk2, PhysicalDisk3, PhysicalDisk4)

# Add a disk to the pool as a hot spare rather than active capacity
$PDToAdd = Get-PhysicalDisk -FriendlyName PhysicalDisk5
Add-PhysicalDisk -StoragePoolFriendlyName StoragePool1 -PhysicalDisks $PDToAdd -Usage HotSpare

Creating a Virtual Disk

Resiliency is set per virtual disk, not per pool – the same pool can host a fast simple space for scratch data alongside a three-way mirror for something critical.

# Two-way mirror (default when Mirror is specified with no data-copy count),
# thinly provisioned, using the pool's maximum available capacity
New-VirtualDisk -StoragePoolFriendlyName StoragePool1 -FriendlyName VirtualDisk1 `
  -ResiliencySettingName Mirror -UseMaximumSize

# Three-way mirror - tolerates 2 disk failures - requires at least
# 5 physical disks in the pool (not counting hot spares)
New-VirtualDisk -StoragePoolFriendlyName StoragePool1 -FriendlyName BusinessCritical `
  -ResiliencySettingName Mirror -NumberOfDataCopies 3 -Size 20GB -ProvisioningType Fixed

# Dual parity - tolerates 2 disk failures, better capacity efficiency
# than three-way mirror, requires fixed provisioning
New-VirtualDisk -StoragePoolFriendlyName StoragePool1 -FriendlyName ArchivalData `
  -Size 50GB -ProvisioningType Fixed -ResiliencySettingName Parity -PhysicalDiskRedundancy 2
Practical rule: To create a three-way mirror, specify either -NumberOfDataCopies 3 or -PhysicalDiskRedundancy 2 – they describe the same outcome from different angles (total copies vs. tolerated failures). Omitting both when you specify Mirror gives you an ordinary two-way mirror.

Creating a Volume

A virtual disk isn’t usable until it has a volume on it – initialize the underlying disk, partition it, and format it, exactly as you would any other new disk:

# Initialize the virtual disk, create a partition with a drive
# letter, and format it NTFS in one pipeline
Get-VirtualDisk -FriendlyName VirtualDisk1 | Get-Disk |
  Initialize-Disk -Passthru |
  New-Partition -AssignDriveLetter -UseMaximumSize |
  Format-Volume

Choose NTFS or ReFS at format time depending on the workload – ReFS adds built-in data-integrity checksumming that pairs well with mirror resiliency, at the cost of some compatibility with older tools that assume NTFS.

Health and Monitoring

Pools, virtual disks, and the physical disks underneath them each carry their own HealthStatus and OperationalStatus, checkable the same way in Server Manager or PowerShell.

# Pool health - Healthy, Warning, or Unknown/Unhealthy
Get-StoragePool -IsPrimordial $False | Select-Object HealthStatus, OperationalStatus, ReadOnlyReason

# Virtual disk health - watch for Warning (Incomplete/Degraded) or Unhealthy (No redundancy)
Get-VirtualDisk | Select-Object FriendlyName, HealthStatus, OperationalStatus, DetachedReason

# Physical disk health and why a disk can't be pooled
Get-PhysicalDisk | Format-Table FriendlyName, MediaType, Size, CanPool, CannotPoolReason

# Repair a virtual disk after reconnecting or replacing a failed drive
Repair-VirtualDisk -FriendlyName BusinessCritical
Virtual Disk State Meaning
Healthy / OKFully redundant, no action needed.
Warning / IncompleteReduced resilience from a missing or failed drive, but remaining copies are up to date. Reconnect or replace the drive, then run Repair-VirtualDisk.
Warning / DegradedSame as Incomplete, but the surviving copies are out of date – repair as soon as possible before another failure removes the only current copy.
Unhealthy / No redundancyToo many drives failed – data has already been lost. Replace drives and restore from backup.
Practical rule: Storage Spaces Direct automatically starts a repair after a reconnected or replaced drive rejoins the pool. On a stand-alone server or ordinary (non-Direct) clustered pool, you must run Repair-VirtualDisk yourself – it doesn’t happen automatically.

Gotchas and Best Practices

A storage space can’t host the Windows boot volume. Plan a separate boot disk outside any pool.

Disks must be blank before pooling. If a disk shows Insufficient Capacity as its CannotPoolReason, it usually still has partitions on it – clear them with Clear-Disk before retrying.

Watch thin-provisioned pools for over-allocation. Because thin provisioning lets the sum of virtual disk sizes exceed physical pool capacity, monitor actual free space rather than trusting the configured sizes at face value – a pool can look fine on paper and still run out of real capacity under load.

Important: Storage Spaces is compatible with iSCSI and Fibre Channel controllers only for nonresilient (simple) virtual disks. If the workload needs mirror or parity resiliency, use locally attached SAS, SATA, or a certified JBOD enclosure instead.

Troubleshooting Cheat Sheet

Symptom Likely Cause Fix
Pool shows Read-only, operational status Incomplete The pool lost quorum – most member drives are offline or failed. Reconnect missing drives, then run Get-StoragePool <PoolName> -IsPrimordial $False | Set-StoragePool -IsReadOnly $false.
Virtual disk stuck Detached, reason By Policy An administrator took it offline, or it’s set to require manual attachment after every restart. Reconnect with Get-VirtualDisk | Where-Object OperationalStatus -eq "Detached" | Connect-VirtualDisk, or clear manual-attach with Set-VirtualDisk -IsManualAttach $false.
Disk won’t join a pool – CannotPoolReason: In a Pool The disk already belongs to a different storage pool. A disk can only be in one pool at a time. Remove it from its current pool with Remove-PhysicalDisk, or run Reset-PhysicalDisk if it was disconnected without Storage Spaces being told.
Virtual disk Warning / Incomplete or Degraded after a drive failure Reduced resiliency – one or more member drives failed or are missing. Reconnect or replace the failed drive, then run Repair-VirtualDisk to restore full resiliency.
New-VirtualDisk fails with a disk-count error Not enough physical disks in the pool for the requested resiliency type (e.g. three-way mirror needs 5). Add more disks to the pool, or choose a resiliency type that matches the disks actually available.

Final Thoughts

Storage Spaces does most of its work in two decisions made once, at creation time: which disks go into the pool, and which resiliency type each virtual disk uses. Everything else – hot spares, thin provisioning, health monitoring – exists to keep those two decisions holding up over time as disks age and fail.

Match the resiliency type to what the workload can actually tolerate losing, keep an eye on pool free space if anything is thin-provisioned, and run Repair-VirtualDisk promptly after any drive failure rather than leaving a virtual disk running in a degraded state longer than necessary.

Key takeaway: Run Get-VirtualDisk | Select-Object FriendlyName, HealthStatus, OperationalStatus as a routine check. Anything other than Healthy / OK means resiliency is currently reduced – reconnect or replace the affected drive and repair it before a second failure turns a recoverable warning into real data loss.
Next in this series

Storage Spaces Direct extends these same pool and virtual disk concepts across the local disks of an entire failover cluster instead of shared storage – see Failover Clustering for the quorum mechanics that a clustered deployment builds on.