Používání starých a nemocných disků

Máte-li na starosti více serverů, začne se vám postupně v šuplíku hromadit množství různých téměř použitelných disků, které jsou pro použití v serveru nespolehlivé, ale je vám líto je vyhodit. Co s nimi? Pokud najdete a opravíte špatné sektory, případně se špatným oblastem na disku vyhnete, můžete takový disk používat pro méně náročné účely ještě dlouhá léta.

19.5.2012 00:00 | Petr Bravenec | přečteno 12983×

V praxi se správce linuxových serverů potkává s množstvím různých disků. Většinu svého života disky spořádaně otáčejí plotnami a kmitají hlavičkami sem a tam, ale v životě velké části disků se časem začnou projevovat různé závady.

Tragedií pro data je situace, kdy disk přestane fungovat zcela bez varování - nemáte-li zálohu či diskové pole, jsou vaše data, lidově řečeno, v loji. Na druhou stranu nemusíte mít žádné pochybnosti - data jsou pryč, disk nefunguje a jakékoliv snahy o jeho další využití jsou marné. Máte-li disk v diskovém poli, jednoduše disk vyměníte za nový a vadný disk odešlete na reklamaci, nebo do šrotu.

Jiná je situace, kdy se obvykle po letech spolehlivého fungování začnou na disku hromadit vadné sektory a disk začne zapomínat. V praxi je taková závada často nepříjemnější, než náhlá disková smrt. Disk totiž občas funguje dobře, občas zdržuje při čtení, občas zapomene nějaká data - přestává být na něj spolehnutí. Vyskytne-li se vám takový disk v diskovém poli, může být situace ještě horší, pokud druhý disk umře nebo z pole vypadne. K diskovému poli s jedním "téměř" dobrým diskem totiž další disk nepřipojíte, synchronizace vždy havaruje. A to i v případě, že disk jinak slouží docela dobře, protože nečitelné sektory mohou být na místech, která se nepoužívají (v praxi to nevadí), ale synchronizovat se musí celý disk se všemi daty (i s těmi vadnými). Potom nezbývá jiná možnost, než vytvořit diskové pole nové, překopírovat na ně data z vadného disku (dobře poslouží rsync) a staré diskové pole zrušit.

Máte-li na starosti více serverů, začne se vám postupně v šuplíku hromadit množství různých téměř použitelných disků, které už na reklamaci neodešlete (příliš staré), pro použití v serveru jsou disky příliš nespolehlivé, ale je vám líto je vyhodit. Co s nimi?

I když už není takový disk způsobilý fungovat v serveru, může být docela dobře použitelný například na skladování různé kapesníčkové filmové produkce. Před použitím takového disku jej však musíme náležitě připravit. Prosté "zformátování" disku nestačí, protože operací, která má nejblíže k tomu, co si obvykle lidé představují pod pojmem "zformátování disku", je v linuxu vytvoření souborového systému (příkaz mkfs) a při této operaci se pouze sem tam něco zapíše na disk, žádné testování se nekoná.

Dnešní diskové samoopravné mechanismy fungují v principu takto: Při havarovaném pokusu o čtení se sektor označí jako vadný (kandidát na přesun - pending sector) a při pokusu o zápis se sektor přestěhuje do náhradní oblasti. Původní sektor se označí jako vadný a nadále se nepoužívá. V ideálním případě tak operační systém nepozná, že je s diskem něco v nepořádku.

Informace o vadných sektorech získáte příkazem smartctl:

smartctl -a /dev/sdx

Z množství vypsaných informací by vás měly zajímat především tyto řádky:

  5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       -       0
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0

U některých disků se informace o realokovaných sektorech nevypisuje (je zde vždy nula). U takových disků pak hledejte následující řádek:

196 Reallocated_Event_Count 0x0032   099   099   000    Old_age   Always       -       61

Počet realokovaných sektorů se vypisuje v posledním sloupci.

Varování: techniky popisované v následujícím textu vedou k neobnovitelné ztrátě dat.

Chcete-li i nadále používat starší disk s vadnými sektory, potřebujete takový disk donutit, aby vadné sektory přesunul do náhradní oblasti. Nejjednodušším a nejrychlejším způsobem, jak k tomu takový disk přinutit, je přepsat celý disk. Tím se vyvolá proces realokace vadných sektorů na celém disku. Nejsnáze lze využít příkaz dd:

dd if=/dev/zero of=/dev/sdx bs=1024K

Příkaz kopíruje ze zařízení /dev/zero na disk /dev/sdx nuly. Parametry if a of udávají vstupní (if) a výstupní (of) zařízení, parametr bs pak udává velikost jednoho kopírovaného bloku. Větší hodnota (1024K) obvykle vede k rychlejšímu kopírování.

