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.