[[Vorlage(Getestet, bionic, focal)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:mit Root-Rechten arbeiten:] }}} [[Inhaltsverzeichnis(1)]] [[Bild(Wiki/Icons/hd.png,64, align=left)]] [http://www.gnu.org/software/ddrescue/ddrescue.html GNU ddrescue] {en} ist ein Programm zur [:Datenrettung:] von defekten Datenträgern. Es liest Datenblöcke und rettet im ersten Durchlauf die Daten, die sich fehlerlos auslesen lassen. Zugriffsfehler merkt sich das Programm, um in weiteren Durchläufen zu versuchen, die entsprechenden Blöcke auszulesen. Dabei schreibt das Programm für Daten, die nicht mehr gelesen werden können, entsprechende Lückenstellen in die Zieldatei. Je nach Situation kann die Datenrettung einige Zeit dauern. gddrescue läuft automatisch ab. {{{#!vorlage Hinweis Achtung, Verwechslungsgefahr: Neben dem im Paket '''gddrescue''' enhaltenen Programm ddrescue (OHNE Unterstrich) gibt es auch noch das ältere Programm [http://www.garloff.de/kurt/linux/ddrescue dd_rescue] {en} (MIT Unterstrich). Letzteres hat mit dem hier vorgestellten Programm lediglich gemeinsam, dass es die Funktionalität von [:Shell/dd:dd] erweitert. Für dd_rescue gab es jedoch lediglich bis Ubuntu [:12.04:] ein Paket. Zur [bug:161126:Begründung] der Entfernung wurde darauf verwiesen, dass das neuere Programm zum einen einen viel größeren Funktionsumfang besäße und zum anderen nur wenige Funktionen des älteren nicht hätte. Die Anwendung von dd_rescue ist relativ simpel und wird in den Artikeln [:Festplatten_Problembehebung#Daten-von-defekten-Datentraegern-kopieren:Festplatten Problembehebung] sowie [http://www.linux-user.de/ausgabe/2004/08/048-dd-rescue/ Rettungsanker - Mit dd_rescue defekte Partition wiederherstellen] {de} behandelt. }}} = Installation = Folgendes Paket muss installiert[1] werden: {{{#!vorlage Paketinstallation gddrescue, universe }}} = Benutzung = Die Datenrettung wird über das Terminal[2] gestartet – je nach mitgegebenen [#Parameter Parametern] können einzelne Dateien oder ganze Medien ausgelesen werden. Mit [[Vorlage(Tasten, strg+c)]] kann der Vorgang jederzeit unterbrochen und bei Verwendung eines [#Mapfile Mapfiles] zu einem späteren Zeitpunkt an derselben Stelle fortgeführt werden. Der Grundaufruf sieht wie folgt aus: {{{#!vorlage Befehl ddrescue OPTIONEN QUELLE ZIEL LOGDATEI }}} {{{#!vorlage Hinweis Beim ersten Anzeichen eines drohenden Datenverlustes sollte eine Kopie angelegt werden, um den möglichen Datenverlust gering zu halten. }}} {{{#!vorlage Hinweis Es ist sinnvoll, vor dem Anschließen bzw. Einlegen von (möglicherweise) defekten externen beschreibbaren Datenträgern sicherheitshalber den [:Automount:] – zumindest temporär – zu deaktivieren und dies mit einem anderen Datenträger zu testen. }}} Grundsätzlich sollte bei jedem Befehl eine Logdatei angegeben werden, erst mit dieser Datei zeigt das Programm alle Fähigkeiten, die es hat. Die Logdatei wird schreibend und lesend von ddrescue verwendet. Ein guter Ansatz ist es, zunächst einmal zu versuchen alles zu sichern, was zum Zeitpunkt der Sicherung fehlerfrei ist, und keine Zeit auf fehlerhafte Blöcke zu verwenden: {{{#!vorlage Befehl ddrescue -n QUELLE ZIEL ddrescue.log }}} Erst danach startet man einen weiteren Durchlauf, in dem versucht wird, möglichst viele von den im ersten Schritt als kaputt markierten Daten doch noch zu retten: {{{#!vorlage Befehl ddrescue QUELLE ZIEL ddrescue.log }}} Dieses zweigeteilte Vorgehen ist zu bevorzugen, da durch die intensive Beanspruchung, noch Daten aus den defekten Blöcke zu bekommen, auch andere Teile der Medien zerstört werden können. {{{#!vorlage Warnung Falls zwischen den Durchläufen das System neu gestartet wird, so müssen vor dem zweiten Durchlauf sicherheitshalber die Gerätebezeichnungen überprüft werden, denn evtl. haben Letztere sich geändert (siehe dazu in der nachfolgenden Tabelle die Beschreibung zum [#Parameter Parameter] `-b`)! }}} == Parameter == ||<-2 tablestyle="width: 95%;" rowclass="titel"> Optionen|| || Parameter||Beschreibung|| ||`-b bytes`||Sektorengröße der Quelle in Bytes – `512` ist Standard (3.5"-Disketten + Festplatten: `512` / 5.25"-Disketten: `1024` / CD-ROMs: `2048`), im Zweifelsfall hilft bei {{{#!vorlage Befehl sudo fdisk -l }}} bzw. {{{#!vorlage Befehl sudo parted -l }}} die Ausgabe der {{{ Sector size (physical) }}}|| ||`-r, --max-retries=>n<`|| Maximale Versuche, um die Daten zu retten - bei `-1` wird das Programm so lange ausgeführt, bis alle Fehler behoben wurden.|| ||`-n, --no-scrape` || Keine "Kratz"-Phase; bzw. früher: Kein Teilen von nicht-lesbaren Blöcken und keine wiederholten Versuche, diese zu lesen. Schont die auszulesenden Medien. || ||`-v`||Mehr Informationen anzeigen lassen|| ||`--help`||Anzeige weiterer möglicher Parameter|| ||`mapfile`|| (Nur der Vollständigkeit halber, da genaugenommen kein Parameter:) Anlegen eines Mapfiles. Dies hat den Vorteil, dass man die Sicherung jederzeit mit [[Vorlage(Tasten, strg+c)]] abbrechen und später an dieser Stelle fortführen kann. Der Terminus `mapfile` ist übrigens beispielhaft zu verstehen, man kann stattdessen auch einen beliebigen anderen Dateinamen wählen. || Zusätzliche Informationen sind in den [:man:Manpages] zu finden. == Mapfile == Mit dem Mapfile können Daten sehr effizient wiederhergestellt werden. Auch das Zusammenführen von Backups (Datei, CD-ROM, Festplatte ...) ist so möglich. So kann das Programm aus mehreren Kopien eines Backups ggf. ein funktionierendes und fehlerfreies Backup erstellen. Das Mapfile kann mit einem Editor eingesehen und bearbeitet werden und ist in zwei Sektionen unterteilt: die Statuszeile und eine Liste der Datenblöcke. Eine Beispieldatei kann so aussehen: {{{ Mapfile. Created by GNU ddrescue version 1.23 # Command line: ddrescue -n /dev/sde sde.img ddrescue.log # Start time: 2022-01-13 19:56:28 # Current time: 2022-01-13 20:06:59 # Copying non-tried blocks... Pass 1 (forwards) # current_pos current_status current_pass 0x2BD090000 ? 1 # pos size status 0x00000000 0x00100000 + 0x00100000 0x00010000 * ... }}} Neben Informationen über die Datenträgerposition und die Größe erfährt man etwas über den Status. Jede Zeile in der Liste beschreibt einen Datenblock. Kommentarzeilen sind mit der Raute hinterlegt. ||<-2 tablestyle="width: 95%;" rowclass="titel"> Status|| || Meldung||Beschreibung|| ||`?`||kopieren nicht überprüfter Blöcke|| ||`*`||Zuschneiden der Blöcke|| ||`/`||Blöcke trennen|| ||`-`||Defekte Sektoren erneut überprüfen|| ||`F`||Füllen der angegebenen Blöcke|| ||`G`||Erstellung des Mapfile|| ||`+`||Beendet|| = Anwendungsbeispiele = Eine Vielzahl von Anwendungsbeispielen findet man auf [http://www.manpagez.com/info/ddrescue/ddrescue-1.11/ddrescue_6.php#SEC6 mangpagez.com] {en} hinterlegt. == Dateiwiederherstellung == Um eine einzelne Datei zu retten, gibt man z.B. Folgendes an: {{{#!vorlage Befehl ddrescue -v ~/Quelldatei.tar.bz2 ~/Zieldatei.tar.bz2 }}} == Laufwerk == === CD zu Image=== Um einen Datenträger zu retten, muss man das Laufwerk ansprechen, und das [:CD-Images:Image] wird im angegebenen Verzeichnis gesichert: {{{#!vorlage Befehl ddrescue -b2048 /dev/cdrom /home/BENUTZER/Datensicherung.iso mapfile }}} Ausgabe: {{{ Press Ctrl-C to interrupt rescued: 28459 kB, errsize: 3129 kB, current rate: 655 kB/s ipos: 31588 kB, errors: 48, average rate: 78762 B/s opos: 31588 kB Copying Data... }}} Im obigen Beispiel wurde ein Datenträger ausgelesen. Die ausgegebenen Werte bedeuten Folgendes: ||<-2 tablestyle="width: 95%;" rowclass="titel"> ddrescue|| || Ausgabe||Beschreibung|| ||`rescued:`||bisher gerettete Datenmenge|| ||`ipos:`||derzeitige Leseposition|| ||`opos:`||Schreibposition im Durchgang|| ||`errsize:`||fehlerhafte Datenmenge|| ||`errors:`||Anzahl gefundener Fehler|| ||`current rate:`||aktuelle Lesegeschwindigkeit|| ||`average rate:`||durchschnittliche Lesegeschwindigkeit|| ||`Copying data...`||Im ersten Durchgang wird angezeigt, dass Daten kopiert werden)|| ||`Splitting error areas...`||In den Folgedurchgängen werden fehlerbehaftete Bereiche unterteilt|| === Partition zu Partition === Es ist ebenfalls möglich, Datenträger (-Partitionen) zu kopieren, die nicht im System eingebunden (eingehängt) sind. Es wird eine 1:1-Kopie erstellt, kein Image. Hierzu werden als Quelle und Ziel von ddrescue die entsprechenden Geräte bzw. Partitionen angegeben. Es werden Root-Rechte [3] benötigt. {{{#!vorlage Befehl sudo ddrescue --force /dev/sdb1 /dev/sdc3 }}} Der Befehl kopiert die Partition `sdb1` auf die Partition `sdc3`. Man kann wieder Quelle und Ziel an die eigenen Bedürfnisse anpassen, so ist es z.B. beim Austausch von Festplatten möglich, als Quelle `/dev/sdb` und als Ziel `/dev/sdc` anzugeben. {{{#!vorlage Warnung Bei Kopien mit einem Datenträger oder einer Partition als Ziel werden alle auf dem Ziel befindlichen Daten gelöscht. Dies wird von gddrescue standardmäßig verweigert. Wenn man sich sicher ist, das man alle(!) Daten auf dem Zielgerät bzw. der Zielpartition nicht mehr benötigt, kann man die Option `--force` (bzw. kurz `-f`) verwenden um auf das Gerät zu schreiben. }}} === Partition zu Image === Ähnlich wie im vorherigen Kapitel beschrieben geht auch eine 1:1-Kopie von einer Datenträger-Partitionen in ein Image. Die Vorgaben sind die gleichen und der Ablauf ist ähnlich. Trotzdem gibt es ein paar kleine Unterschiede, die hier aufgezeigt werden sollen. {{{#!vorlage Befehl ddrescue --sparse --input-position=10GiB --size=20GiB /dev/sdb4 sdb4.img mapfile }}} Ausgabe: {{{ GNU ddrescue 1.23 Press Ctrl-C to interrupt Initial status (read from mapfile) (sizes limited to domain 10485760000 B to 31457280000 B of 986504495104 B) rescued: 4194 MB, tried: 46080 B, bad-sector: 46080 B, bad areas: 19 Current status ipos: 27510 MB, non-trimmed: 0 B, current rate: 512 B/s opos: 27510 MB, non-scraped: 0 B, average rate: 455 kB/s non-tried: 0 B, bad-sector: 484864 B, error rate: 0 B/s rescued: 20971 MB, bad areas: 200, run time: 10h 14m 20s pct rescued: 99.99%, read errors: 1006, remaining time: 0s time since last successful read: n/a Finished }}} Der Befehl kopiert einen Teil (20GiB ab Position 10GiB) der Partition `/dev/sdb4` in die Datei `sdb5.img` und benutzt dabei das `mapfile` für die Speicherung der schon bearbeiteten Sektoren. Wenn es das Filesystem auf welches das Image geschrieben wird zulässt wird eine Sparse (`--sparse`) Datei angelegt. Das bedeutet, dass längere Null-Byte folgen komprimiert werden und kein Plattenplatz belegen. {{{#!vorlage Befehl ls -lhs }}} Ausgabe: {{{ total 14G 14G -rw-r--r-- 1 root root 30G Aug 9 06:39 sdb4.img }}} Das spart Platz und später kann ein anderer Teil der Partition mit dem gleichen Mapfile auf die gleiche Datei gespeichert werden und diese wird transparent erweitert. Beispielsweise durch weglassen der `input-position` und `size` wird der Rest der Partition in das Image geschrieben. Somit kann das Kopieren der Partition aufgeteilt werden (z.B. kann die Festplatte zwischendurch abkühlen). {{{#!vorlage Befehl ddrescue --sparse /dev/sdb4 sdb4.img mapfile }}} Falls nur ein kleiner Teil der Festplatte fehlerhaft ist, kann man so schnell einen grossen Teil der Daten in die Datei übertragen. = Zusätzliche Programme = == Grafische Ansicht des mapfiles == Der Fortschritt der Datenrettung wird von `ddrescue` fortlaufend in das Mapfile geschrieben. Sofern man eine grafische Oberfläche benutzt kann der Fortschritt im Mapfile mit dem Programm `ddrescueview` beobachtet werden. {{{#!vorlage Paketinstallation ddrescueview, universe }}} {{{#!vorlage Befehl ddrescueview mapfile }}} [[Bild(ddrescueview.png)]] == NTFS optimierte Datenrettung == Das Paket `ddrutility` enthält ein Programm, welches den NTFS Master File Table ($MFT) einer Partition ausliest und daraus ein Mapfile für `ddrescue` erzeugt. Darin sind alle Bereiche ohne Daten mit `+` (Beendet) markiert und werden von `ddrescue` ausgelassen. {{{#!vorlage Paketinstallation ddrutility, universe }}} {{{#!vorlage Befehl ddru_ntfsbitmap /dev/sdb4 domain_logfile }}} Ausgabe: {{{ ddru_ntfsbitmap 1.5 20150111 Reading boot sector... GNU ddrescue 1.23 Press Ctrl-C to interrupt ipos: 0 B, non-trimmed: 0 B, current rate: 6 B/s opos: 0 B, non-scraped: 0 B, average rate: 5 B/s non-tried: 0 B, bad-sector: 0 B, error rate: 0 B/s rescued: 512 B, bad areas: 0, run time: 1m 26s pct rescued: 100.00%, read errors: 0, remaining time: n/a time since last successful read: 0s Finished Reading bitmap inode from mft... GNU ddrescue 1.23 Press Ctrl-C to interrupt ipos: 3221 MB, non-trimmed: 0 B, current rate: 57 B/s opos: 0 B, non-scraped: 0 B, average rate: 57 B/s non-tried: 0 B, bad-sector: 0 B, error rate: 0 B/s rescued: 16384 B, bad areas: 0, run time: 4m 47s pct rescued: 100.00%, read errors: 0, remaining time: n/a time since last successful read: 0s Finished ............Reading part 0 of $Bitmap........... GNU ddrescue 1.23 Press Ctrl-C to interrupt ipos: 3221 MB, non-trimmed: 0 B, current rate: 5881 kB/s opos: 30060 kB, non-scraped: 0 B, average rate: 2737 kB/s non-tried: 0 B, bad-sector: 0 B, error rate: 0 B/s rescued: 30109 kB, bad areas: 0, run time: 10s pct rescued: 100.00%, read errors: 0, remaining time: n/a time since last successful read: n/a Finished ............ Done reading part 0 of $Bitmap........... Creating ddrescue domain logfile... end = 986504495104 total_size = 986504495104 Finished creating logfile total= 986504495104 bytes used= 116783742976 (11.84%) free= 869720752128 (88.16%) ddru_ntfsbitmap took 387.712671 seconds to complete }}} Erzeugt werden diese Dateien: {{{ -rw-rw-rw- 1 root root 30105728 Aug 12 10:39 __bitmapfile -rw-rw-rw- 1 root root 512 Aug 12 10:39 __bootsec -rw-rw-rw- 1 root root 363 Aug 12 10:39 __bootsec.log -rw-rw-rw- 1 root root 711878 Aug 12 10:39 domain_logfile -rw-rw-rw- 1 root root 16384 Aug 12 10:39 __mftshort -rw-rw-rw- 1 root root 402 Aug 12 10:39 __mftshort.log -rw-rw-rw- 1 root root 415 Aug 12 10:39 _part0__bitmapfile.log }}} Das `domain_logfile` ist das Mapfile für die Partition. Diese Datei kann mit `ddrescueview` benutzt werden, um das Mapfile zu überlagern und somit anzeigen, welche Bereiche nicht "gerettet" werden müssen, da sie keine Daten enthalten. [[Bild(ddrescueviewdomain.png)]] Jetzt kann `ddrescue` mit dem `domain_logfile` gestartet werden, um nur die notwendigen Bereiche zu lesen. {{{#!vorlage Befehl ddrescue --sparse --domain-mapfile=domain_logfile /dev/sdb4 sdb4.img mapfile }}} == NTFS Verzeichnis == Im Falle eine ntfs-Partition lässt sich mit den Programmen aus dem Paket [:Windows-Partitionen_einbinden/NTFS-3G: ntfs-3g] Daten extrahieren. {{{#!vorlage Paketinstallation ntfs-3g, main }}} {{{#!vorlage Befehl ntfsls -f sdb4.img }}} Ausgabe: {{{ WARNING: Dirty volume mount was forced by the 'force' mount option. $Recycle.Bin $WinREAgent Documents and Settings Dokumente und Einstellungen hiberfil.sys Kpcms Logs MSOCache OEM ntfs_mst_post_read_fixup_warn: magic: 0x00000000 size: 1024 usa_ofs: 0 usa_count: 0: Invalid argument Record 4699 has no FILE magic (0x0) Could not decode the type of inode 4699 pagefile.sys PerfLogs Program Files Program Files (x86) ProgramData Programme Recovery System Volume Information Users Windows }}} Teile der Partition sind in dieses Fall nicht lesbar. Eventuell bringt ein nochmaliger Leseversuch auch diese Dateien zurück. = Problembehebung = Manchmal kann es vorkommen dass beim Auslesen der (externen) Festplatte plötzlich nur noch Lesefehler auftreten und erst nach Aus- und erneutem Anstecken der Platte wieder Daten gelesen werden können. In diesem Fall kann man versuchen die eventuell vorhandene [wikipedia:Time-Limited_Error_Recovery:TLER] Funktion der Festplatte zu akvieren. {{{#!vorlage Hinweis Die Aktivierung der Funktion kann dazu führen dass in Summe weniger Daten gerettet werden da weniger Zeit für die hardware-internen Fehlerkorrekturmechanismen aufgewendet wird. Sie sollte entsprechend nicht standardmäßig aktiviert werden. }}} Um zu prüfen ob diese vorhanden ist wird das Paket [:Festplattenstatus/#smartctl: smartmontools] benötigt. Anschließend ist der folgende Befehl in einem Terminal zu verwenden: {{{#!code Befehl sudo smartctl -l scterc /dev/sdX }}} wobei X entsprechend des fehlerhaften Datenträgers anzupassen ist. Lautet die Ausgabe {{{ SCT Error Recovery Control: Read: Disabled Write: Disabled }}} so ist die Funktion aber vorhanden, aber deaktiviert. Aktiviert werden kann sie mit dem Befehl {{{#!code Befehl sudo smartctl -l scterc,Y,Z /dev/sdX }}} Y und Z stehen hierbei für die Zeit in 1/10 s welche versucht werden soll einen Lese- bzw. Schreibfehler zu korrigieren. = Links = * [http://www.manpagez.com/info/ddrescue/ddrescue-1.11/ manpagez.com] {en} * [http://www.forensicswiki.org/wiki/Ddrescue forensicswiki.org] {en} #tag: Shell, Datenrettung