Skip to content

Warum defekte Platten unter Linux nicht mit dd gesichert werden sollten

Was tun wenn die Festplatte lustige Geräusche macht oder bereits Daten verloren hat, weil die Harddisk defekte Sektoren hat?

Das allseits beliebte dd zum Erstellen von Festplattenimages tut bei funktionierenden Festplatten seinen Dienst, bei Platten mit defekten Sektoren jedoch führt dd zu unbrauchbaren images. Aber warum und was passiert dabei genau?

dd bs=4096 conv=noerror,sync if=/dev/hda of=/mnt/server/imagedatei.img

dd liest blockweise (4096 Bytes) die Daten von der Festplatte /dev/hda, macht auch weiter wenn es auf Fehler trifft, füllt den Block mit Nullbytes auf 4096 bytes auf, falls er kürzer ist, und schreibt diese Dateien gleichzeitig in 4096 Byte Blöcken nach /mnt/server/imagedatei.img. Fatal ist, wenn Blöcke nicht lesbar sind. In dem Falle bricht dd zwar nicht ab, weil conv=noerror angegeben wurde, aber es liest keine Daten ein und schreibt auch keine Daten in das Image.

Die Fehlerhaften Blöcke fehlen im Zielimage also komplett, weshalb die danach folgenden Sektoren nach vorne verschoben sind und das Filesystem somit Schwierigkeiten haben dürfte, die Daten richtig wieder zu finden.

Defekte Platten mit dd sichern funktioniert nicht.

Stattdessen sollte man für Festplatten mit defekten Sektoren GNU ddrescue nehmen (nicht zu verwechseln mit ddrescue). Je nach verwendeter Distribution ist GNU ddrescue direkt mit apt-get oder yum zu installieren. Bei Debian z.B. mit apt-get install gddrescue, bei anderen Distributionen auch als dd_rescue bezeichnet.

Auch GNU ddrescue erstellt ein Image von der Festplatte, geht dabei jedoch einen anderen Weg:

  • Es liest zunächst alle problemlos lesbaren Daten, um so viel wie möglich zu retten bevor die Festplatte möglicherweise stirbt
  • Danach liest es mehrfach die defekten Sektoren und versucht auch dort die Daten zu retten, sofern möglich
  • Leere Bereiche der Festplatte werden übersprungen. Das sorgt dabei für eine deutlich schnellere Erstellung des Zielimages
  • Das Zielimage ist hinterher vollständig, keine Sektoren fehlen. Sofern ein Sektor unlesbar war, fehlen an dieser Stelle jedoch die Originaldaten

Datenrettung in letzter Sekunde eben, aber wenn, dann wenigstens richtig. Aufschlußreich ist übrigens auch ein Interview mit dem Entwickler.

Virtuelle Screens unter Linux im Textmodus

Nicht jeder Linux-Server hat und braucht eine grafische Oberfläche. Denken wir nur an die ganzen entfernt stehenden Rootserver, die ja mittlerweile aufgrund des Preisverfalls praktisch für jeden erschwinglich sind. Eine grafische Oberfläche ist hier normalerweise nicht notwendig und auch nur in Ausnahmefällen installiert, die freien Ressourcen gibt man meist besser dem Server zum Erfüllen seiner eigentlichen Aufgaben.

Auch auf solchen Servern kommt es vor, daß man Programme startet, die voraussichtlich lange laufen werden, und auch dann weiter laufen wenn die ssh-Verbindung getrennt wird. Normalerweise werden die vom User gestarteten Prozesse vom System beendet, wenn die Verbindung getrennt wird (und sei es nur, weil das Timeout der Fritzbox mal wieder nach 10 Minuten die Verbindung automatisch trennt). Kommt man an den Platz zurück und loggt sich wieder ein, so darf man von vorne beginnen. Oft kann man nicht mal wirklich sagen ob der Prozess regulär beendet wurde weil er seine Arbeit beendet hat oder ob das System ihn beendete.

In solchen Fällen hilft screen, ein GNU Tool, mit dem man virtuelle Konsolen erschaffen und hinterlassen kann, die auch weiterlaufen wenn der User sich abmeldet. Nach einer neuen Anmeldung kann man sich den virtuellen Schirm wieder aufrufen und sehen wie weit der Prozess fortgeschritten ist oder sogar beendet wurde.

Screen installieren

Unter debian / ubuntu ist das wie üblich sehr leicht, unter anderen Linux Distributionen sollte es auch entsprechend verfügbar sein:

root@server:~# apt-get install screen

Screen wird damit automatisch heruntergeladen und installiert.

Virtuelle Konsole starten

Ruft man screen ohne weitere Parameter auf, so wird automatisch eine neue virtuelle Konsole geöffnet, die auf Eingaben wartet. Allerdings kann (und wird) man auch ein Programm angeben, das gleich in dieser virtuellen Konsole ausgeführt werden soll:

root@server:~# screen /pfad/zum/lang/laufenden/programm <weitere parameter>

Das Programm wird gestartet und läuft wie üblich. Ohne das zuvor gestartete Programm nun zu beenden kann man mit der Tastenkombination STRG+A und danach D die virtuelle Konsole verlassen. Das Programm läuft jetzt weiter und man könnte die Verbindung trennen.

Arbeiten mit virtuellen Konsolen

Mit screen -ls kann man sich eine Liste aller aktiven virtuellen Konsolen ausgeben lassen um davon eine auszuwählen und sich damit zu verbinden:

root@server:~# screen -ls
There are screens on:
14545.pts-1.server (Detached)
13052.pts-1.server (Detached)
2 Sockets in /var/run/screen/S-root.

root@server:~#

Möchte man nun eine Konsole wieder nach vorne holen, gibt man screen -dr <Bezeichnung> ein. Wenn nur eine virtuelle Konsole existiert, kann man <Bezeichnung> auch weg lassen, dann wird automatisch die einzig vorhandene virtuelle Konsole aktiviert.

Linux Backups mit dd und Fortschrittsanzeige

dd ist wohl das Standardwerkzeug zum Erstellen von Festplattenimages unter Linux. Bei großen Festplatten (und mittlerweile sind alle Festplatten groß) dauert das eine ganze Weile, in der man sich gelegentlich fragt, wie weit der Vorgang denn abgeschlossen ist. dd besitzt nämlich keinerlei Fortschrittsbalken.

Mit einem kleinen Workaround lässt sich das aber herausfinden:

Läuft dd bereits, kann man in einer weiteren Konsole mit folgendem Befehl den aktuellen Stand ausgeben:

pkill -USR1 dd

Besser allerdings wäre, gleich zu GNU ddrescue zu greifen, auch bei Festplatten, die noch völlig intakt sind. Das geht nicht nur schneller, sondern bringt auch gleich eine Fortschrittsanzeige mit.

tweetbackcheck cronjob