Es geht auch einfacher. Wenn eine Platte defekt ist, die gegen eine neue Platte ersetzen und folgends Perl-Script starten.
Getestet per ZFS Raid 10, aber ZFS Raid 1 sollte auch funktionieren.
Je nach Anbindung kann bei Pos4 ein anderer Suchbegriff eingetragen werden.
#!/usr/bin/perl
# Hole den ZPool Namen und das fehlende Laufwerk
#======================================================
$Status=`/usr/sbin/zpool status`;
$Pos1=index($Status,"CKSUM");
$Pos2=index($Status," ",Pos1+7);
$Pos3=index($Status,"REMOVED");
$Pos4=rindex($Status,"scsi",$Pos3);
$ZPool=substr($Status,$Pos1+7,$Pos2);
$AltesLaufwerk=substr($Status,$Pos4,$Pos3-$Pos4);
$ZPool=~ s/^\s+|\s+$//g; # Trim
$AltesLaufwerk=~ s/^\s+|\s+$//g; # Trim
# Suche Neue Disk
#==================
$Text1 = `/usr/bin/lsblk -o name`;
for (my $j = 97; $j < 123; $j++) { # von a bis z
$Pos1 = index($Text1, "sd" . chr($j) . "1");
if ($Pos1 == -1) {
$Disk = "sd" . chr($j);
# gibt es ein neues Laufwerk?
$Pos1 = index($Text1, $Disk);
if ($Pos1 > 0) { last; } # OK, neues Laufwerk gefunden
$Disk = "";
}
}
if ($Disk eq "") {print "Es gibt kein weiteres Laufwerk!"; exit; } # kein neúes Laufwerk gefunden
$Text1 = `/usr/bin/ls -l /dev/disk/by-id`;
$Pos1 = index($Text1, "../../" . $Disk);
$Pos2 = rindex($Text1, ":", $Pos1);
$NeuesLaufwerk = substr($Text1, $Pos2 + 4, $Pos1 - $Pos2 - 7);
$Befehl="zpool replace ". $ZPool. " ". $AltesLaufwerk . " " . $NeuesLaufwerk;
print "Soll der Befehl (".$Befehl.") ausgeführt werden? (j/n)\n";
$Zeichen=substr(<>,0,1);
if ($Zeichen eq "j")
{
$Ausgabe=`$Befehl`;
}