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
| Články autora
| přečteno 13364×
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:
-
Přepíšou se veškerá stará data na disku. Pokud jste vytáhli disk ze serveru,
je pravděpodobně tento efekt velmi žádoucí - nechcete přeci, aby se data dostala
do rukou někomu cizímu. Je možné, že i z takto přepsaného disku by bylo možné
dostat alespoň část dat zpět, ale pravděpodobnost, že se to novému majiteli
disku podaří, je mizivá.
-
Provede se zápis do každého diskového sektoru. Pokud se zápis nepodaří, nebo se
disk pokouší zapsat na místo označené "Current_Pending_Sector", vadný sektor se
přemístí na náhradní místo.
Č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.
Verze pro tisk
|
Nejsou žádné diskuzní příspěvky u dané položky.
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|