FreeBSD - Faulted disk im zfs pool wechseln - geht das einfach online?

bsd4me

Well-Known Member
Hi,

ich habe mal eine Frage - es geht um einen 2 HE Supermicro Server (noch mit 13.1 Version), der 8 Festplatten hat. Die Festplatten sind mittels eines mpr Conrtollers angebunden

# dmesg | grep mpr
mpr0: <Avago Technologies (LSI) SAS3008> port 0xc000-0xc0ff mem 0xfddf0000-0xfddfffff irq 44 at device 0.0 on pci1
mpr0: Firmware: 05.00.00.00, Driver: 23.00.00.00-fbsd
mpr0: IOCCapabilities: 7a85c<ScsiTaskFull,DiagTrace,SnapBuf,EEDP,TransRetry,EventReplay,MSIXIndex,HostDisc,FastPath,RDPQArray>
mpr0: Found device <881<SataDev,Direct>,End Device> <6.0Gbps> handle<0x0009> enclosureHandle<0x0001> slot 3
mpr0: At enclosure level 0 and connector name ( )
...
da0 at mpr0 bus 0 scbus0 target 0 lun 0
...

Leider ist eine Platte defekt:

# dmesg | grep mpr
...
mpr0: Sending abort to target 5 for SMID 1888
(da5:mpr0:0:5:0): WRITE(16). CDB: 8a 00 00 00 00 07 48 e5 5c 18 00 00 00 10 00 00 length 8192 SMID 1888 Aborting command 0xfffffe0114277500
(da5:mpr0:0:5:0): WRITE(16). CDB: 8a 00 00 00 00 07 5d c1 30 d8 00 00 00 10 00 00 length 8192 SMID 1940 Command timeout on target 5(0x000f), 60000 set, 60.97627519 elapsed
mpr0: At enclosure level 0, slot 5, connector name ( )
(da5:mpr0:0:5:0): SYNCHRONIZE CACHE(10). CDB: 35 00 00 00 00 00 00 00 00 00 length 0 SMID 2115 Command timeout on target 5(0x000f), 60000 set, 60.99642187 elapsed
mpr0: At enclosure level 0, slot 5, connector name ( )
mpr0: Controller reported scsi ioc terminated tgt 5 SMID 1308 loginfo 31130000
mpr0: Controller reported scsi ioc terminated tgt 5 SMID 1940 loginfo 31130000
(da5:mpr0:0:5:0): WRITE(10). CDB: 2a 00 03 40 33 98 00 00 08 00
mpr0: Controller reported scsi ioc terminated tgt 5 SMID 2115 loginfo 31130000
...

# zpool status
pool: zroot
state: DEGRADED
status: One or more devices are faulted in response to persistent errors.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Replace the faulted device, or use 'zpool clear' to mark the device
repaired.
config:

NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
gpt/rda0 ONLINE 0 0 0
gpt/rda1 ONLINE 0 0 0
gpt/rda2 ONLINE 0 0 0
gpt/rda3 ONLINE 0 0 0
gpt/rda4 ONLINE 0 0 0
gpt/rda5 FAULTED 3 0 0 too many errors
gpt/rda6 ONLINE 0 0 0
gpt/rda7 ONLINE 0 0 0

das ist nicht weiter schlimm, ich möchte aber die Platte bald ersetzen. Wäre es auch möglich im laufenden Betrieb? Ich müsste natürlich die Platte erstmal lokalisieren mit

# sesutil
sesutil: Missing command
Usage: sesutil [-u /dev/ses<N>] <command> [options]
Commands supported:
fault (<disk>|<sesid>|all) (on|off)
Change the state of the fault LED associated with a disk
...

oder? Dann müsste die Lampe am Plattenschacht blinken - ist das so? Die Platten dann auf offline stellen mit:

# zpool offline zroot gpt/rda5

Platte tauschen, obwohl der Rechner noch eingeschaltet und online ist, dann die Partitionierung kopieren - alle Platten haben die gleiche Partitionierung

# gpart backup da0 | gpart restore -F da5

Dann den "repalce" Vorgang einläuten

# zpool replace zroot /dev/da5 /dev/da4p4
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da5

Dann solle sich der Pool "resilvern" - habe ich das so korrekt dargesetllt? Ich hoffe ich habe nicht zu viel geschrieben :-)

Vielen Dank für eine Antwort!!! Und viele Grüsse, Norbert
 
oh, das ist ein typo drin ... tssss...

# zpool replace zroot /dev/da5 /dev/da5

müsste es heissen....
 