Tato operace vždy skončí chybou - pokud je touto chybou nedostatek místa na disku, je vše v pořádku. Pokud se vyskytne jiná chyba, je obvykle něco špatně a disk je nejspíš v mnohem horším stavu, než aby šel nadále používat.

Přepis celého disku vede ke dvěma výsledkům:

Časově náročnějším způsobem, jak docílit téhož, je příkaz badblocks:

badblocks -v -w -o seznam-spatnych-sektoru /dev/sdx

Klíčovým parametrem je -w, který říká, že se má na každý sektor disku zapsat, přečíst a porovat postupně několik různých vzorů (binárně: 10101010, 01010101, 11111111, 00000000). Parametr -v způsobí výpis různých informací o chybách na obrazovku, -o pak uloží data o vadných sektorech do souboru. Data o vadných sektorech lze později využít při vytváření souborového systému, ale ve skutečnosti jde spíše o teoretickou možnost, disk vadné sektory pravděpodobně spíše přealokuje, takže příkaz badblock i na disku s mnoha špatnými sektory nenajde žádnou závadu (příkaz badblocks vznikal v době, kdy si disky o realokaci vadných sektorů mohly nechat pouze zdát).

Příkaz badblocks funguje na disk jako několikanásobný kobercový nálet, z dat na disku nezůstane kámen na kameni. Šance, že by se z takto ošetřeného disku podařilo dostat ještě někdy nějaká data, ja prakticky nulová. Ve srovnání s jednoduchým příkazem dd je však tato operace mnohonásobně delší - u 1TB se připravte na několikadenní nepřetržité testování.

Pro úplnost ještě uvedu, že seznam vadných sektorů lze použít později při vytváření souborového systému:

mkfs -t ext4 -l seznam-spatnych-sektoru /dev/sdx

Testování disku lze vyvolat i při vytváření souborového systému (parametr -c provádí pouze čtení, parametr -cc provádí i pomalejší test zápisem na disk):

mkfs -t ext4 -cc /dev/sdx

Po přepsání disku můžete disk otestovat, nejjednodušší je opět využití příkazu dd:

dd if=/dev/zero of=/dev/sdx bs=1024K

Tímto příkazem se přečte kompletně celý disk sektor po sektoru. Po úspěšné realokaci vadných sektorů byste měli disk přečíst bez problémů. Případné chyby čtení můžete ověřit v logu /var/log/messages (může se lišit podle nastavení systému) nebo příkazem dmesg. Důležité jsou zprávy tohoto typu:

ata5.00: BMDMA stat 0x4
ata5.00: failed command: READ DMA EXT
ata5.00: cmd 25/00:04:4c:af:7a/00:00:15:00:00/e0 tag 0 dma 2048 in
         res 51/40:00:4f:af:7a/40:00:15:00:00/00 Emask 0x9 (media error)

případně

sd 4:0:0:0: [sdx] Unhandled sense code
sd 4:0:0:0: [sdx]  Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
sd 4:0:0:0: [sdx]  Sense Key : Medium Error [current] [descriptor]
Descriptor sense data with sense descriptors (in hex):
        72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00 
        15 7a af 4f 
sd 4:0:0:0: [sdx]  Add. Sense: Unrecovered read error - auto reallocate failed
sd 4:0:0:0: [sdx] CDB: Read(10): 28 00 15 7a af 4c 00 00 04 00
end_request: I/O error, dev sdx, sector 360361807
Buffer I/O error on device sdx, logical block 360361807

U disku, který je v pořádku, by se neměly zprávy o chybě media vyskytovat.

Moderní disky disponují vlastním mechanismem pro testování. Různých testů může být několik typů, pro nejpodrobnější otestování disku nejlépe vyhoví "long" test, který spustíte příkazem smartctl:

smartctl -t long /dev/sdx

Test se spouští na pozadí, o jeho průběhu se můžete informovat opět příkazem smartctl:

smartctl -a /dev/sdx

Zajímat by vás měly řádky na konci výpisu, v sekci "Self-test log":

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed without error       00%     21289         -
# 2  Extended offline    Completed: read failure       50%     21117         360361803

Na uvedeném výpisu skončil předchozí test s chybou, po realokaci vadného sektoru už test dopadl ok.

Test můžete spustit i na živém disku na serveru, data se nepoškodí a při práci test příliš nezdržuje. Pokud tímto testem objevíte vadný sektor, můžete takový sektor donutit k realokaci příkazem hdparm. Zde bych vás měl předem varovat, že uvedený příkaz hdparm přepisuje data na disku, o obsah konkrétního sektoru tak nenávratně přijdete (ostatně, data jsou nedostupná už nyní). Na živém disku tak může být tato operace fatální, nicméně to může být někdy jediný způsob, jak připojit do diskového pole nový disk ke špatnému disku.

