Softwareraid Festplatte kaputt in einem Hetzner Rootserver

2010-07-20 - kostaki 4 Kommentare »

Festplatte kaputt

Nach einer sehr langen Glückssträhne hat es nun auch mich getroffen. Meine erste Festplatte in einem Rootserver ist vor einigen Wochen kaputt gegangen. Natürlich hatte ich ein Raid (Softwareraid 1) eingerichtet und da der Server auch nicht besonders wichtig war, habe ich es erst gar nicht mitbekommen. Der Server lief auch noch normal weiter und da die Platte nur nen Sprung hatte, überstand er sogar mehrere Reboots ohne Probleme, wobei der Bootloader nur auf der kaputten Festplatte installiert war. Dazu später mehr.

Ich muss gestehen das ich mich mit der Materie Softwareraid noch nicht auseinander gesetzt hatte. Ich hab es immer eingerichtet und mir gesagt ich kümmere mich darum wenn ich es muss. Nun hatte ich wie gesagt noch keinen Festplatten Ausfall mit einem Softwareraid zu verzeichnen, aber da die Anzahl an Servern die ich manage stetig steigt, war es nur eine Frage der Zeit. Nun war es also soweit sich damit zu beschäftigen und um das vorweg zu nehmen, der Server läuft wieder! Die Platte wurde getauscht und das Softwareraid wieder hergestellt. Im nach hinein bin ich sehr froh das es mich jetzt und bei einem eher unwichtigem Server getroffen hat, so das ich mich damit beschäftigen musste. Man schläft sehr viel besser wenn man weiß wie es funktioniert und was man beachten muss wenn es einen trifft.

Hier nun also meine Erfahrungen beim Ausfall einer Festplatte in einem Softwareraid 1 (2 Platten) auf einem Hetzner EQ4 mit Debian Lenny. Die Formatierung ist sehr einfach (md0 – Swap, md1 – /boot und md2 – der ganze Rest).

Wie erkennt man das die Festplatte defekt ist?

Zur Überwachung der Festplatten gibt es SMART. Bei Debian gibt es den smartd, der bei Problemen mit der Festplatte informiert. Bei diesem Server hatte ich die SMART Werte nur per Munin überwacht. Hier viel es mir dann auch auf, als der Graph plötzlich nicht mehr aktualisiert wurde.

Munin Smart Week Stats

Auf dem Server selbst kann man den Status des Raids per “cat /proc/mdstat” abrufen. Das healthy Raid sieht so aus:

$ cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sda3[0] sdb3[1]
      713687552 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
      2104448 blocks [2/2] [UU]

md0 : active (auto-read-only) raid1 sda1[0] sdb1[1]
      16779776 blocks [2/2] [UU]

unused devices: <none>

Das Fehlerraid sah so aus:

$ cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sda3[2](F) sdb3[1]
      713687552 blocks [2/1] [_U]

md1 : active raid1 sda2[2](F) sdb2[1]
      2104448 blocks [2/1] [_U]

md0 : active (auto-read-only) raid1 sda1[0] sdb1[1]
      16779776 blocks [2/2] [UU]

unused devices: <none>

Man sieht das bei md2 und md1 die sda als fehlerhaft markiert ist. Das zeigt das (F) hinter der Partition (sda3[2](F)) und der Unterstrich hier (713687552 blocks [2/1] [_U]). Als nächstes wollte ich den SMART Status auslesen, was aber nicht mehr funktionierte.

