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 13244×
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.