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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 | |
} | |
} | |
} |