$ smartctl -a -d ata /dev/sda
smartctl version 5.38 [x86_64-unknown-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

Smartctl: Device Read Identity Failed (not an ATA/ATAPI device)

A mandatory SMART command failed: exiting.
To continue, add one or more '-T permissive' options.

Jetzt kann man noch in die Logfiles gucken ob man dort etwas findet.

$ dmesg | grep [Ee]rro
[ 2173.091120] end_request: I/O error, dev sda, sector 358864367
[ 2173.091282] end_request: I/O error, dev sda, sector 358864495
[ 2173.092491] end_request: I/O error, dev sda, sector 358864751
[ 2173.092634] end_request: I/O error, dev sda, sector 358865007
[ 2173.092789] end_request: I/O error, dev sda, sector 358866287
[ 2173.092880] end_request: I/O error, dev sda, sector 358865903
[ 2173.092984] end_request: I/O error, dev sda, sector 358865775
[ 2173.093075] end_request: I/O error, dev sda, sector 358865519
[ 2173.093170] end_request: I/O error, dev sda, sector 358867951
[ 2173.093265] end_request: I/O error, dev sda, sector 358867823
[ 2173.093356] end_request: I/O error, dev sda, sector 358867311
[ 2173.093459] end_request: I/O error, dev sda, sector 358867055
[ 2173.093553] end_request: I/O error, dev sda, sector 358866927
[ 2173.093646] end_request: I/O error, dev sda, sector 358866799
[ 2173.093736] end_request: I/O error, dev sda, sector 358866543
[ 2173.093830] end_request: I/O error, dev sda, sector 358866415
[ 2173.093921] end_request: I/O error, dev sda, sector 358868207
[ 2173.094018] end_request: I/O error, dev sda, sector 1465143919
[ 2173.094051] end_request: I/O error, dev sda, sector 1465143919
$ egrep -e "(sd|ata|raid)" /var/log/kern.log
[ 2112.022141] ata1: hard resetting link
[ 2118.361600] ata1: link is slow to respond, please be patient (ready=0)
[ 2123.009628] ata1: COMRESET failed (errno=-16)
[ 2123.009661] ata1: hard resetting link
[ 2128.370884] ata1: link is slow to respond, please be patient (ready=0)
[ 2133.018880] ata1: COMRESET failed (errno=-16)
[ 2133.018911] ata1: hard resetting link
[ 2138.378927] ata1: link is slow to respond, please be patient (ready=0)
[ 2168.066959] ata1: COMRESET failed (errno=-16)
[ 2168.066991] ata1: limiting SATA link speed to 1.5 Gbps
[ 2168.067020] ata1: hard resetting link
[ 2173.090965] ata1: COMRESET failed (errno=-16)
[ 2173.090995] ata1: reset failed, giving up
[ 2173.091022] ata1.00: disabled
[ 2173.091120] end_request: I/O error, dev sda, sector 358864367
[ 2173.091152] raid1: Disk failure on sda3, disabling device.
[ 2173.091154] raid1: Operation continuing on 1 devices.
[ 2173.091282] end_request: I/O error, dev sda, sector 358864495
[ 2173.092491] end_request: I/O error, dev sda, sector 358864751
[ 2173.092634] end_request: I/O error, dev sda, sector 358865007
[ 2173.092694] ata1: EH complete
[ 2173.092789] end_request: I/O error, dev sda, sector 358866287
[ 2173.092880] end_request: I/O error, dev sda, sector 358865903
[ 2173.092984] end_request: I/O error, dev sda, sector 358865775
[ 2173.093075] end_request: I/O error, dev sda, sector 358865519
[ 2173.093170] end_request: I/O error, dev sda, sector 358867951
[ 2173.093265] end_request: I/O error, dev sda, sector 358867823
[ 2173.093356] end_request: I/O error, dev sda, sector 358867311
[ 2173.093459] end_request: I/O error, dev sda, sector 358867055
[ 2173.093553] end_request: I/O error, dev sda, sector 358866927
[ 2173.093646] end_request: I/O error, dev sda, sector 358866799
[ 2173.093736] end_request: I/O error, dev sda, sector 358866543
[ 2173.093830] end_request: I/O error, dev sda, sector 358866415
[ 2173.093921] end_request: I/O error, dev sda, sector 358868207
[ 2173.094018] end_request: I/O error, dev sda, sector 1465143919
[ 2173.094051] end_request: I/O error, dev sda, sector 1465143919

Da der Server noch lief habe ich natürlich sofort die Backups geprüft und sicher gestellt das ich wirklich von allem eine Sicherung hatte. Das war gegeben, also verschob ich als nächstes die einzigen beiden etwas wichtigeren Projekte auf einen anderen Server. Jetzt machte ich mir sorgen ob der Server einen Reboot überstehen würde, da für ihn 3 Tage später ein Rechenzentrumsumzug an stand. Da ich nichts zu verlieren hatte, habe ich es einfach getestet. Der Server bootete, was aber nur daran lag das die sda Platte noch nicht ganz den Geist aufgegeben hatte. Der Bootloader war nämlich nur auf dieser installiert.

Was muss man tun wenn man einen Plattentausch bei Hetzner wünscht?

Man muss die folgenden Angaben parat haben um ohne Rückfragen einen Plattentausch zu veranlassen.

  • IP des Servers
  • die ersten 5 Stellen des Robot Passworts (könnte ja sonst jeder kommen)
  • einen Auszug aus den Logfiles die den Fehler belegen

Quelle: Hetzner Wiki – Plattentausch

Des weiteren sollte man die Platte vor dem Austausch aus dem Softwareraid entfernen. Dies wird hervorragend im Hetzner Wiki – Austausch einer defekten Festplatte im Software-RAID beschrieben.

Entfernen der defekten Festplatte aus dem Softwareraid

Bevor man eine neue Platte einbauen lässt, sollte man die alte/kaputte Festplatte aus dem Softwareraid entfernen. Das muss man für jede Partition einzeln machen.

$ mdadm /dev/md0 -r /dev/sda1
$ mdadm /dev/md1 -r /dev/sda2
$ mdadm /dev/md2 -r /dev/sda3

Um sich die Details eines Arrays anzeigen zu lassen, kann man mdadm mit –detail aufrufen.

$ mdadm --detail /dev/md0

Schlägt das entfernen fehl, weil einzelne Arrays noch im Status [UU] stehen, muss man die fehlerhafte Partition vor dem entfernen als defekt markieren.

$ mdadm --manage /dev/md0 --fail /dev/sda1

Jetzt sollte das Array auf [_U] stehen und man kann die Platte entfernen.

Festplatten Austausch bei Hetzner veranlassen

Ich sammelte also alle Daten zusammen und schickte ein Supportnachricht an Hetzner.

IP: 127.0.0.1
Robot PW: xxxx (erste 5 Zeichen)

Sehr geehrte Damen und Herren,

das Raid (Software Raid 1) auf dem angegebene Server (Debian Lenny) funktioniert leider
nicht mehr. Ein cat /proc/mdstat zeigt an das die sda fehlerhaft ist. Das wieder eingliedern
der sda nach einem Reboot hat nicht funktioniert und bricht bei ca. 30% ab. Smartwerte
sind nicht mehr abrufbar.

Die Daten wurden gesichert und wichtige Projekte verschoben. Die Platte kann also
jederzeit gewechselt werden. Bitte teilen sie mir das weitere Vorgehen mit.

Mit freundlichen Grüßen

An dieser Stelle muss ich mal wieder den hervorragenden Support von Hetzner loben. Bereits 2 Minuten nach dem absenden der Nachricht hatte ich eine Antwort:

wir tauschen gerne die sda aus. Für den Austausch müssten wir den Server für ca. 20min
herunterfahren. Bitte teilen Sie uns mit, ob und wann wir den Austausch durchführen können.

Weiter 5 Minuten später hatte ich geantwortet und 1 Stunde später war der Austausch vollzogen. Wie schon erwähnt war der Bootloader nur auf der jetzt nicht mehr existenten Platte installiert und so wurde der Server im Rescuemode gestartet.

Server und Softwareraid aus dem Rescue System wiederherstellen.

Auch hier hilft das Hetzner Wiki weiter. Als erstes soll man auf der neuen Platte die gleichen Partitionen mit der exakt gleichen Größe anlegen. Mit Hilfe von dd kann man die Partitionstabelle von einer Platte sehr einfach auf eine andere kopieren. Dabei wird auch gleich der Bootloader mit kopiert (wenn man ihn den installiert hat).

$ dd if=/dev/sdb of=/dev/sda count=1 bs=512

In diesem Beispiel ist ist /dev/sdb die Quellfestplatte und /dev/sda die Zielfestplatte. Jetzt noch die Partitionstabelle vom Kernel neu eingelesen lassen.

$ sfdisk -R /dev/sda

Jetzt kann man die Partitionen in das Softwareraid eingliedern. Zu bedenken ist dabei das das Syncen der Daten bei großen Festplatten länger dauern kann. Will man den Server schnell wieder online bekommen, kann man die Eingliederung/Resync auch im laufenden Betrieb durchführen. Ich habe in diesem Fall alles im Rescue System durchgeführt.

$ mdadm /dev/md0 -a /dev/sda1
$ mdadm /dev/md1 -a /dev/sda2
$ mdadm /dev/md2 -a /dev/sda3

Den Status der Syncronisation kann man mit “cat /proc/mdstat” prüfen. Wenn alles fertig ist, dann sieht es so aus.

$ cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sda3[0] sdb3[1]
      713687552 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
      2104448 blocks [2/2] [UU]

md0 : active (auto-read-only) raid1 sda1[0] sdb1[1]
      16779776 blocks [2/2] [UU]

unused devices: <none>

Nachdem der Resync abgeschlossen war habe ich versucht den Server neu zu starten. Das klappte natürlich nicht, da ich keinen Bootloader installiert hatte. Also wieder zurück ins Rescue System.

GRUB Bootloader auf alle Platten in einem RAID 1 installieren

Meine GRUB Kenntnisse waren genauso gut wie meine Softwareraid Kenntnisse und so musste ich ein paar Minuten Googlen bis mir hier geholfen wurde. Als erstes loggt man sich auf der “GRUB-Konsole” ein.

$ grub
Probing devices to guess BIOS drives. This may take a long time.

Dann sucht man nach der Datei stage1 um die Bootpartitionen zu finden.

grub> find /grub/stage1
 (hd0,1)
 (hd1,1)

Jetzt muss man den Bootloader nur noch auf den beiden gefundenen Partitionen installieren. Wichtig ist dabei das man beide Platten als hd0 betrachtet. Wenn nämlich eine kaputt geht und ausgebaut wird, ist die verbleibende automatisch hd0. Hat man sie nicht so konfiguriert, wird es nichts mit dem booten.

grub> device (hd0) /dev/sda
device (hd0) /dev/sda
grub> root (hd0,0)
 Filesystem type unknown, partition type 0xfd
grub> setup (hd0)
setup (hd0)
Error 17: Cannot mount selected partition

Gibt man wie hier die falsche Partion an, bekommen man diesen Fehler angezeigt und die Installation funktioniert nicht.

grub> device (hd0) /dev/sda
device (hd0) /dev/sda
grub> root (hd0,1) #hier die werte vom find angeben!
root (hd0,1)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
setup (hd0)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  17 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd0) (hd0)1+17 p (hd0,1)...
succeeded
Done.

