[Storage Pool] Reparatur-Skript für eine Virtual-Disk mit Parity
Gepostet am: Apr 29, 2014 9:49:29 PM
Nachdem ich in einer virtuellen Umgebung mehrere Ausfallszenarien durchgespielt habe, habe ich ein Reparaturskript gebastelt, das die Festplatten mit Warning entfernt und stattdessen die ersetzten Festplatte einbindet und die Virtualdisk wiederherstellt.
replace-damaged-disk.ps1
#Parameter$virtualDiskname = "Fileserver"$myStoragePoolName = "My Storage Pool"write-host "aktueller Status der virtuellen Disk $virtualDiskname"$myvirtDisk = Get-VirtualDisk -FriendlyName $virtualDiskname$myvirtDiskOpStatus = $myvirtDisk.OperationalStatus write-host "VirtualDisk $virtualDiskname hat den OperationalStatus: $myvirtDiskOpStatus"if ($myvirtDiskOpStatus -eq "Detached") { write-host "Attache VirtualDisk $virtualDiskname" Set-VirtualDisk -FriendlyName $virtualDiskname -IsManualAttach $False do { Start-Sleep -Seconds 100 } while ( (Get-VirtualDisk -FriendlyName $virtualDiskname).OperationalStatus -eq "Detached") } $myvirtDisk = Get-VirtualDisk -FriendlyName $virtualDiskname$myvirtDiskStatus = $myvirtDisk.HealthStatus write-host "Status der virtuellen Disk '$virtualDiskname': $myvirtDiskStatus" -ForegroundColor Red -BackgroundColor Blackif ($myvirtDiskStatus -eq "Healthy") { write-host "Kontrollausgabe" Get-VirtualDisk -FriendlyName $virtualDiskname | Get-PhysicalDisk | Select FriendlyName,OperationalStatus,HealthStatus,@{L='Capacity';E={"{0:N2}GB" -f ($_.Size/1GB)}},@{L='Free Space';E={"{0:N2}GB" -f (($_.Size-$_.AllocatedSize)/1GB)}} | Sort 'Free Space' | ft Get-PhysicalDisk -HealthStatus Healthy -Usage Retired -ErrorAction SilentlyContinue | Set-PhysicalDisk -Usage AutoSelect -ErrorAction SilentlyContinue } else { Get-VirtualDisk -FriendlyName $virtualDiskname | Get-PhysicalDisk | Select FriendlyName,OperationalStatus,HealthStatus,@{L='Capacity';E={"{0:N2}GB" -f ($_.Size/1GB)}},@{L='Free Space';E={"{0:N2}GB" -f (($_.Size-$_.AllocatedSize)/1GB)}} | Sort 'Free Space' | ft write-host "kaputte Festplatte" -ForegroundColor black -BackgroundColor white $measuresfaileddisk = get-physicaldisk -HealthStatus Warning -ErrorAction SilentlyContinue | measure-object $countfaileddisk = $measuresfaileddisk.Count write-host "Anzahl: $countfaileddisk" if ($countfaileddisk -eq 0) { write-host "keine kaputte Festplatte!" -ForegroundColor red } else { $faileddisk = get-physicaldisk -HealthStatus Warning $faileddiskname = $faileddisk.FriendlyName write-host "Kaputte Festplatte: $faileddiskname" -ForegroundColor Red -BackgroundColor Yellow write-host "die kaputte Festplatte wird auf Retired gesetzt" $faileddisk | set-physicaldisk -Usage Retired write-host "Kontrolle des Status der virtuellen Disk $virtualDiskname" Get-VirtualDisk -FriendlyName $virtualDiskname | Get-PhysicalDisk write-host "Ausgabe der kaputten Festplatten" get-physicaldisk -HealthStatus Warning -ErrorAction SilentlyContinue $measurePoolDisk = Get-PhysicalDisk -CanPool $true -ErrorAction SilentlyContinue | Measure-Object $countPoolDisk = $measurePoolDisk.Count if ($countPoolDisk -eq 0) { Write-Host "Es kann keine Festplatte gefunden werden, die zum StoragePool hinzugefügt werden kann" write-host "Bitte fügen Sie eine Festplatte der Größe der kaputten Festplatte hinzu" -ForegroundColor Red $faileddisk | ft @{L='Capacity';E={"{0:N2}GB" -f ($_.Size/1GB)}} Write-Host "aktuelle Festplatten:" Get-PhysicalDisk | ft FriendlyName,OperationalStatus,HealthStatus,CanPool Write-host "WARNUNG - !!! - Der Rechner wird zum Schutz heruntergefahren - !!! - WARNUNG" Start-Sleep -Seconds 100 Stop-Computer -ComputerName localhost -Force } else { write-host "Hinzufügen der ersetzten Festplatte" -ForegroundColor Red -BackgroundColor Yellow get-physicaldisk -CanPool $true | ft FriendlyName,OperationalStatus,HealthStatus $PDToAdd = Get-PhysicalDisk -CanPool $true Add-PhysicalDisk -PhysicalDisks $PDToAdd -StoragePoolFriendlyName $myStoragePoolName get-storagepool -FriendlyName $myStoragePoolName | Get-PhysicalDisk Write-host "Reparieren der virtuellen Disk $virtualDiskname" Repair-VirtualDisk $virtualDiskname do { Start-Sleep -Seconds 100 Write-host "Kontrolle des Reparatur-Status" get-virtualdisk -FriendlyName $virtualDiskname | ft } until ( (Get-VirtualDisk -FriendlyName $virtualDiskname).HealthStatus -eq "Healthy") write-host "Entferenen der kaputten Festplatten" $faileddisk = get-physicaldisk -Usage Retired remove-physicaldisk -PhysicalDisks $faileddisk -StoragePoolFriendlyName $myStoragePoolName write-host "Kontrolle, ob Festplatte entfernt wurde" get-physicaldisk | ft Friendlyname,OperationalStatus,HealthStatus,Usage } } }