Storage Spaces & ReFS Resilient Volume Provisioning
Windows Server Storage Spaces can pool supported disks and provide mirror or parity resiliency. ReFS can detect file-data corruption when integrity streams are enabled; it can repair corruption only when a resilient mirror or parity space has a good alternate copy. These features do not replace a separate, tested backup. Integrity streams can also affect performance, so select the protected data and validate the workload.
Storage Spaces Resilience Profiles
| Resilience Mode | Minimum Disks | Tolerance | Description & Recommendation |
|---|---|---|---|
| Simple (Stripe) | 1 | 0 failures | High throughput, zero fault tolerance. Best for temp workloads. |
| Two-Way Mirror | 2 | 1 disk failure | Writes two copies and can tolerate one disk failure. Confirm application and hardware support before using it for latency-sensitive workloads. |
| Three-Way Mirror | 5 | 2 disk failures | Writes 3 copies of data. Maximum uptime for cluster shared volumes. |
| Parity | 3 | 1 disk failure | High capacity efficiency. High compute overhead during random writes. |
Step 1: Discover Physical Disks and Create a Storage Pool
Discover Disks and Pool Storage
Storage PoolInspect unallocated physical disks capable of pooling and aggregate them into a centralized Storage Pool using PowerShell:
# Inventory eligible disks. Confirm identity and capacity before selecting any.Get-PhysicalDisk -CanPool $True | Select-Object FriendlyName, SerialNumber, UniqueId, DeviceId, MediaType, OperationalStatus, HealthStatus, Size, CannotPoolReason# Replace these examples with the UniqueId values of the dedicated disks# you reviewed in the inventory tab. Do not select every eligible disk by default.$SelectedUniqueIds = @( '<unique-id-of-first-dedicated-disk>' '<unique-id-of-second-dedicated-disk>')$Candidates = Get-PhysicalDisk -CanPool $True$Disks = @($Candidates | Where-Object { $SelectedUniqueIds -contains $_.UniqueId })if ($Disks.Count -ne $SelectedUniqueIds.Count) { throw 'One or more selected disks were not found as eligible pool disks.'}
$Disks | Format-Table FriendlyName, SerialNumber, UniqueId, Sizeif ((Read-Host 'Type POOL only after confirming these dedicated disks') -cne 'POOL') { throw 'Pool creation cancelled.'}
# Provision the storage pool using only the confirmed disksNew-StoragePool -FriendlyName "ProductionPool" ` -StorageSubsystemFriendlyName "Windows Storage*" ` -PhysicalDisks $DisksStep 2: Create a Mirrored Virtual Disk
Provision Resilient Virtual Disk
Virtual DiskCreate a two-way mirror and choose an explicit size that fits the pool’s usable mirrored capacity. Leave free capacity for future growth and repair operations. A mirror tolerates a disk failure within its layout; it does not protect against deletion, malware, or loss of the whole server.
# Set this to a size below the pool's usable mirrored capacity.$VirtualDiskSize = 1TB
New-VirtualDisk -StoragePoolFriendlyName "ProductionPool" ` -FriendlyName "DataMirror_VD" ` -ResiliencySettingName "Mirror" ` -NumberOfDataCopies 2 ` -Size $VirtualDiskSizeGet-VirtualDisk -FriendlyName "DataMirror_VD" | Select-Object FriendlyName, HealthStatus, OperationalStatus, SizeStep 3: Format with ReFS & Enable Integrity Streams
Initialize, Format ReFS & Protect Data
ReFS IntegrityInitialize the new virtual disk with GPT, check that the example drive letter is unused, and format the new volume as ReFS. Formatting is destructive to the selected volume. Integrity streams are optional and can add I/O cost; enable them on data directories where the integrity benefit is appropriate.
# Confirm S: is not already assigned before using it.if (Get-Volume -DriveLetter S -ErrorAction SilentlyContinue) { throw 'Drive letter S: is already in use. Choose an unused letter.'}
# Initialize the newly created virtual disk and create a partition$Disk = Get-VirtualDisk -FriendlyName "DataMirror_VD" | Get-Disk$Disk | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -DriveLetter "S" -UseMaximumSize
# Review the selected disk and partition, then explicitly confirm the format.Get-Disk -Number $Disk.Number | Select-Object Number, FriendlyName, SerialNumber, UniqueId, OperationalStatusGet-Partition -DriveLetter S | Select-Object DriveLetter, DiskNumber, Type, Sizeif ((Read-Host 'Type FORMAT only after confirming this is the new empty volume') -cne 'FORMAT') { throw 'Volume formatting cancelled.'}Format-Volume -DriveLetter "S" -FileSystem ReFS -NewFileSystemLabel "EnterpriseData"# Enable integrity streams on the data directory. Child files inherit this setting.New-Item -ItemType Directory -Path 'S:\Data' -ForceSet-FileIntegrity -FileName 'S:\Data' -Enable $True
# Verify the directory settingGet-FileIntegrity -FileName 'S:\Data'
Figure 1: The two-way mirror is healthy, the S: volume is formatted as ReFS, and integrity streams are enabled.