Das gleiche wiederholt man für die anderen Platten im RAID1.

grub> device (hd0) /dev/sdb
grub> root (hd1,1)
grub> setup (hd0)
grub> quit

Jetzt kann man den Server ganz normal booten.

Fazit: Software RAID und Plattenausfall

  • man sollte sich nicht wie ich erst damit beschäftigen wenn etwas passiert, sondern ruhig mal einen Plattenausfall und die Reaktionen bei einem neuen Server durchspielen
  • den Bootloader immer auf alle im RAID1 befindlichen Platten installieren
  • Backups sind trotz RAID sehr wichtig

Update 27.07.2010

Der Hetzner Support war so freundlich im Hetzner Forum zu erklären, was sie genau haben wollen.

Die wichtigsten Angaben die für einen Hardwaretausch benötigt werden sind:
- Was genau soll getauscht werden?
* bei HDD's am besten die SN angeben der defekten oder der noch funktionierende HDD's
* bei mehreren NIC's die MAC der defekten oder noch funktionierenden NIC
- Eventuell vorhandene logs über den Defekt, der jeweiligen HW (dmesg).
- Eine Bestätigung das die Daten auf der zu tauschenden HW verloren gehen.
- Eine Bestätigung oder einen genauen Termin (2-3 Stunden im Vorraus) damit wir den Server
herunterfahren dürfen.