Zkuste přečíst sektor uvedený v testu:

hdparm --read-sector 360361803 /dev/sdx
/dev/sdx:
reading sector 360361803: FAILED: Input/output error

Nepodařilo se, data jsou ztracena, pokuste se tedy sektor přepsat:

hdparm --yes-i-know-what-i-am-doing --write-sector 360361803 /dev/sdx

Sektor po zápisu můžete zkusit znovu přečíst:

hdparm --read-sector 360361803 /dev/sdx
/dev/sdx:
reading sector 360361803: succeeded
0000 0000 0000 0000 0000 0000 0000 0000
.....

Znovu překontrolujte počet realokovaných sektorů. Byla-li operace úspěšná, měl by se počet realokovaných sektorů zvýšit.

Je zajímavé, že tímto způsobem lze někdy odhalit a přepsat i sektory, které badblocks nenajde.

Pokud jste přepisovali sektory na živém disku, bylo by pravděpodobně vhodné takový disk odmontovat a opravit souborový systém na disku příkazem fsck. Šance, že se při přepisování sektoru trefíte do důležitých systémových oblastí, je sice malá, spíše přijdete o část dat v některém souboru, ale je vhodnější souborový systém preventivně opravit, než riskovat pokračující zkázu dat, tentokrát z důvodu narušení logické struktury disku.

Někdy se stane, že narazíte na disk, který veškeré snahy o opravy sabotuje a v okolí jednoho vadného sektoru se objevují při každém testu další a další vadné sektory. Série testů u jednoho takového disku vypadala takto:

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed: read failure       90%      9244         283600374
# 2  Extended offline    Completed: read failure       90%      9236         283600387
# 3  Extended offline    Completed: read failure       90%      9227         283600393
# 4  Extended offline    Completed: read failure       90%      9227         283600374
# 5  Extended offline    Completed: read failure       90%      9227         283600387
# 6  Extended offline    Completed: read failure       90%      9227         283600383
# 7  Extended offline    Completed: read failure       90%      9227         283600389
# 8  Extended offline    Completed: read failure       90%      9227         283600389
# 9  Extended offline    Completed: read failure       90%      9227         283602272
#10  Selective offline   Completed: read failure       90%      9227         283602272
#11  Selective offline   Completed: read failure       90%      9227         283602272
#12  Selective offline   Completed: read failure       90%      9227         283602273
#13  Selective offline   Completed: read failure       90%      9227         283602271
#14  Selective offline   Completed: read failure       90%      9227         283600374
#15  Selective offline   Completed: read failure       90%      9227         283602271
#16  Selective offline   Completed: read failure       90%      9227         283602270
#17  Selective offline   Completed: read failure       90%      9227         283602269
#18  Selective offline   Completed: read failure       90%      9227         283600375
#19  Selective offline   Completed: read failure       90%      9227         283600375
#20  Selective offline   Completed: read failure       90%      9227         283600375

Takový disk buď rovnou vyhoďte, nebo se vyhněte vadnému místu šikovným rozdělením disku. U takto rozsáhlého shluku chyb je předpoklad, že se bude oblast s chybami dále rozšiřovat. Sám pro správu disků používám letitý příkaz fdisk. Číslování sektorů odpovídá číslování, které používá i smartctl, a vadný disk jsem rozdělil takto:

Disk /dev/sdx: 1 000,2 GB, 1 000 204 886 016 bajtů
hlav: 255, sektorů na stopu: 63, cylindrů: 121 601, celkem 1 953 525 168 sektorů
Jednotky = sektory po 1 * 512 = 512 bajtech
Velikost sektoru (logického/fyzického): 512 bajtů / 512 bajtů
Velikost I/O (minimální/optimální): 512 bajtů / 512 bajtů
Identifikátor disku: 0x7e1fb094

Zařízení Zavádět   Začátek       Konec    Bloky    Id  Systém
/dev/sdx1            2048   283000000   141498976+  83  Linux
/dev/sdx2       284000000  1953525167   834762584   83  Linux

Test disku můžete spustit pouze na část disku:

smartctl -t select,284000000-1953525167 /dev/sdx

Tím se při testech vyhnete vadné oblasti a můžete otestovat pouze část disku, která se bude skutečně používat. V každém případě bych však disku, u kterého se při každém testu zvyšuje počet chyb, už nikdy příliš nevěřil a nikdy už bych mu nesvěřoval žádná důležitá data.

Disky, které vyřadíte ze serveru jako nespolehlivé, mohou někdy sloužit ještě dlouhou dobu na méně kritických místech. Je to samozřejmě vždy jen sázkou do loterie, ale je možné, že sbírka filmů vám vydrží déle na disku s přehršlí špatných sektorů, než na sadě DVD za pět kaček kus.

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=1928