How to Set Up Windows Server 2016 Storage Spaces
Storage Spaces is a Windows Server 2016 feature that allows you to group physical drives into storage pools and create virtual disks with resilience options such as mirroring and parity. It is an excellent solution for software-defined storage, providing fault tolerance, flexible capacity management, and tiered storage without requiring expensive hardware RAID controllers.
Key Concepts
- Storage Pool: A collection of physical disks aggregated into a single capacity pool.
- Virtual Disk (Storage Space): A logical disk created from the pool with a defined resiliency layout.
- Resiliency Types: Simple (no redundancy), Mirror (2-way or 3-way), Parity (similar to RAID 5/6).
- Storage Tiers: Automatically moves hot data to SSDs and cold data to HDDs.
Step 1: Identify Available Physical Disks
Get-PhysicalDisk | Where-Object {$_.CanPool -eq $true} | Select-Object FriendlyName, Size, MediaType, BusType
Only disks not currently used for OS or other purposes will show CanPool as True.
Step 2: Create a Storage Pool
$disks = Get-PhysicalDisk -CanPool $true
New-StoragePool -FriendlyName "DataPool" -StorageSubSystemFriendlyName (Get-StorageSubSystem).FriendlyName -PhysicalDisks $disks
Verify the pool was created:
Get-StoragePool -FriendlyName "DataPool" | Select-Object FriendlyName, Size, AllocatedSize, HealthStatus
Step 3: Create a Mirror Virtual Disk
A 2-way mirror survives one disk failure; a 3-way mirror survives two:
New-VirtualDisk -StoragePoolFriendlyName "DataPool" `
-FriendlyName "MirrorDisk" `
-Size 500GB `
-ResiliencySettingName Mirror `
-NumberOfDataCopies 2 `
-ProvisioningType Fixed
For a thin-provisioned (dynamically expanding) virtual disk:
New-VirtualDisk -StoragePoolFriendlyName "DataPool" `
-FriendlyName "ThinMirror" `
-Size 2TB `
-ResiliencySettingName Mirror `
-ProvisioningType Thin
Step 4: Create a Parity Virtual Disk
Parity provides better storage efficiency than mirroring but lower performance. Requires at least 3 disks:
New-VirtualDisk -StoragePoolFriendlyName "DataPool" `
-FriendlyName "ParityDisk" `
-Size 1TB `
-ResiliencySettingName Parity `
-ProvisioningType Fixed
Step 5: Initialize, Partition, and Format the Virtual Disk
$vdisk = Get-VirtualDisk -FriendlyName "MirrorDisk" | Get-Disk
Initialize-Disk -Number $vdisk.Number -PartitionStyle GPT
New-Partition -DiskNumber $vdisk.Number -UseMaximumSize -AssignDriveLetter | Format-Volume -FileSystem NTFS -NewFileSystemLabel "MirrorVol" -AllocationUnitSize 65536 -Confirm:$false
Step 6: Configure Storage Tiers
Storage tiers automatically move frequently accessed data to faster SSD storage. First, define tier media types:
New-StorageTier -StoragePoolFriendlyName "DataPool" -FriendlyName "SSDTier" -MediaType SSD -ResiliencySettingName Mirror
New-StorageTier -StoragePoolFriendlyName "DataPool" -FriendlyName "HDDTier" -MediaType HDD -ResiliencySettingName Mirror
Create a tiered virtual disk:
New-VirtualDisk -StoragePoolFriendlyName "DataPool" `
-FriendlyName "TieredDisk" `
-StorageTiers (Get-StorageTier "SSDTier"), (Get-StorageTier "HDDTier") `
-StorageTierSizes 100GB, 900GB `
-ResiliencySettingName Mirror
Step 7: Add a Hot Spare Disk
A hot spare is automatically used when a disk fails:
$spareDisk = Get-PhysicalDisk | Where-Object {$_.FriendlyName -eq "PhysicalDisk7"}
Add-PhysicalDisk -StoragePoolFriendlyName "DataPool" -PhysicalDisks $spareDisk -Usage HotSpare
Step 8: Monitor Storage Health
Get-StoragePool -FriendlyName "DataPool" | Select-Object HealthStatus, OperationalStatus
Get-VirtualDisk | Select-Object FriendlyName, HealthStatus, OperationalStatus, DetachedReason
Get-PhysicalDisk | Select-Object FriendlyName, HealthStatus, OperationalStatus, Usage
Step 9: Repair a Degraded Storage Space
After replacing a failed disk, add it to the pool and repair:
$newDisk = Get-PhysicalDisk -CanPool $true | Select-Object -First 1
Add-PhysicalDisk -StoragePoolFriendlyName "DataPool" -PhysicalDisks $newDisk
Repair-VirtualDisk -FriendlyName "MirrorDisk"
Step 10: Expand a Virtual Disk Online
Storage Spaces supports online expansion. To grow a virtual disk without downtime:
Resize-VirtualDisk -FriendlyName "MirrorDisk" -Size 750GB
After resizing, extend the partition to use the new space:
$partition = Get-Partition -DriveLetter E
Resize-Partition -DriveLetter E -Size (Get-PartitionSupportedSize -DriveLetter E).SizeMax
Summary
Storage Spaces in Windows Server 2016 delivers software-defined storage with mirror and parity resiliency options, storage tiering, and thin provisioning. It is a cost-effective alternative to hardware RAID controllers and integrates tightly with Windows management tools. For clustered environments, Storage Spaces Direct (S2D) extends these capabilities across multiple servers without shared storage hardware.