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.
A collection of physical disks grouped together so their capacity can be allocated as a single resource.
Space carved from a pool with a chosen resiliency type – what Windows shows the OS as a regular disk.
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) |
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.
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
-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 / OK | Fully redundant, no action needed. |
| Warning / Incomplete | Reduced resilience from a missing or failed drive, but remaining copies are up to date. Reconnect or replace the drive, then run Repair-VirtualDisk. |
| Warning / Degraded | Same 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 redundancy | Too many drives failed – data has already been lost. Replace drives and restore from backup. |
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.
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.
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.
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.