[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         }     } }