Prinzipiell ja, sofern der Controller und das BSD soweit zusammenarbeiten, dass du ohne Neustart die neue Platte korrekt initialisierst und angezeigt bekommst. Vermutlich sollte das aber klappen. Auf jedenfall auf die Nummerierung, bzw. Namen achten!
 
ich denke, ich partitioniere die neue Platte extern erstmal (in Dockingstation), fahre dann den Server runter, tausche die PLatte und dann geht es weiter...
 
Leider ist eine Platte defekt:
Bist du dir da sicher, also hast du dir mal die SMART-Werte angesehen?
Ich habe das auch schon ein paar Mal beobachtet, dass an einem LSI-Controller eine beliebige Platte wegbricht, das liegt IMHO aber am Controller.
Man kann die Platte dann mittels
Code:
zpool offline ...
gefolgt von
Code:
zpool online ...
wieder reanimieren.

Rob
 
danek - ich habe es probiert - scheint nicht zu funktionieren:

# zpool offline zroot gpt/rda5

# zpool status
pool: zroot
state: DEGRADED
status: One or more devices has experienced an unrecoverable error. An
attempt was made to correct the error. Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
using 'zpool clear' or replace the device with 'zpool replace'.
see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-9P
config:

NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
gpt/rda0 ONLINE 0 0 0
gpt/rda1 ONLINE 0 0 0
gpt/rda2 ONLINE 0 0 0
gpt/rda3 ONLINE 0 0 0
gpt/rda4 ONLINE 0 0 0
gpt/rda5 OFFLINE 3 0 0
gpt/rda6 ONLINE 0 0 0
gpt/rda7 ONLINE 0 0 0

# zpool online zroot gpt/rda5
warning: device 'gpt/rda5' onlined, but remains in faulted state
use 'zpool clear' to restore a faulted device

# zpool status
pool: zroot
state: DEGRADED
status: One or more devices are faulted in response to persistent errors.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Replace the faulted device, or use 'zpool clear' to mark the device
repaired.
config:

NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
gpt/rda0 ONLINE 0 0 0
gpt/rda1 ONLINE 0 0 0
gpt/rda2 ONLINE 0 0 0
gpt/rda3 ONLINE 0 0 0
gpt/rda4 ONLINE 0 0 0
gpt/rda5 FAULTED 6 0 0 too many errors
gpt/rda6 ONLINE 0 0 0
gpt/rda7 ONLINE 0 0 0

wo muss ich da ein zpool clear machen??
 
die smartwerte sind

ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x000f 074 064 044 Pre-fail Always - 27877776
3 Spin_Up_Time 0x0003 097 097 000 Pre-fail Always - 0
4 Start_Stop_Count 0x0032 100 100 020 Old_age Always - 3
5 Reallocated_Sector_Ct 0x0033 100 100 010 Pre-fail Always - 0
7 Seek_Error_Rate 0x000f 077 060 045 Pre-fail Always - 52476064
9 Power_On_Hours 0x0032 090 090 000 Old_age Always - 9193
10 Spin_Retry_Count 0x0013 100 100 097 Pre-fail Always - 0
12 Power_Cycle_Count 0x0032 100 100 020 Old_age Always - 3
18 Unknown_Attribute 0x000b 100 100 050 Pre-fail Always - 0
187 Reported_Uncorrect 0x0032 100 100 000 Old_age Always - 0
188 Command_Timeout 0x0032 100 100 000 Old_age Always - 0
190 Airflow_Temperature_Cel 0x0022 069 063 000 Old_age Always - 31 (Min/Max 31/37)
192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 3
193 Load_Cycle_Count 0x0032 100 100 000 Old_age Always - 352
194 Temperature_Celsius 0x0022 031 040 000 Old_age Always - 31 (0 26 0 0 0)
197 Current_Pending_Sector 0x0012 100 100 000 Old_age Always - 0
198 Offline_Uncorrectable 0x0010 100 100 000 Old_age Offline - 0
199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always - 0
200 Multi_Zone_Error_Rate 0x0023 100 100 001 Pre-fail Always - 0
240 Head_Flying_Hours 0x0000 100 253 000 Old_age Offline - 8326 (44 58 0)
241 Total_LBAs_Written 0x0000 100 253 000 Old_age Offline - 20209434735
242 Total_LBAs_Read 0x0000 100 253 000 Old_age Offline - 8916252409

ach, ich hatte auch ein zpool clear dazwischen mal versucht - der Status bleibt am Ende der gleiche...
 
Die SMART-Werte deuten in der Tat auf einen Defekt hin (Raw_Read_Error_Rate/Seek_Error_Rate).
Also musst du die Platte definitiv austauschen.

