Disassembler

Artificial intelligence is no match for natural stupidity.
23listopadu2012

Ublížený ProLiant a RAIDové zmrtvýchvstání


Obyčejně mi lidi před osmou ranní nevolají, takže pokud mě někdo telefonicky vytáhne z postele, musí to být opravdu vážné. Jako třeba dnes, kdy mi volal můj oblíbený nelinuxový správce linuxových serverů kvůli zbořenému RAIDu.

Je to rozbitý


Prvotní popis závady zněl poněkud zmateně. Respektive nezněl vůbec nijak, protože jsem byl v polospánku stroze donavigován do jistého umístění ve filesystemu a při pokusu o vypsání adresáře obdržel I/O error. Po chvilce vyptávání jsem se dozvěděl, že se jedná o disk se zálohami, který sice je v RAIDu, ovšem ze zkratky Redundant Array of Independent Disks splňuje pouze „Independent“ a „Disk“. Je totiž přiřazen jako jediný disk v poli a umístění, kam jsem byl doveden, je jeho mountpoint. Takový array o jednom disku se rebuilduje docela blbě, ale naštěstí jsem byl ještě obeznámen s informací, že k výpadku došlo po nějakém rituálním tanci kolem racku, takže disk ve skutečnosti vadný být nemusí a řadič jej mohl vyřadit z jiného důvodu. Zbytek systému je docela kritický a bylo by záhodno nerozbít nic dalšího. Tak směle do toho.

Troubleshooting


Stroj samotný je HP ProLiant DL380 s CentOSem 5.8 a s osmi pevnými disky, rozdělenými do tří polí.

   array A (RAID 1), /dev/cciss/c0d0
      physicaldrive 1I:1:1
      physicaldrive 2I:1:5
      physicaldrive 2I:1:8 (spare)

   array B (RAID 1+0), /dev/cciss/c0d1
      Mirror Group 0:
            physicaldrive 1I:1:2
            physicaldrive 1I:1:3
      Mirror Group 1:
            physicaldrive 2I:1:6
            physicaldrive 2I:1:7
      physicaldrive 2I:1:8 (spare)

   array C (RAID 0), /dev/cciss/c0d2
      physicaldrive 1I:1:4

Odmountoval jsem tedy nefunkční /dev/cciss/c0d2p1 ze svého mountpointu a šel si přečíst dmesg, respektive /var/log/messages, kde mám zprávy i s časovým razítkem.

Nov 23 07:00:01 server kernel: cciss 0000:05:00.0: cciss: c ffff810037e00000 has CHECK CONDITION sense key = 0x4
Nov 23 07:00:01 server kernel: EXT3-fs error (device cciss/c0d2p1): read_inode_bitmap: Cannot read inode bitmap - block_group = 108, inode_bitmap = 3538945
Nov 23 07:00:01 server kernel: Aborting journal on device cciss/c0d2p1.
Nov 23 07:00:01 server kernel: cciss 0000:05:00.0: cciss: c ffff810037e00000 has CHECK CONDITION sense key = 0x4
Nov 23 07:00:01 server kernel: Buffer I/O error on device cciss/c0d2p1, logical block 2057
Nov 23 07:00:01 server kernel: lost page write due to I/O error on cciss/c0d2p1
Nov 23 07:00:01 server kernel: cciss 0000:05:00.0: cciss: c ffff810037e00000 has CHECK CONDITION sense key = 0x4
Nov 23 07:00:01 server kernel: Buffer I/O error on device cciss/c0d2p1, logical block 0
Nov 23 07:00:01 server kernel: lost page write due to I/O error on cciss/c0d2p1
Nov 23 07:00:01 server kernel: EXT3-fs error (device cciss/c0d2p1) in ext3_new_inode: IO failure
Nov 23 07:00:01 server kernel: cciss 0000:05:00.0: cciss: c ffff810037e00000 has CHECK CONDITION sense key = 0x4
Nov 23 07:00:01 server kernel: Buffer I/O error on device cciss/c0d2p1, logical block 0
Nov 23 07:00:01 server kernel: lost page write due to I/O error on cciss/c0d2p1
Nov 23 07:00:01 server kernel: EXT3-fs error (device cciss/c0d2p1) in ext3_create: IO failure
Nov 23 07:00:01 server kernel: cciss 0000:05:00.0: cciss: c ffff810037e00000 has CHECK CONDITION sense key = 0x4
Nov 23 07:00:01 server kernel: Buffer I/O error on device cciss/c0d2p1, logical block 0
Nov 23 07:00:01 server kernel: lost page write due to I/O error on cciss/c0d2p1
Nov 23 07:00:03 server kernel: ext3_abort called.
Nov 23 07:00:03 server kernel: EXT3-fs error (device cciss/c0d2p1): ext3_journal_start_sb: Detected aborted journal
Nov 23 07:00:03 server kernel: Remounting filesystem read-only

Poslední řádka, volně přeložitelná jako „Seru na vás, jdu domů“ nevěstila nic dobrého. HPčkovský cciss driver ještě chvilku otravoval s tím, že si máme zkontrolovat disky a ve chvíli, kdy jsem se pokusil spustit fsck, diskový oddíl sbalil a za výkřiku

