How to Migrate Storage Spaces Drives to a Replacement Server Without Data Loss


2 views

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:

  1. Powered down original server (gracefully if possible)
  2. Transferred all drives maintaining physical order
  3. Installed drives in new server with similar HBA configuration
  4. Ran import commands shown above
  5. 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:

  1. Shut down the original server properly (don't just pull the plug)
  2. Physically move all drives to the new server
  3. Boot the new server with Windows Server 2012 or later installed
  4. 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.