Unrecoverable Read Error

Unrecoverable Read Error alebo tiež neopraviteľná chyba čítania je nočnou morou každého systémového administrátora. Ak ste o tejto chybe doteraz nepočuli alebo s ňou neprišli do kontaktu, môžete byť len a len radi. Vaše disky vám zrejme dobre slúžia. Nám sa ale táto chyba prihodila a tak sme si povedali, že si o nej čo-to naštudujeme, aby sme boli do budúcnosti lepšie vyzbrojení poznatkami a skúsenosťami.

Uvedený príklad v tomto článku je z reálneho života, ale nie z produkčného servera (naštastie). Ide o softvérový RAID mdadm, ktorý používame na niektorých serveroch a ktorý nam dobre slúži. V prípade hardvérového RAIDu môže byť riešenie zložitejšie (alebo aj jednoduchšie). Záleží od tohto, aké možnosti daný radič a jeho manažovací softvér poskytuje.

Najskôr si povedzme v skratke čo to vlastne URE (Unrecoverable Read Error) je. Je to taká chyba čítania, ktorá sa nedá opraviť. Inými slovami dané miesto na disku, daný sektor, je tak vážne poškodený, že disk nevie dodať z tohto sektora dáta. A to ani po viacnásobných pokusoch čítania. Chyby čítania z disku nie sú vôbec výnimočné, dejú sa pomerne často. Väčšinou sa vyriešia opakovaným čítaním z disku; ak je opakované čitanie neúspešne (vtedy vzniká URE), v prípade RAIDu je ešte vždy možné prečítať identickú kópiu sektora z iného disku. Záznam o tomto sa vždu uloží do dmesg a je vhodné ho sledovať (z pochopiteľných dôvodov).

Problém nastáva vtedy, keď túto kópiu nemáme. Napríklad z toho dôvodu, že RAID je degradovaný a práve sa synchronizuje. To značí veľký prúser. Ako taký URE vyzerá:

[96448.607012] ata6.00: configured for UDMA/133
[96448.607069] ata6: EH complete
[96450.343122] ata6.00: exception Emask 0x0 SAct 0xffff SErr 0x0 action 0x0
[96450.343155] ata6.00: irq_stat 0x40000008
[96450.343183] ata6.00: failed command: READ FPDMA QUEUED
[96450.343217] ata6.00: cmd 60/00:58:c1:8d:a1/01:00:12:00:00/40 tag 11 ncq 131072 in
[96450.343219]          res 41/40:00:ad:8e:a1/00:00:12:00:00/40 Emask 0x409 (media error) 
[96450.343310] ata6.00: status: { DRDY ERR }
[96450.343336] ata6.00: error: { UNC }
[96450.357116] ata6.00: configured for UDMA/133
[96450.357188] sd 5:0:0:0: [sdd] Unhandled sense code
[96450.357191] sd 5:0:0:0: [sdd] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[96450.357197] sd 5:0:0:0: [sdd] Sense Key : Medium Error [current] [descriptor]
[96450.357204] Descriptor sense data with sense descriptors (in hex):
[96450.357207]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00
[96450.357221]         12 a1 8e ad
[96450.357227] sd 5:0:0:0: [sdd] Add. Sense: Unrecovered read error - auto reallocate failed
[96450.357235] sd 5:0:0:0: [sdd] CDB: Read(10): 28 00 12 a1 8d c1 00 01 00 00
[96450.357258] end_request: I/O error, dev sdd, sector 312577709
[96450.357288] raid10: Disk failure on sdd3, disabling device.
[96450.357289] raid10: Operation continuing on 2 devices.
[96450.357358] ata6: EH complete
[96450.357853] md: md127: recovery done.
[96450.780112] raid10: Disk failure on sda3, disabling device.
[96450.780114] raid10: Operation continuing on 2 devices.

V našom prípade sa vykonávala synchronizácia z /dev/sdd na /dev/sda a na /dev/sdd sa vyskytol URE. Sektor 312577709 je chybný a bohužiaľ aj neopraviteľný.

# hdparm --read-sector 312577709 /dev/sdd

/dev/sdd:
reading sector 312577709: FAILED: Input/output error

Ak ale vieme, že je chybných len pár sektorov a oželieme data z týchto sektorov, potom môžeme tieto sektory preskočiť. mdadm samozrejme nemá taký prepínač, ktorým by sa dali tieto sektory preskočiť. My ich môžeme ale prealokovať na iné miesto. Dáta z tohto sektoru budú nenávratne stratené, ale to sú vlastne už teraz.

Realokáciu vykonáme priamym zápisom do chybného sektora. Moderný pevný disk zistí, že zapisuje na vadný sektor a vykoná realokáciu za nás.

# hdparm --write-sector 312577709 /dev/sdd

/dev/sdd:
Use of --write-sector is VERY DANGEROUS.
You are trying to deliberately overwrite a low-level sector on the media.
This is a BAD idea, and can easily result in total data loss.
Please supply the --yes-i-know-what-i-am-doing flag if you really want this.
Program aborted.

# hdparm --yes-i-know-what-i-am-doing --write-sector 312577709 /dev/sdd

/dev/sdd:
re-writing sector 312577709: succeeded

Bolo to teda naozaj realokované?
Overme si to:

# hdparm --read-sector 312577709 /dev/sdd

/dev/sdd:
reading sector 312577709: succeeded
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000

Potom nám už stačí iba naštartovať zosypaný RAID. Samozrejme pri uvedenej sychronizácii zlyhal /dev/sdd, takže RAID oficiálne naštartovať nepôjde, ale keď mu “trošku” pomôžeme…

# mdadm --assemble --force /dev/md127 /dev/sdb3 /dev/sdc3 /dev/sdd3
mdadm: forcing event count in /dev/sdd3(2) from 364440 upto 364448
mdadm: clearing FAULTY flag for device 2 in /dev/md127 for /dev/sdd3
mdadm: /dev/md127 has been started with 3 drives (out of 4).

Ak nám synchronizácie opäť spadne, je nutné daný postup opakovať pre ďalší sektor. Samozrejme, čím viac sektorov, tým vyššia strata dát a tým aj vyššie riziko poškodeného súborového systému (corrupted filesystem). V našom prípade bolo nutné uvedený postup opakovať pre štyri sektory idúce za sebou 312577709 až 312577712.

Na záver nemusím snaď zdôrazňovať, že po úspešnej synchroizácii RAIDu je nutné skontrolovať a opraviť súborové systémy.