Nov 23 07:19:02 server kernel: EXT3-fs error (device cciss/c0d2p1): ext3_find_entry: reading directory #2 offset 0

s ním utekl za kopečky, zanechav mě pouze s /dev/cciss/c0d2, který, dle očekávání, jakýkoliv pokus o komunikaci odmítal se zmínkou o I/O erroru. Bylo tedy třeba donutit řadič, aby přestal dělat ublíženého a disk i s diskovým oddílem zase hezky vrátil. Seznam instalovaných HP utilit se nebezpečně blížil nule a řadič se se systémem zatvrzele odmítal bavit. Pokusil jsem se pomocí

[root@server ~]# echo 1 > /sys/class/scsi_device/1\:0\:0\:0/device/rescan

prošťouchnout SCSI sběrnici, ale jelikož RAID controller je plně pod správou HP utilit a sedí někde na PCI, dosáhl jsem tak maximálně toho, že zablikala LEDka na DVD mechanice.

I command thee!


Dokonce ani naordinování hardwarového zásahu se zamlklým řadičem nehnulo, protože dobře věděl, co se na něj snažíme ušít a okázale naše snahy ignoroval. Požádal jsem si tedy o povolení k doinstalování HP CLI nástrojů, abych si to s řadičem mohl na férovku vyříkat. Na stránkách HP jsem se doklikal k souborům ke stažení pro daný server a byl jsem mile překvapen, že i CentOS byl mezi plně podporovanými linuxovými distribucemi. Ba co víc, existovaly k němu daleko příčetnější balíčky a instalátory než k jeho komerčně využívanému bratrovi. Stáhl jsem tedy celý balík utilit a vybral si z něj jednu, se sympatickým názvem HP Array Configuration Utility.

[root@server ~]# rpm -ivh hpacucli-8.70-8.0.noarch.rpm
Preparing...                ########################################### [100%]
   1:hpacucli               ########################################### [100%]
[root@server ~]# hpacucli
HP Array Configuration Utility CLI 8.70-8.0
Detecting Controllers...Done.
Type "help" for a list of supported commands.
Type "exit" to close the console.

=> ctrl all show

Smart Array P410i in Slot 0 (Embedded)    (sn: 1234138009F50A07)

Hurá, konečně můžu dráždit řadič přímo. Nechal jsem si vypsat diagnostiku

=> ctrl slot=0 diag file=hpdiag.txt

   Generating diagnostic report...done

A do té doby zamlklý řadič na mě vychrlil přehršel údajů o sobě, discích na něm pověšených a samozřejmě i diskových polích z nich poskládaných.

[root@server ~]# head -12 hpdiag.txt
ACU-CLI Version                         8.70-8.0
Diagnostic Module Version               5.2.64.0
INFOMGR Version                         6.0-1.0
Time Generated                          Friday November 23, 2012 8:15:11AM

Device Summary:
   Smart Array P410i in Embedded Slot

Consolidated Error Report:
   Controller: Smart Array P410i in Embedded Slot
       Device: Logical Drive 3
      Message: Logical drive state: This logical drive has failed and cannot be used.  All data on this logical drive has been lost.

Logical drive has failed. Nicméně nikde ani slovo o fyzických jednotkách. To mi i navzdory fatalistické hlášce „All data on this logical drive has been lost.“ dalo docela slušnou naději, že se resuscitace podaří. Když už jsem mohl řadič přímo komandovat, nebylo nic jednoduššího, než si nahození disku vynutit.

=> ctrl slot=0 ld 3 modify reenable

Warning: Any previously existing data on the logical drive may not be valid or
         recoverable. Continue? (y/n) y

V racku hrklo jak v pendlovkách po babičce a stav třetího RAIDu se bez odmlouvání změnil z předchozího „Failed“ na krásné stručné „OK“.

Oddíl rychlého nasazení


„OK“ je fajn, ale diskový oddíl pořád nepřišel. A řadič se se systémem prostě bavit nehodlá. Šťouchl jsem tedy do disku, abych zjistil, jestli alespoň ten si se mnou bude povídat.

[root@server ~]# file /dev/cciss/c0d2
/dev/cciss/c0d2: block special (104/32)

Žádný I/O error? To zní zatraceně dobře. Tak teď ještě jej přimět, aby se nestydělo a odhalilo nám svou partitionu. Jsa rozmlsaný udevem a všelijakými jinými hotswapy a hotplugy, stálo mě to chvilku googlení, protože jsem netušil, že existuje příkaz přímo na tu jedinou operaci, která mi k úspěchu scházela - znovunačtení rozložení diskových oddílů.

[root@server ~]# partprobe /dev/cciss/c0d2
[root@server ~]# blkid /dev/cciss/c0d2p1
/dev/cciss/c0d2p1: LABEL="/mnt/backup " UUID="280881a5-9b56-4961-6d0d-d40629ea233a" TYPE="ext3"

Data! No nekecej! Rebootu netřeba.

[root@server ~]# mount -a

Fakturu pošlu v pondělí.