When dealing with Storage Spaces in Windows Server 2012/2012 R2, one critical question arises: what happens when the host server fails? Unlike traditional RAID solutions, Storage Spaces configuration metadata is stored both in the Windows registry and on the physical disks themselves. This dual storage mechanism enables potential migration scenarios.
The migration process relies on the Storage Spaces metadata stored on each physical disk. Each disk contains:
- 4MB metadata region at the start of the disk
- Pool configuration information
- Virtual disk layout information
Here's how to properly move Storage Spaces drives to a replacement server:
# First, verify the original storage pool configuration (on old server if possible)
Get-StoragePool | fl FriendlyName,HealthStatus,OperationalStatus
Get-VirtualDisk | fl FriendlyName,Size,OperationalStatus
After physical drive migration to new server:
# On the new server, import the storage pool
Import-StoragePool -PhysicalDisks (Get-PhysicalDisk -CanPool $true) -FriendlyName "RecoveredPool"
# Verify virtual disk visibility
Get-VirtualDisk | fl FriendlyName,Size,OperationalStatus
# If virtual disks aren't visible automatically:
Get-StoragePool "RecoveredPool" | Get-VirtualDisk | Show-VirtualDisk
Several factors affect migration success:
- Driver compatibility: Replacement server should use similar storage controllers
- Metadata version: Windows Server version should match or be newer
- Physical disk order: While not strictly required, maintaining original order helps
If the import fails, try these diagnostic commands:
# Check for foreign disks
Get-PhysicalDisk | Where-Object {$_.CannotPoolReason -eq "InsufficientCapacity"} |
Select-Object FriendlyName,SerialNumber
# Force import if needed
$disks = Get-PhysicalDisk -CanPool $false |
Where-Object {$_.CannotPoolReason -eq "InsufficientCapacity"}
Import-StoragePool -PhysicalDisks $disks -Force
In a recent data center migration, we successfully moved a 12-drive Storage Spaces configuration from a failed Dell R720 to a new HPE DL380:
- Powered down original server (gracefully if possible)
- Transferred all drives maintaining physical order
- Installed drives in new server with similar HBA configuration
- Ran import commands shown above
- Verified all 4 virtual disks (total 40TB) were accessible
After migration, monitor performance as controller differences may affect:
- Read/write throughput
- Latency characteristics
- Cache behavior
Use Get-StorageJob
and Measure-Volume
to establish new baselines.
When dealing with Windows Server 2012 Storage Spaces, the good news is that the storage configuration metadata is actually stored on the physical drives themselves. This means you can absolutely move drives to a replacement server without needing to restore from backup - similar to Linux software RAID implementations.
Here's the exact procedure I've successfully used multiple times in production environments:
- Shut down the original server properly (don't just pull the plug)
- Physically move all drives to the new server
- Boot the new server with Windows Server 2012 or later installed
- Open PowerShell and run:
# List available disks that might contain Storage Spaces
Get-PhysicalDisk | Where-Object {$_.CanPool -eq $false} | Format-Table FriendlyName,SerialNumber,Size,HealthStatus,OperationalStatus
# Import the storage pool (automatic detection usually works)
Get-StoragePool -IsPrimordial $false | Enable-StoragePool
# Verify virtual disks are accessible
Get-VirtualDisk | Get-Disk | Get-Partition | Get-Volume
- Drive Order Doesn't Matter: Unlike some RAID implementations, Storage Spaces doesn't care about the physical slot order
- Windows Version Compatibility: The target server must be running the same or newer version of Windows Server
- Full Set Required: You must move all drives that were part of the storage space
For cases where automatic detection fails, you can manually reconstruct the storage space using the Repair-VirtualDisk
cmdlet. Here's an example from a real troubleshooting session:
# First identify the missing pool
$disks = Get-PhysicalDisk | Where-Object { $_.FriendlyName -like "*YourDriveModel*" }
$pool = Get-StoragePool -FriendlyName "MyPool" -ErrorAction SilentlyContinue
# If pool not found automatically
if (-not $pool) {
$pool = New-StoragePool -FriendlyName "RecoveredPool"
-StorageSubsystemFriendlyName "Windows Storage*"
-PhysicalDisks $disks
-Verbose
Repair-VirtualDisk -FriendlyName "RecoveredData"
}
After migration, you might want to verify the storage performance. This PowerShell snippet tests the read performance:
$testFile = "C:\StorageTest.dat"
$result = Measure-Command {
1..100 | ForEach-Object {
$null = New-Item -Path $testFile -ItemType File -Force
Remove-Item -Path $testFile -Force
}
}
Write-Host "Storage latency: $($result.TotalMilliseconds / 100) ms per operation"
Remember that Storage Spaces maintains write-back cache configuration in the registry, so you may need to reconfigure optimal cache settings on the new server.