Disassembler

Artificial intelligence is no match for natural stupidity.
03června2012

O nemrtvém RAIDu a rychlé podpoře


Svoje servery si pronajímám od německé společnosti Hetzner Online AG. Kvalita a rozsah poskytovaných služeb je nesrovnatelná s hostingy a housingy dostupnými u nás a navíc platím tak o polovinu méně než bych platil u průměrného českého housingu. V sobotu se mi ale u mého nejstaršího serveru odporoučel jeden disk z původní konfigurace 2x 1,5 TB (Seagate ST31500341AS) v softwarovém RAID1. I jal jsem se využít služeb neautomatizované podpory.

A fail event had been detected


V sobotu v šest ráno mi v mailu přistál pozdrav od mdadm, hlásající, že mi failnul svazek s daty a že by to mohlo mít něco společného s nemocným /dev/hda. O hodinu později pak další mail jen potvrdil, že ostatní RAIDované partyšny to taky zabalily a že s /dev/hda asi fakt bude něco v nepořádku. Zkusmo jsem server restartnul, jestli se třeba disk jen hluboce nezamyslel, ale i poté mi bylo oznámeno, že se se mnou disk opravdu bavit nehodlá a že systém nastartoval v degradovaném RAIDu s jediným zdravým diskem, který se mi teď přestěhoval na /dev/hda.

root@server:~# dmesg | grep ata1
[    1.352301] ata1: SATA max UDMA/133 abar m2048@0xfbbfa000 port 0xfbbfa100 irq 30
[    1.669381] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
[    1.711805] ata1.00: both IDENTIFYs aborted, assuming NODEV
root@server:~# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sda3[1]
      1462766336 blocks [2/1] [_U]

md1 : active raid1 sda2[1]
      264960 blocks [2/1] [_U]

md0 : active (auto-read-only) raid1 sda1[1]
      2102464 blocks [2/1] [_U]

unused devices: <none>

Naklapal jsem tedy Hetznerům do formuláře, že bych rád nechal vyměnit disk, protože se po něm mdstatu stýská. Automat mi odpověděl, že se na to do dvou až čtyř hodin někdo podívá. To je celkem rozumná doba, na to, že byla sobota. I kdyby to byl můj vlastní server, hostovaný někde v kotelně na Cejlu, nestihl bych to o moc rychleji.

Failed at failing


Už za čtyřicet minut mi ale v konzoli vyskočilo

Broadcast message from root@server.dasm.cz (Sat Jun  2 10:43:11 2012):

Power button pressed
The system is going down for system halt NOW!

Super. Sice bude další několikaminutový downtime, který by tak úplně být ani nemusel, ale byl jsem rád za to, že je podpora ochotná si na chvíli odskočit od FarmVille i o víkendu. Za pět minut bylo vyměněno a byl jsem opět online, tak hurá na rebuild. Napřed si zkopíruju si rozdělení oddílů ze zdravého disku.

root@server:~# sfdisk -d /dev/sda | sfdisk /dev/sdb
Checking that no-one is using this disk right now ...
OK

Disk /dev/sdb: 364801 cylinders, 255 heads, 63 sectors/track

sfdisk: ERROR: sector 0 does not have an msdos signature
 /dev/sdb: unrecognized partition table type
Old situation:
No partitions found
Warning: given size (2928909104) exceeds max allowable size (1463779056)

sfdisk: bad input

Počkat... cože? Jak jako exceeds max allowable size? Co mi to tam proboha dali?

root@server:~# hdparm -i /dev/sda | grep -e Model -e LBA
Model=ST31500341AS, FwRev=CC1H, SerialNo=1234ABCD
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=2930277168

root@server:~# hdparm -i /dev/sdb | grep -e Model -e LBA
Model=SAMSUNG HD753LJ, FwRev=1AA01118, SerialNo=ABCD1234567890
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=1465149168

A fail event had been detected. Indeed. Obratem tedy odpovídám na „Dear Client, as requested we've changed the faulty drive and rebooted the server.“ mail generovaný ticketovacím toolem a ptám se, zda mi podpora prozradí ty tajné příkazy, díky kterým můžu na 750GB disku uložit 1,5 TB dat. Ve spojitosti s rychlostí podpory mi jejich akce připomněla onen vousatý vtip s Motorolou a Pentiem.

Motorola: A_h_o_j_ p_e_n_t_i_u_m_,_ n_e_v_i_s_ k_o_l_i_k_ j_e_ t_r_i_ k_r_a_t_ t_r_i_?
Pentium: Šest.
Motorola: A_l_e_ t_o_ j_e_ s_p_a_t_n_e_.
Pentium: To nevadí, ale rychle.

Kluci podpíráci obratem odpověděli a omlouvali se mi až do nebe. Na otázku, kdy mi můžou server otočit a svou chybu napravit, jsem odpověděl „čím dřív, tím líp“ a za dvě minuty (!!!) jsem měl disk vyměněn podruhé. Sice to byl pořád nějaký Samsung, ale počet LBA sektorů (a tím pádem i kapacita disku) konečně odpovídal.

Perestrojka


Na druhý pokus to snad vyjde. Mdadm už ví, že mu chybí celý disk, takže příkazy

root@server:~# mdadm --manage /dev/md0 --fail /dev/sdb1
mdadm: set /dev/sdb1 faulty in /dev/md0
root@server:~# mdadm --manage /dev/md0 --remove /dev/sdb1
mdadm: hot removed /dev/sdb1 from /dev/md0

jsou už zbytečné a můžu se rovnou pustit do kopírování struktury oddílů.

root@server:~# sfdisk -d /dev/sda | sfdisk /dev/sdb
Checking that no-one is using this disk right now ...
OK

Disk /dev/sdb: 182401 cylinders, 255 heads, 63 sectors/track

sfdisk: ERROR: sector 0 does not have an msdos signature
 /dev/sdb: unrecognized partition table type
Old situation:
No partitions found
New situation:
Units = sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
/dev/sdb1          3906   4209029    4205124  fd  Linux raid autodetect
/dev/sdb2       4209030   4739174     530145  fd  Linux raid autodetect
/dev/sdb3       4739175 2930272064 2925532890  fd  Linux raid autodetect
/dev/sdb4             0         -          0   0  Empty
Warning: no primary partition is marked bootable (active)
This does not matter for LILO, but the DOS MBR will not boot this disk.
Successfully wrote the new partition table

Re-reading the partition table ...

If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)

Pak už jen stačí připojit oddíly k náležitým svazkům

root@server:~# mdadm --manage /dev/md0 --add /dev/sdb1
mdadm: re-added /dev/sdb1
root@server:~# mdadm --manage /dev/md1 --add /dev/sdb2
mdadm: re-added /dev/sdb2
root@server:~# mdadm --manage /dev/md2 --add /dev/sdb3
mdadm: re-added /dev/sdb3

a rebuild se spustí automaticky

root@server:~# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sdb3[2] sda3[0]
      1462766336 blocks [2/1] [U_]
      [>....................]  recovery =  0.1% (1526592/1462766336) finish=271.1min speed=89799K/sec

md1 : active raid1 sdb2[2] sda2[0]
      264960 blocks [2/1] [U_]
        resync=DELAYED

md0 : active raid1 sdb1[1] sda1[0]
      2102464 blocks [2/2] [UU]

unused devices: <none>

I přes tento omyl netrvala korektní výměna disku déle než hodinu, což je, vzhledem k tomu, že nepatřím mezi kdovíjak prestižní zákazníky, chvályhodný výkon.