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.

In diesem Skript:

  • Der Status einer bestimmten virtuellen Festplatte wird überprüft.
  • Wenn die Festplatte “Detached” ist, wird sie automatisch wieder angehängt.
  • Der Gesundheitsstatus der virtuellen Festplatte wird überprüft. Wenn er nicht “Healthy” ist, wird nach defekten Festplatten gesucht und entsprechende Maßnahmen werden ergriffen.
  • Wenn eine defekte Festplatte gefunden wird, wird versucht, diese zu ersetzen und die virtuelle Festplatte zu reparieren.
  • Wenn keine Ersatzfestplatte verfügbar ist, wird eine Warnung ausgegeben und der Computer heruntergefahren, um Datenverlust zu vermeiden.
# Parameterdefinition
$virtualDiskname = "Fileserver"
$myStoragePoolName = "My Storage Pool"
# Überprüft den aktuellen Status der virtuellen Disk
write-host "aktueller Status der virtuellen Disk $virtualDiskname"
$myvirtDisk = Get-VirtualDisk -FriendlyName $virtualDiskname
$myvirtDiskOpStatus = $myvirtDisk.OperationalStatus
write-host "VirtualDisk $virtualDiskname hat den OperationalStatus: $myvirtDiskOpStatus"
# Wenn die virtuelle Disk "Detached" ist, wird sie wieder angehängt
if ($myvirtDiskOpStatus -eq "Detached") {
write-host "Attache VirtualDisk $virtualDiskname"
Set-VirtualDisk -FriendlyName $virtualDiskname -IsManualAttach $False
# Wartet, bis die Disk nicht mehr "Detached" ist
do {
Start-Sleep -Seconds 100
} while ( (Get-VirtualDisk -FriendlyName $virtualDiskname).OperationalStatus -eq "Detached")
}
# Überprüft den Gesundheitsstatus der virtuellen Disk
$myvirtDisk = Get-VirtualDisk -FriendlyName $virtualDiskname
$myvirtDiskStatus = $myvirtDisk.HealthStatus
write-host "Status der virtuellen Disk '$virtualDiskname': $myvirtDiskStatus" -ForegroundColor Red -BackgroundColor Black
# Wenn die virtuelle Disk "Healthy" ist, werden Informationen angezeigt
if ($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 {
# Wenn die virtuelle Disk nicht "Healthy" ist, werden weitere Informationen angezeigt
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"
# Überprüft, ob es kaputte Festplatten gibt
if ($countfaileddisk -eq 0) {
write-host "keine kaputte Festplatte!" -ForegroundColor red
} else {
# Behandlung kaputter Festplatten
$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
# Überprüft, ob eine Ersatzfestplatte verfügbar ist
$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 {
# Fügt die Ersatzfestplatte hinzu und repariert die virtuelle Disk
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")
# Entfernt die kaputten Festplatten
write-host "Entfernen 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
}
}
}