Nach einem Resilver würde ich empfehlen, die SMART-Werte der anderen Platten auch mal zu inspizieren.
Rob
 
Was mir noch auffällt - deine Maschine meldet Command Timeouts an die fragliche Platte im Log;
das könnte auch auf einen Wackler in der Verkabelung hinweisen, bzw wenn du nen HDD Cage mit Backplane verwendest auf ein Problem mit diesem; hatte ich beides schon; Logeinträge waren dann ähnlich deinem, bzw CAM Errors.
Kabel getauscht bzw Platte testweise auf anderen Slot gesteckt brachte in diesen Fällen Abhilfe.

Ist das ne Seagate-Platte?
Wegen des Werts von seek_error_rate muss man bei Seagate Platten aufpassen, da is der RAW_VALUE ganz hinten erstmal nicht ausschlaggebend, der Wert setzt sich aus den beiden Werten "Seek Errors"/"Seeks" zusammen und ist normalisiert; siehe auch hier;
bin ich auch schonmal reingefallen und dachte, die Platten hätten durchgehend hunderttausende von Seek Errors, dabei standen diese Werte auf Null bzw waren klein;
Ausschlaggebend wäre hier dann der VALUE (077 im obigen Ausdruck); das wären zwischen 1 Error pro 10 Millionen (70) bzw 100 Millionen (80) Seeks, was eigentlich ja ok wäre.

Falls das keine Seagate ist, gilt obiges natürlich nicht.
 
Danke Dir @turrican - ja es sind 18 TB Seagate Exon Platten - und das mit den hohen Datenraten hatte ich auch schon mal gehört. Die sind bei allen Platten ähnlich hoch... Verkablung könnte sein - aber das Ding läuft schon seit Jahren ohne Probleme... mmmhhhmmmm
 
Ich habe auch schon den Effekt beobachtet, dass wenn der Controller überhitzt (auch wenn es nur kurz war, Bereich 95-105°C), die Platten sehr viele rereads/rewrites bekommen und man dadurch irreführend auf eine kaputte Platte schließt.

Da die Platte im pool eh schon auf offline ist, kannst du sie auch einfach physisch rausziehen, da passiert nichts weiter (außer dass ein Platzhalter mit random number reinkommt) und wirf' die Platte nicht gleich weg, sondern tausche mal nur aus, damit du den pool wieder auf clean/online bekommst.

Bei Seagates ist es normal, dass die raw error-Werte enorm hoch sind. Es ist nicht auszuschließen, dass sie tatsächlich defekt ist, aber unter 10k Stunden Laufzeit ist das suspekt. In einem TestPC würde ich mit der Platte dann mal einen Oberflächenscan machen und dann weitersehen. smartctl -t long /dev/disk$ <- das rödelt dann zunächst mal einige Stunden, du solltest eine grobe Schätzung bekommen.
 
Bei Seagates ist es normal, dass die raw error-Werte enorm hoch sind.

Weil da in dem Wert erstmal auch die Anzahl Seeks mit drin steckt, ggf hat man "0" Fehler, aber ne Millionen-Zahl (da Seeks);

Der angezeigte Wert ist eine 48bit Zahl - die "oberen" 16 Bit sind die Anzahl der Fehler, die "unteren" 32 Bit die Anzahl der Seeks bislang;

Err.Seeks
0000.00000000
(der . dient nur zur Unterscheidung)

Mit obigem Wert (52476064) der Platte von @bsd4me ergäbe sich 0000.0320B8A0, d.h. die Platte hatte noch gar keinen Seek-Error während 0320B8A0 (52476064) Seeks - 52 Millionen Seeks liegt zwischen 10 (Value 70) und 100 (Value 80) Millionen Seeks wie oben im Log angezeigt - so meine Interpretation des ganzen.

EDIT: Err.Seeks quoted, fehlende "Millionen" ergänzt
 
kleine Anmerkung: Platte ist gewechselt, alles okay... Zpool resilvert sich... Wird etliche Stunden dauern, da ich 8 x 18 TB verbaut hatte und der pool etwa 50% voll ist... Aber jetzt bin ich wieder um eine Erfahrung reicher :-) VG Norbert
 
würde mich interessieren, was die Platte wirklich hat - laut smart Werten wäre sie eigentlich gut in Schuss; nur knapp 10TB gelaufen, und nur 3x überhaupt eingeschalten
 
Ich denke, dass wird erstmal offen bleiben - ich habe die Zeit nicht genauer hinzusehen - denn es warten noch andere Aufgaben... VG Norbert
 
Zurück
Oben