Bei einer solchen Anfrage zum Beispiel, stellen wir normalerweise keine Rückfragen mehr:
-----------
Bitte sda am 08.10.2010 um 21 Uhr austauschen. Den Datenverlust sowie den Shutdown
bestätigen wir hiermit.

logs:

ata1 error ...

Related Links

Ähnliche Artikel

  1. 4 Kommentare

  2. Falk
    schrieb am 26.07.2010 um 15:14 Uhr

    Hallo Marco,

    habe vor einigen Jahren, als ich mit Software-RAID anfing ähnliche katastrophale Erfahrungen gesammelt (und seitdem eine Menge gelernt ohne wirklich wichtige Daten zu verliren). Du hast in deinem Post angedeutet, dass du dich noch nicht mit Software-RAID unter Linux beschäftigt hast, aber gern würdest. Vielleicht ist ja mein Post für dich interessant?

    http://falkhusemann.de/blog/2010/06/warum-sie-sich-software-raid-genauer-ansehen-sollten/

    Bin ganz frisch am bloggen, bitte nicht hauen :)

    Falls du schon ein Backup-System eingerichtet hast, würde mich mal interessieren, was du einsetzt. Ich arbeite zur Zeit noch mit rsync+ssh.

    Grüße

  3. kostaki
    schrieb am 26.07.2010 um 16:22 Uhr

    Hey Falk,

    danke für den Tipp. Wir scheinen was bloggen an geht ja einen ähnlichen Geschmack zu haben. Sieht man ja sogar am WordPress Design. :P

    Als Backupsystem setze ich auch einen Rsync Server ein. Mir gefällt das ich die Daten pullen kann und nicht pushen muss. So hat man alles was Backup angeht an zentraler Stelle. Außerdem kann man die verschiedensten System anschließen ohne viel installieren zu müssen.

    Ich habe mein System in diesen beiden Artikeln beschrieben. Sie sind mir leider nicht sehr gut gelungen was Übersichtlichkeit angeht, aber vielleicht hilft es.

    http://www.debianroot.de/server/rsync-backup-server-erstellen-1115.html
    http://www.debianroot.de/server/rsync-backup-server-teil2-1136.html

    Gruß
    Marco

  4. Falk
    schrieb am 26.07.2010 um 17:13 Uhr

    Hallo nochmal,

    mensch, hast dir ja eine Menge Arbeit gemacht die Fehlerfälle abzufangen. Falls du mal mehrere Versionen speichern möchtest ohne mehr Speicher, als den der Unterschiede zwischen den Versionen, zu verbrauchen: Schau dir mal “cp -al” und den rsync-Parameter “–link-dest” an. Möchte ich nicht mehr missen.

    Ja, ich gestehe: Bin durch deinen Blog auf das Design aufmerksam geworden. Ist mir allerdings zu bunt gewesen (Vorbild: http://cr.yp.to) *grins*

    Was mir aufgefallen ist: Du musst auch noch das Setup neuer Clients von Hand machen. Das ließe sich mit einem Debian-Paket “mein-backup-server” gut lösen. Leider komme ich nie dazu sowas zu programmieren :-/

    Grüße

  5. kostaki
    schrieb am 26.07.2010 um 17:30 Uhr

    Hehe ja ich mag auch eher einfache Seite ohne viele Bilder und an das Babyblau muss man sich auch erst mal gewöhnen…

    Mir gehts da ähnlich wie dir. Mir fehlt auch die Zeit um mal tiefer in die Materie einzusteigen. Das Setup eines neuen Clients geht aber mittlerweile recht schnell. Rsync installieren, SSH für Public Key Auth vorbereiten, User anlegen, Schlüssel kopieren und eine neue Config anlegen, fertig. :)

Kommentar schreiben

*

*