HFS+ (HFS Plus, Hierarchical File System Plus) ist ein von Apple® entwickeltes Dateisystem.
hfsprescue kann Dateien von einer HFS+ formatierten Partition wiederherstellen. Sie können Dateien und Verzeichnisse wiederherstellen, selbst wenn das Betriebssystem nicht mehr auf die Partition zugreifen kann. Ein Nebeneffekt ist, daß ebenfalls gelöschte Dateien wieder hergestellt werden können. Das beschädigte HFS+ Dateisystem wird nur "lesend" geöffnet um keine weiteren Beschädigungen zu verursachen. Sie benötigen einen weiteren Datenträger, aufdem die geretteten Daten gespeichert werden. Die Dateien werden im aktuellen Verzeichnis, in dem hfsprescue gestartet wird, in das 'restored/' Verzeichnis gespeichert.
Das Programm hat keine grafische Benutzeroberfläche. Es wird von der Kommandozeile gestartet.
hfsprescue läuft unter Linux, Mac OS X und FreeBSD.
hfsprescue unterstützt HFS+ compression (resource fork).
Aktuelle Version: 3.6, 07/Apr/2023
hfsprescue-3.6.tar.gz (07/04/2023) Source code
Veraltete Versionen. Sollten nicht mehr verwendet werden.
hfsprescue-3.5.tar.gz (26/04/2020) Source CodeMan muß 6 Schritte zum Wiederherstellen durchführen:
Nach Dateien scannen.
hfsprescue -s1 <device node|image file> [-b <block size>] [-o <offset in bytes>] [-d <working / destination directory>] [-f|--force]
Dateinamen Datenbank optimieren.
hfsprescue -s2 [--utf8len <value 1 to 5>] [--future-days <days>] [-d <working / directory>]
Dateien wiederherstellen.
hfsprescue -s3 <device node|image file> [-b <block size>] [-o <offset in bytes>] [-d <working / directory>] [--vh-file <file name>] [--eof-file <file name>] [-c <file number>] [--alternative]
Verzeichnisstruktur wiederherstellen.
hfsprescue -s4 [-d <working / directory>]
Dateien in die richtigen Verzeichnisse verschieben.
hfsprescue -s5 [-d <working / directory>]
Letzter Schritt. Abschließende Aufgaben erledigen
hfsprescue -s6 [-d <working / directory>] [-k]
Am Ende jedes Schrittes informiert hfsprescue wie der Befehl für den nächsten Schritt aussieht.
Ein einfaches Beispiel für die 6 Schritte:
hfsprescue -s1 /dev/sdb2
hfsprescue -s2
hfsprescue -s3 /dev/sdb2
hfsprescue -s4
hfsprescue -s5
hfsprescue -s6
hfsprescue hat zusätzliche Funktionen um Sie zu unterstützen:
• Unicode Text suchen (praktisch bei kaputter oder gelöschter Partitionstabelle).
• Bytes einer Datei suchen (praktisch bei kaputter oder gelöschter Partitionstabelle).
• Auflisten der gefundenen Dateien.
• Exportieren der gefundenen Dateien im CSV Format.
• Wiederherstellen einzelner Dateien.
• Wiederherstellen Dateien aus einer Liste.
• Auffinden möglicher Positionen des Extents Overflow File.
• Speichern des Extents Overflow File.
• Auffinden des HFS+ Volume Headers und dem Start der Partition.
• Auffinden des HFS+ Alternate Volume Headers.
• Speichern eines HFS+ Volume Headers.
• Leere Verzeichnise entfernen.
hfsprescue [-h|--help] [--version]
hfsprescue -s1 <device node|image file>
[-b <block size>]
[-o <offset in bytes>]
[-d <working / destination directory>]
[-f|--force]
hfsprescue -s2 [--utf8len <value 1 to 5>] [--future-days <days>]
hfsprescue -s3 <device node|image file>
[-b <block size>]
[-o <offset in bytes>]
[-d <working directory>]
[--vh-file <file name>]
[--eof-file <file name>]
[-c <file number>]
[--file-list <file name>]
[--file-list-csv <file name>]
[--alternative]
[--ignore-blocks]
[--ignore-file-error]
hfsprescue -s4 [-d <working directory>]
hfsprescue -s5 [-d <working directory>]
hfsprescue -s6 [-d <working directory>] [-k]
hfsprescue --find <device node|image file>
[-ff <num bytes> <file1> [file2] [...]]
[-fs <string>]
[-o <offset in bytes>]
hfsprescue --list [--slash] [-d <working directory>]
hfsprescue --csv <file name> [--slash] [-d <working directory>]
hfsprescue --one-file <device node|image file> <file number>
[-b <block size>]
[-o <offset in bytes>]
[-d <working directory>]
[--vh-file <file name>]
[--eof-file <file name>]
[--alternative]
hfsprescue --find-eof
[-b <block size>]
[-o <offset in bytes>]
[--vh-file <file name>]
hfsprescue --extract-eof <device node|image file>
[ [--start-block <number>] < [--last-block <number>] | [--num-blocks <number>] > ]
[--eof-file <output file>]
[--vh-file <file name>]
hfsprescue --find-vh
[-o <offset in bytes>]
[--first]
[-f|--force]
[-v|--verbose]
hfsprescue --find-avh
[--first]
[-f|--force]
[-v|--verbose]
hfsprescue --extract-vh <device node|image file> <LBA sector>
[--vh-file <output file>]
hfsprescue --remove-empty-dirs
[--dir <directory>]
[-f|--force]
-h, --help | Hilfetext anzeigen. | |
--version | Programmversion anzeigen. |
Nach Dateien scannen.
-s1 <device node|image file> | Schritt 1 durchführen. Es muß ein Device Node oder Image File angegeben werden. | |
-b <block size> | Blockgröße in Bytes setzen. Nützlich wenn der Volume Header unbrauchbar ist. | |
-f, --force | Log Dateien überschreiben. | |
-o <offset> | Start Offset der Partition in Bytes angeben. Nützlich wenn die Partitionstabelle beschädigt oder gelöscht wurde. Siehe hier für eine Beschreibung um den Offset zu berechnen. | |
-d <working / destination directory> | Arbeits- bzw. Zielverzeichnis angeben. |
Die Datenbank mit den Dateinamen optimieren.
-s2 | Schritt 2 durchführen. | |
--utf8len <value 1 to 5> | Wird verwendet um falsche Dateien mittels fehlerhaftem Dateinamen herauszufiltern. Sollte man keine Dateien mit asiatischen Zeichen haben, dann benötigt man diese Option nicht. Der standard Wert ist 1. Wenn man Dateien mit asiatischen Dateinamen hat, dann verwendet man den Wert 2. Die Werte 3 bis 5 sollten nicht verwendet werden. | |
--future-days <days> | Wird verwendet um falsche Dateien mittels Erstellungsdatum herauszufiltern. Dateien mit einem Erstellungsdatum, das in der Zukunft liegt, werden ignoriert. Standardwert ist 7. | |
-d <working directory> | Arbeitsverzeichnis angeben. |
Dateien wiederherstellen.
-s3 <device node|image file> | Schritt 3 durchführen. Es muß ein Device Node oder Image File angegeben werden. | |
-b <block size> | Blockgröße in Bytes setzen. Nützlich wenn der Volume Header unbrauchbar ist. | |
-c <file number> | Ab angegebener Dateinummer <file number> den Wiederherstellungsprozess fortsetzen. | |
-o <offset> | Start Offset der Partition in Bytes angeben. Nützlich wenn die Partitionstabelle beschädigt oder gelöscht wurde. Siehe hier für eine Beschreibung um den Offset zu berechnen. | |
-d <working directory> | Arbeitsverzeichnis angeben. | |
--vh-file <file name> | Volume Header Datei. Siehe auch hier | |
--eof-file <file name> | Extents Overflow File Datei. Siehe auch hier | |
--file-list <file name> | Dateien mit einer Liste wiederherstellen. Weitere Informationen siehe hier | |
--file-list-csv <file name> | Dateien mit einer Liste im CSV Format wiederherstellen. Weitere Informationen siehe hier | |
--alternative | Alternativen Dateinamen generieren wenn die Datei bereits im Verzeichnis existiert. Dies kann bei älteren Versionen der Datei oder gelöschten Versionen der Datei passieren. Siehe hier für Details. | |
--ignore-blocks | Dateien die mehr Blocks reserviert haben als nötig, sollen nicht übersprungen werden. Dies betrifft Dateien die größer als 1 GB sind. Betroffene Dateien werden in der Logdatei von Schritt 3 mit '_too_many_blocks_skipped_' gekennzeichnet. | |
--ignore-file-error | Nicht stoppen wenn beim Erstellen der Datei ein Fehler auftritt. Betroffene Dateien werden in der Logdatei von Schritt 3 mit '_file_create_error_' gekennzeichnet. |
Verzeichnisstruktur wiederherstellen.
-s4 | Schritt 4 durchführen. | |
-d <working directory> | Arbeitsverzeichnis angeben. |
Verschieben der wiederhergestellten Dateien in die richtigen Verzeichnisse.
-s5 | Schritt 5 durchführen. | |
-d <working directory> | Arbeitsverzeichnis angeben. |
Letzter Schritt, abschließende Arbeiten.
-s6 | Schritt 6 durchführen. | |
-d <working directory> | Arbeitsverzeichnis angeben. | |
-k | mkdir.sh und hfsprescue_dir_id.tmp Dateien nicht löschen. |
Datensuche auf Sektorenebene. Siehe hier für mehr Details.
--find <device node|image file> | Finde Daten. Es muß der Device Node oder die Image Datei angegeben werden. | |
-ff <num bytes> <file1> [file2] [...] | Suche nach NUM Bytes der angegebenen Dateien. | |
-fs <string> | Suche nach dem String. Der String wird in Unicode umgewandelt. | |
-o <offset in bytes> | Starte die Suche vom Offset. |
Auflisten der gefundenen Dateien. Siehe hier für mehr Details.
--list | Dieser Parameter listet alle gefundenen Dateien auf. Der Parameter kann erst nach dem Schritt 2 durchgeführt wurde verwendet werden. | |
--slash | Mac OS X erlaubt das Zeichen '/' in Dateinamen im GUI. Aus Verzeichniskompatibilitätsgründen wird '/' zu ':' umgewandelt. Verwenden Sie --slash wenn beim Auflisten das '/' Zeichen statt ':' stehen soll. | |
-d <working directory> | Arbeitsverzeichnis angeben. |
Gefundene Dateien als CSV Datei exportieren. Siehe hier für Details.
--csv |
Exportiere die Liste der gefundenen Dateien als CSV Datei. Der Parameter kann erst nachdem Schritt 2 durchgeführt wurde verwendet werden. | |
--slash | Mac OS X erlaubt das Zeichen '/' in Dateinamen im GUI. Aus Verzeichniskompatibilitätsgründen wird '/' zu ':' umgewandelt. Verwenden Sie --slash wenn im Export das '/' Zeichen statt ':' stehen soll. | |
-d <working directory> | Arbeitsverzeichnis angeben. |
Nur eine bestimmte Datei der gefundenen wiederherstellen. Der Parameter kann erst nach dem Schritt 2 durchgeführt wurde. Siehe hier für Details.
--one-file <device node|image file> <file number> |
Device Node oder Image File und die Nummer der wiederherzustellenden Datei. Beide Parameter müssen angegeben werden. | |
-b <block size> | Blockgröße in Bytes setzen. Nützlich wenn der Volume Header unbrauchbar ist. | |
-o <offset> | Start Offset der Partition in Bytes angeben. Nützlich wenn die Partitionstabelle beschädigt oder gelöscht wurde. Siehe hier für eine Beschreibung um den Offset zu berechnen. | |
-d <working directory> | Arbeitsverzeichnis angeben. | |
--vh-file <file name> | Volume Header Datei. Siehe auch hier | |
--eof-file <file name> | Extents Overflow File Datei. Siehe auch hier | |
--alternative | Wähle alternativen Dateinamen, wenn die wiederherzustellende Datei bereits im Verzeichnis existiert. Dies kann bei älteren Versionen oder gelöschten Versionen der Datei passieren. Siehe hier für Details. |
Scanne nach möglichen Start Blocks. Siehe hier für Details.
--find-eof <device node|image file> | Es muß der Device Node oder die Image Datei angegeben werden. | |
-b <block size> | Blockgröße in Bytes setzen. Nützlich wenn der Volume Header unbrauchbar ist. | |
-o <offset> | Startoffset der Partition in Bytes. Nützlich wenn die Partitionstabelle gelöscht oder beschädigt ist. Siehe hier für eine Beschreibung wie man den Offset berechnet. |
Siehe hier für Details.
--extract-eof <device node|image file> | Es muß der Device Node oder die Image Datei angegeben werden. | |
--start-block <number> | Start Block des Extents Overflow Files. Benötigt '--last-block' oder '--num-blocks'. | |
--last-block <number> | Letzter Block des Extents Overflow Files. Benötigt '--start-block'. | |
--num-blocks <number> | Anzahl der Blocks des Extents Overflow Files. Benötigt '--start-block'. | |
--eof-file <output file> | Speichern unter Dateiname. | |
--vh-file <file name> | Volume Header Dateiname. |
Scanne nach möglichen Positionen des Volume Headers der Partition. Siehe hier für Details.
--find-vh <device node|image file> | Es muß der Device Node oder die Image Datei angegeben werden. | |
-o <offset in bytes> | Starte die Suche vom Offset. | |
--first | Nur den ersten HFS+ Volume Header anzeigen. | |
-f, --force | Zeige mögliche Volume Header Position auch wenn im lastMountVersion Feld ein anderes Betriebssystem als Mac OS X oder Linux gespeichert ist. | |
-v, --verbose | Detailinformationen anzeigen. |
Scanne nach möglichen Positionen des Alternate Volume Headers. Siehe hier für Details.
--find-avh <device node|image file> | Es muß der Device Node oder die Image Datei angegeben werden. | |
--first | Nur den ersten HFS+ Alternate Volume Header anzeigen. | |
-f, --force | Zeige mögliche Volume Header Position auch wenn im lastMountVersion Feld ein anderes Betriebssystem als Mac OS X oder Linux gespeichert ist. | |
-v, --verbose | Detailinformationen anzeigen. |
Siehe hier für Details.
--extract-vh <device node|image file> | Es muß der Device Node oder die Image Datei angegeben werden. | |
LBA sector | Pflichtfeld. Sektor Nummer des Volume Headers. | |
--vh-file <output file> | Speichern unter Dateiname. |
Siehe hier für mehr Informationen.
--remove-empty-dirs | Ohne weitere Parameter wird das './restored' Verzeichnis verwendet. | |
--dir <directory> | Das angegebene Verzeichnis durchsuchen und leere Verzeichnisse entfernen. | |
-f, --force | Keine Abfrage ob gestartet werden soll. |
Beim Wiederherstellen der Dateien kann es passieren das im Verzeichnis 2 Dateien mit dem selben Namen wiederhergestellt werden. Diese Situation entsteht wenn es eine ältere/gelöschte Version auf der Festplatte gibt. Die Standardeinstellung von hfsprescue ist, das nur die neueste Version der Datei (basierend am Datei Timestamp) wiederhergestellt wird. Sollte man allerdings auch gelöschte Versionen der Datei wiederherstellen wollen, dann kann man den '--alternative' Parameter verwenden.
Mit diesem Parameter erstellt hfsprescue die Datei mit einem alternativem Namen. Dieser Name ist eine Kombination vom original Namen, der Catalog ID und falls nötig wird eine laufende Nummer hinzugefügt.
Hinweis: Die älteren bzw. gelöschten Versionen der Datei sind höchst wahrscheinlich defekt.
Man kann alle gefundenen Dateien auflisten, nachdem Schritt 2 '-s2' abgeschlossen wurde.
Felder: File Number: File Name, File Size, File RAW Time, File Date/Time, File Start Block
Befehl: hfsprescue --list
Beispielausgabe:
1: permStore, 66097 bytes, 1438688944, Tue Aug 4 13:49:04 2015, Start block 360458 2: reverseDirectoryStore, 65536 bytes, 1438688940, Tue Aug 4 13:49:00 2015, Start block 48344 3: reverseDirectoryStore.shadow, 3136 bytes, 1435230435, Thu Jun 25 13:07:15 2015, Start block 48375 4: reverseStore.updates, 1 bytes, 1438688946, Tue Aug 4 13:49:06 2015, Start block 557113 5: shutdown_time, 4 bytes, 1438067146, Tue Jul 28 09:05:46 2015, Start block 393216 6: store.db, 118784 bytes, 1438688947, Tue Aug 4 13:49:07 2015, Start block 48294 7: store.updates, 3 bytes, 1438688946, Tue Aug 4 13:49:06 2015, Start block 557112 8: store_generation, 4 bytes, 1435230434, Thu Jun 25 13:07:14 2015, Start block 48361 9: tmp.Cab, 0 bytes, 1435230434, Thu Jun 25 13:07:14 2015, Start block 0 10: tmp.Lion, 0 bytes, 1435230434, Thu Jun 25 13:07:14 2015, Start block 0 11: tmp.SnowLeopard, 0 bytes, 1435230434, Thu Jun 25 13:07:14 2015, Start block 0 12: tmp.spotlight.loc, 9961 bytes, 1438141713, Wed Jul 29 05:48:33 2015, Start block 458757 13: tmp.spotlight.state, 4096 bytes, 1438688947, Tue Aug 4 13:49:07 2015, Start block 622598 14: fseventsd-uuid, 36 bytes, 1438141708, Wed Jul 29 05:48:28 2015, Start block 393217 15: reverseStore.updates, 1 bytes, 1438688947, Tue Aug 4 13:49:07 2015, Start block 622602 16: store.updates, 3 bytes, 1438688947, Tue Aug 4 13:49:07 2015, Start block 622601 17: live.1.shadowIndexGroups, 6 bytes, 1438688945, Tue Aug 4 13:49:05 2015, Start block 163913 18: live.1.shadowIndexHead, 4096 bytes, 1438688946, Tue Aug 4 13:49:06 2015, Start block 589824 19: live.2.directoryStoreFile, 4096 bytes, 1438688943, Tue Aug 4 13:49:03 2015, Start block 524338 20: live.2.directoryStoreFile.shadow, 1088 bytes, 1438688947, Tue Aug 4 13:49:07 2015, Start block 524374 21: live.2.indexArrays, 4096 bytes, 1438688947, Tue Aug 4 13:49:07 2015, Start block 524322 22: live.2.indexCompactDirectory, 1024 bytes, 1438688947, Tue Aug 4 13:49:07 2015, Start block 524321 ==== CUT =====
Hinweis:
• Bei Dateien die das Extents Overflow File brauchen steht '_F_EOF_'.
• Bei Dateien die Komprimiert sind steht '_F_COMPRESSED_'.
Der '--list' Parameter kann mit 'grep' verwendet werden um die Dateinummer (file number) zu erhalten, wenn man eine einzelne Datei wiederherstellen will.
Befehl: hfsprescue --list | grep mynotes.txt
Beispielausgabe:
2023: mynotes.txt, 966097 bytes, 1438688944, Tue Aug 4 13:49:04 2015, Start block 560458Die Dateinummer ist 2023.
Man kann die Liste der gefundenen Dateien im CSV Format exportieren, nachdem Schritt 2 '-s2' abgeschlossen wurde. Die Felder sind durch Semikolons ';' getrennt.
Felder: Number, File Name, Parent ID, Catalog ID, File Size, File RAW Time, File Time, Start block, HFS+ Compressed, EOF (ExtentsOverflowFile)
Befehl: hfsprescue --csv files.csv
Beispieldatei:
"Number";"File Name";"Parent ID";"Catalog ID";"File Size";"File RAW Time";"File Time";"Start block";"HFS+ Compressed";"EOF"; 1;"permStore";26;106;66097;1438688944;"Tue Aug 4 13:49:04 2015";360458;"No";"No" 2;"reverseDirectoryStore";26;62;65536;1438688940;"Tue Aug 4 13:49:00 2015";48344;"No";"No" 3;"reverseDirectoryStore.shadow";26;78;3136;1435230435;"Thu Jun 25 13:07:15 2015";48375;"No";"No" 4;"reverseStore.updates";26;96;1;1438688946;"Tue Aug 4 13:49:06 2015";557113;"No";"No" 5;"shutdown_time";26;108;4;1438067146;"Tue Jul 28 09:05:46 2015";393216;"No";"No" 6;"store.db";26;60;118784;1438688947;"Tue Aug 4 13:49:07 2015";48294;"No";"No" 7;"store.updates";26;95;3;1438688946;"Tue Aug 4 13:49:06 2015";557112;"No";"No" 8;"store_generation";26;65;4;1435230434;"Thu Jun 25 13:07:14 2015";48361;"No";"No" 9;"tmp.Cab";26;33;0;1435230434;"Thu Jun 25 13:07:14 2015";0;"No";"No" 10;"tmp.Lion";26;31;0;1435230434;"Thu Jun 25 13:07:14 2015";0;"No";"No" 11;"tmp.SnowLeopard";26;30;0;1435230434;"Thu Jun 25 13:07:14 2015";0;"No";"No" 12;"tmp.spotlight.loc";26;98;9961;1438141713;"Wed Jul 29 05:48:33 2015";458757;"No";"No" 13;"tmp.spotlight.state";26;63;4096;1438688947;"Tue Aug 4 13:49:07 2015";622598;"No";"No" 14;"fseventsd-uuid";28;29;36;1438141708;"Wed Jul 29 05:48:28 2015";393217;"No";"No" 15;"reverseStore.updates";26;96;1;1438688947;"Tue Aug 4 13:49:07 2015";622602;"No";"No" 16;"store.updates";26;95;3;1438688947;"Tue Aug 4 13:49:07 2015";622601;"No";"No" 17;"live.1.shadowIndexGroups";26;132;6;1438688945;"Tue Aug 4 13:49:05 2015";163913;"No";"No" 18;"live.1.shadowIndexHead";26;221;4096;1438688946;"Tue Aug 4 13:49:06 2015";589824;"No";"No" 19;"live.2.directoryStoreFile";26;194;4096;1438688943;"Tue Aug 4 13:49:03 2015";524338;"No";"No" ==== CUT =====
Mit hfsprescue kann man auch einzelne Dateien wiederherstellen. Allerdings muß man dazu den zweiten Schritt 2 '-s2' abgeschlossen haben.
hfsprescue --one-file <device node|image file> <file number> [-b <block size>] [-o <offset in bytes>] [-d <working directory>] [--vh-file <file name>] [--eof-file <file name>] [--alternative]
Man benötigt die Dateinummer (file number) um eine einzelne Datei wiederherstellen zu können. Sie erhalten die Nummer mit 'hfsprescue --list' oder aus dem CSV Export.
Beispiel, wiederherstellen der Datei 'mynotes.txt':
Befehl 1: hfsprescue --list | grep mynotes.txt
Beispielausgabe:
2023: mynotes.txt, 966097 bytes, 1438688944, Tue Aug 4 13:49:04 2015, Start block 560458Die Dateinummer ist 2023.
Befehl 2: hfsprescue --one-file /dev/sdb2 2023
Wenn die Datei wiederhergestellt wurde, dann befindet sich die Datei im 'restored/' Verzeichnis.
Wenn Sie nicht alle Dateien im Schritt 3 wiederherstellen wollen, dann können Sie mit '--file-list <file name>' oder '--file-list-csv <file name>' ausgewählte Dateien wiederherstellen bzw. ausschließen.
Das Format der Datei ist sehr einfach. In jeder Zeile steht die Dateinummer (aus --list), abschließend mit einem Doppelpunkt. Hinter dem Doppelpunkt kann ein beliebiger Text stehen. Der Text hinter dem Doppelpunkt wird ignoriert.
Beispieldatei mit 10 Dateien zum Wiederherstellen:
1003: 283: 553: 18: live.1.shadowIndexHead, 4096 bytes, 1438688946, Tue Aug 4 13:49:06 2015, Start block 589824 19: live.2.directoryStoreFile, 4096 bytes, 1438688943, Tue Aug 4 13:49:03 2015, Start block 524338 20: live.2.directoryStoreFile.shadow, 1088 bytes, 1438688947, Tue Aug 4 13:49:07 2015, Start block 524374 21: live.2.indexArrays, 4096 bytes, 1438688947, Tue Aug 4 13:49:07 2015, Start block 524322 22: live.2.indexCompactDirectory, 1024 bytes, 1438688947, Tue Aug 4 13:49:07 2015, Start block 524321 450: 451:
Mit dieser Funktion kann man einfach Dateien von der Wiedherstellung ausschließen oder nur bestimmte Dateien wiederherstellen.
Da im Schritt 4 die komplette Verzeichnisstruktur wiederhergestellt wird (egal ob nur ein paar Dateien ausgewählt wurden), kann man am Ende nach '-s6', die leeren Verzeichnisse mit 'hfsprescue --remove-empty-dirs' entfernen.
Im folgenden Beispiel wird eine Liste erstellt um Dateien mit den Endungen '.download' und '.part' nicht wieder herzustellen.
hfsprescue --list | grep -v ".download, " | grep -v ".part, " > files.list
• 'grep' wird mit '-v' verwendet um den anschließenden Text bei der Textausgabe zu verhindern.
• Da nur Dateien mit den Endungen herausgefiltert werden sollen, wird ', ' am Ende angegeben. '--list' schreibt ', ' an das Ende des Dateinamens.
• Mit '>' wird eine neue Datei erstellt. Die Ausgabe des 'grep' Befehls wird in die Datei umgeleitet (geschrieben).
Der Schritt 3 Befehl sieht dann folgendermaßen aus: hfsprescue -s3 /dev/sdb1 --file-list files.list
Im folgenden Beispiel wird eine Liste erstellt um Dateien mit Änderungsdatum 4., 5. und 12. August 2015 wiederherstellen.
hfsprescue --list | grep " Aug 4 " | grep " 2015, " > files.list
hfsprescue --list | grep " Aug 5 " | grep " 2015, " >> files.list
hfsprescue --list | grep " Aug 12 " | grep " 2015, " >> files.list
• 'grep' wird verwendet um nur den anschließenden Text aus der Textausgabe herauszufiltern.
• Da die Jahreszahl vom Monat und Tag mit der Uhrzeit unterbrochen ist, werden 2 'grep' Befehle verwendet.
• Im ersten Schritt wird mit '>' eine neue Datei erstellt. Die Ausgabe des 'grep' Befehls wird in die Datei umgeleitet (geschrieben).
• In allen weiteren Schritten wird '>>' verwendet um die Ausgabe von 'grep' an die bestehende Datei anzuhängen.
Der Schritt 3 Befehl sieht dann folgendermaßen aus: hfsprescue -s3 /dev/sdb1 --file-list files.list
Im folgenden Beispiel wird eine Liste erstellt um Dateien mit der Größe von 0 Bytes nicht wieder herzustellen.
hfsprescue --list | grep -v ", 0 bytes, " > files.list
• 'grep' wird mit '-v' verwendet um den anschließenden Text bei der Textausgabe zu verhindern.
• Mit '>' wird eine neue Datei erstellt. Die Ausgabe des 'grep' Befehls wird in die Datei umgeleitet (geschrieben).
Der Schritt 3 Befehl sieht dann folgendermaßen aus: hfsprescue -s3 /dev/sdb1 --file-list files.list
Um komplexere Filter anzuwenden verwenden Sie ein Tabellenkalkulationsprogramm wie z.B. Excel oder das LibreOffice Spreadsheet.
Exportieren Sie die Dateinamenliste mit '--csv'. Importieren Sie die CSV Datei in Ihrem Tabellenprogramm und führen Sie die gewünschten Änderungen durch. Dann exportieren/speichern Sie die Daten in eine neue CSV Datei. Das Trennzeichen muss ein Semicolon ';' sein. Die Titelzeile (erste Zeile) wird von hfsprescue ignoriert.
Beispieldatei:
"Number";"File Name";"Parent ID";"Catalog ID";"File Size";"File RAW Time";"File Time";"Start block";"HFS+ Compressed";"EOF" 14;"fseventsd-uuid";28;29;36;1438141708;"Wed Jul 29 05:48:28 2015";393217;"No";"No" 15;"reverseStore.updates";26;96;1;1438688947;"Tue Aug 4 13:49:07 2015";622602;"No";"No" 16;"store.updates";26;95;3;1438688947;"Tue Aug 4 13:49:07 2015";622601;"No";"No" 17;"live.1.shadowIndexGroups";26;132;6;1438688945;"Tue Aug 4 13:49:05 2015";163913;"No";"No" 18;"live.1.shadowIndexHead";26;221;4096;1438688946;"Tue Aug 4 13:49:06 2015";589824;"No";"No" 19;"live.2.directoryStoreFile";26;194;4096;1438688943;"Tue Aug 4 13:49:03 2015";524338;"No";"No"
Im Volume Header und Alternate Volume Header werden wichtige Informationen zum HFS+ Dateisystem gespeichert. Beide können verwendet werden um den Start der Partition zu ermitteln.
Parameter: --find-vh / --find-avh
Der Volume Header befindet sich 1024 Bytes nach dem Start der Partition und eignet sich somit gut zum Auffinden des Partitionsstartes. Weiters beinhaltet der Volume Header unter anderem die Information wo das Extents Overflow File gespeichert ist.
Wenn die Partitionstabelle defekt ist, oder mit einem Festplatten Image gearbeitet wird, dann ist es notwendig den Start der Partition mit dem kaputten HFS+ Dateisystems zu kennen. Eine Möglichkeit den Startoffset der Partition zu ermitteln ist die Suche nach dem HFS+ Volume Header mit dem '--find-vh' Parameter. Ein HFS+ Dateisystem hat ein Backup vom Volume Header (den Alternate Volume Header). Daher wird hfsprescue mehrere Volume Header finden. Wenn nur eine HFS+ Partition auf der der Festplatte ist, dann sollte der erste gefundene Eintrag der Richtige sein. Man kann den Parameter '--first' verwenden wenn nur der erste Treffer angezeigt werden soll.
Ein Kriterium zum Auffinden des Volume Headers ist für hfsprescue der Inhalt des 'lastMountedVersion' Feldes. Dieses Feld wird vom Betriebssystem gesetzt, das als letztes die Partition gemountet hat. Nur Mac OS X und Linux werden von hfsprescue als gültig angesehen. Wenn das Mounten ein anderes Betriebssystem durchgeführt hat, dann können Sie den '-f' Parameter verwenden um die Einschränkung zu deaktivieren. Wenn Sie zusätzliche Informationen während der Suche erhalten wollen, dann verwenden Sie den '-v' Parameter.
Wenn Sie '-o <offset in bytes>' verwenden, dann beginnt die Suche beim Offset und ignoriert den Speicherplatz davor.
Das Suchergebnis wird in der Datei 'hfsprescue-data/find-vh.log' abgespeichert.
hfsprescue --find-vh [-o <offset in bytes>] [--first] [-f|--force] [-v|--verbose]
Beispiel: Nur den Ersten gefundenen HFS+ Volume Header anzeigen.
Befehl: hfsprescue --find-vh /dev/sdb --first
Beispielausgabe:
*** Stop searching after the first Volume Header has been found. Scanned 200 MB. ============================================ A Volume Header has been found. Partition start: 209735680 (Byte), 0xc805000, 409640 (LBA Sector), at 200 MB Volume Header start: 209736704 (Byte), 0xc805400, 409642 (LBA Sector), at 200 MB Signature: 0x2b48, H+ LastMountedVersion: H+Lx, last mount by Linux. FileCount: 4362 DirCount: 144 BlockSize: 4096 TotalBlocks: 244190208 AllocationFile StartBlock: 1 ExtentsOverflowFile StartBlock: 7454 CatalogFile StartBlock: 10270Der Start der Partition ist beim Offset '209735680'.
Verwenden Sie diesen Wert für den '-o <offset in bytes>' Parameter in Kombination mit '-s3' bzw. '--one-file'.
Beispiel: hfsprescue -s3 /dev/sdb -o 209735680
Falls es nötig ist, können Sie den Volume Header in einer Datei speichern. Siehe hier.
Beispiel: hfsprescue --extract-vh /dev/sdb 409642
Der Alternate Volume Header ist ein Backup vom Volume Header und wird 1024 Bytes vor dem Ende der Partition gespeichert. Mit dem Wissen der Position des Alternate Volume Header, der Block Size und der Total Blocks kann man den Start der Partition errechnen.
Die Suche nach dem Alternate Volume Header verläuft vom Ende der Festplatte zum Anfang.
Das Suchergebnis wird in der Datei 'hfsprescue-data/find-avh.log' abgespeichert.
hfsprescue --find-avh [--first] [-f|--force] [-v|--verbose]
Beispiel: Nur den Ersten gefundenen HFS+ Alternate Volume Header anzeigen.
Befehl: hfsprescue --find-avh /dev/sdb --first
Beispielausgabe:
*** Stop searching after the first Volume Header has been found. Searching backwards for the Alternate Volume Header. ============================================ A Volume Header has been found. Volume Header start: 1000412826624 (Byte), 0xe8ed404c00, 1953931302 (LBA Sector), at 954068 MB Signature: 0x2b48, H+ LastMountedVersion: 10.0, last mount by Mac OS X. FileCount: 0 DirCount: 0 BlockSize: 4096 TotalBlocks: 244190208 AllocationFile StartBlock: 1 ExtentsOverflowFile StartBlock: 7454 CatalogFile StartBlock: 10270 Possible partition start: 209735680 (Byte), 0xc805000, 409640 (LBA Sector), at 200 MBDer mögliche Start der Partition ist beim Offset '209735680'.
Verwenden Sie diesen Wert für den '-o <offset in bytes>' Parameter in Kombination mit '-s3' bzw. '--one-file'.
Beispiel: hfsprescue -s3 /dev/sdb -o 209735680
Falls es nötig ist, können Sie den Volume Header in einer Datei speichern. Siehe hier.
Beispiel: hfsprescue --extract-vh /dev/sdb 1953931302
Mit dem Parameter '--extract-vh' können den Volume Header in eine Datei sichern.
hfsprescue --extract-vh <device node|image file> <LBA sector> [--vh-file <output file>]
Zusätzlich zum Device Node / Imagenamen benötigen Sie auch die LBA Sektornummer des Volume Headers. Wenn Sie die LBA Sektornummer nicht wissen, dann können Sie nach dem Volume Header suchen. Siehe dazu Den HFS+ Volume Header oder Alternate Volume Header und den Start der Partition finden.
Die Volume Header Datei kann mit verschiedenen Programmmodi verwendet werden. Zum Beispiel '-s1', '-s3', '--one-file' und anderen.
Die standard Outputdatei ist './restored/VolumeHeader'. Mit '--vh-file' können Sie einen eigenen Dateinamen festlegen.
Beispiel Befehl: hfsprescue --extract-vh /dev/sdb 409642
Das Extents Overflow File wird verwendet um die Positionen von Dateifragmenten zu speichern, wenn die Datei in mehr als 8 Fragmente aufgeteilt ist. Wenn der Volume Header defekt ist oder eine falsche Position des Extents Overflow Files abgespeichert hat, dann ist es nicht möglich, stark fragmentierte Dateien wiederherzustellen. Mit dem Parameter --find-eof kann man eine Suche starten um mögliche Positionen des Extents Overflow Files zu finden. hfsprescue wird mögliche Start Blöcke anzeigen. Ich habe keinen Weg gefunden um das Suchergebnis besser einzugrenzen. Der korrekte Start Block sollte unter den ersten 7 Ergebnissen sein.
hfsprescue --find-eof [-b <block size>] [-o <offset in bytes>] [--vh-file <file name>]
Hinweis: Wenn der -o <offset in bytes> Parameter verwendet wird, dann werden die Start Block Ergebnisse relativ zum Offset ausgegeben.
Hinweis: Wenn der Volume Header defekt ist und Sie ein Backup des Volume Headers in einer Datei haben, dann können Sie diese mit '--vh-file' angeben.
Wenn Positionen gefunden wurden, dann kann man das Extents Overflow File in einer Datei speichern. Siehe Das Extents Overflow File sichern.
Beispiel:
Befehl: hfsprescue --find-eof /dev/sdb2
Beispielausgabe:
Searching block positions of the Extents Overflow File... 1. Possible block: 217 | File position: 0xd9000 2. Possible block: 487 | File position: 0x1e7000 maybe ExtentsOverflowFile or CatalogFile 3. Possible block: 1023 | File position: 0x3ff000 4. Possible block: 1149 | File position: 0x47d000 5. Possible block: 2108 | File position: 0x83c000 6. Possible block: 3132 | File position: 0xc3c000 7. Possible block: 25660 | File position: 0x643c000 ==== CUT =====In diesem Fall war der richtige Start Block 2108 (der 5. Eintrag). Es wurden die vorhergehenden Blöcke geprüft bis der richtige Block gefunden wurde.
Wenn mehrere mögliche Blöcke gefunden werden, dann muss man die Ergebnisse mit einer stark fragmentierten Datei prüfen um den richtigen Block zu finden. Bevor man die zu prüfende Datei mit '--one-file' wiederherstellen kann, muss das Extents Overflow File in einer Datei gespeichert werden.
Info: Falls Sie stark fragmentierte Dateien haben, dann
• wird beim wiederherstellen (Schritt 3) eine entsprechende Meldung im Log ausgegeben. Suchen Sie im Log nach dem Text '_has_extents_overflows_'.
• werden diese mit '_F_EOF_' markiert bei der Ausgabe von '--list'.
• ist diese diesbezügliche Information im CSV Export ersichtlich.
Das Extents Overflow File wird beim Wiederherstellen von stark fragmentierten Dateien benötigt. Bei einem gültigen Volume Header wird das Extents Overflow File automatisch in einer Datei abgespeichert wenn man '-s3' oder '--one-file' verwendet.
Mit '--extract-eof' kann man das Extents Overflow File jederzeit als Datei speichern.
hfsprescue --extract-eof <device node|image file> [ [--start-block <number>] < [--last-block <number>] | [--num-blocks <number>] > ] [--eof-file <output file>] [--vh-file <file name>]
Der Standarddateiname ist './restored/ExtentsOverflowFile'. Mit '--eof-file <output file>' kann man auch einen anderen Namen wählen.
Hinweis: Wenn die Partition formatiert wurde, dann ist das Extents Overflow File in den meisten Fällen nicht mehr brauchbar.
Wenn der Volume Header in Ordnung ist, dann benötigt man für '--extract-eof' keine extra Parameter um das Extents Overflow File in eine Datei zu speichern.
Beispiel: 'hfsprescue --extract-eof /dev/sdb1'
Signature: 0x2b48, H+ LastMountedVersion: H+Lx, last mount by Linux. FileCount: 4362 DirCount: 144 BlockSize: 4096 TotalBlocks: 244190208 AllocationFile StartBlock: 1 ExtentsOverflowFile StartBlock: 7454 CatalogFile StartBlock: 10270 Total size: 931 GB Extracting the ExtentsOverflowFile to 'restored/ExtentsOverflowFile'. Size: 11534336 bytes, 11.00 MB Clump Size: 11534336 bytes Total Blocks: 2816 Extent 0: Start 7454, Num 2816 Extent 1: Start 0, Num 0 Extent 2: Start 0, Num 0 Extent 3: Start 0, Num 0 Extent 4: Start 0, Num 0 Extent 5: Start 0, Num 0 Extent 6: Start 0, Num 0 Extent 7: Start 0, Num 0 File created.
Wenn der Volume Header nicht in Ordnung ist, dann kann man '--find-eof' verwenden um mögliche Positionen des Extents Overflow File zu finden. Mit diesen möglichen Positionen kann man das Extents Overflow File in eine Datei speichern. Wenn mit '--start-block' und '--last-block' / '--num-blocks' gearbeitet wird, dann wird nur der angegebene Bereich in die Datei gespeichert. Sollte das Extents Overflow File selbst auch fragmentiert sein, dann ist es nicht möglich ohne Volume Header das komplette Extents Overflow File zu speichern. Man kann '--vh-file <file name>' verwenden, wenn man den gültigen Volume Header in einer Datei gespeichert hat.
Ein einfaches Beispiel:
• Zuerst werden mögliche Positionen gesucht.
hfsprescue --find-eof /dev/sdb -b 4096
*** Force block size: 4096 Signature: 0x00, (Unknown) LastMountedVersion: , last mount was not done by Mac OS X. FileCount: 0 DirCount: 0 BlockSize: 4096 TotalBlocks: 0 AllocationFile StartBlock: 0 ExtentsOverflowFile StartBlock: 0 CatalogFile StartBlock: 0 Total size: 931 GB Searching block positions of the Extents Overflow File... 1. Possible block: 7710 | File position: 0x1e1e000 2. Possible block: 10526 | File position: 0x291e000 maybe ExtentsOverflowFile or CatalogFile
• Dann wird das Extents Overflow File in eine Datei gespeichert. Hier wird der erste Eintrag als Start Block verwendet und der zweite Eintrag als Last Block -1.
hfsprescue --extract-eof /dev/sdb -b 4096 --start-block 7710 --last-block 10525
*** Force block size: 4096 Signature: 0x00, (Unknown) LastMountedVersion: , last mount was not done by Mac OS X. FileCount: 0 DirCount: 0 BlockSize: 4096 TotalBlocks: 0 AllocationFile StartBlock: 0 ExtentsOverflowFile StartBlock: 0 CatalogFile StartBlock: 0 Total size: 931 GB Extracting the ExtentsOverflowFile to 'restored/ExtentsOverflowFile'. *** Warning. No extents of the ExtentsOverflowFile will be restored. Extracting blocks from 7710 to 10525. 2816 blocks. File created.
Nun sollte das Extents Overflow File getestet werden.
Verwenden Sie 'hfsprescue --list | grep _F_EOF_' um eine betroffene Datei zu finden.
Verwenden Sie '--one-file' um diese Datei wiederzustellen. Dann prüfen Sie ob die Datei in Ordnung ist.
Wenn mehrere mögliche Positionen gefunden werden, dann muß man durchprobieren und testen bis man den richtigen Start und Ende des Extents Overflow File findet.
Im Schritt 4 wird die komplette Verzeichnisstruktur wiederhergestellt. Dies geschieht auch wenn nur ein paar Dateien im Schritt 3 ausgewählt wurden. Am Ende nach Schritt 6 '-s6' hat man nun viele leere Verzeichnisse. Mit '--remove-empty-dirs' kann man die leeren Verzeichnisse leicht entfernen.
hfsprescue --remove-empty-dirs [--dir <directory>] [-f|--force]
Als standard Verzeichnis wird './restored' genommen. Sie können allerdings auch Verzeichnis mit '--dir' angeben.
Vor dem Entfernen wird der gesamte Pfad des Startsverzeichnisses angezeigt und gefragt ob gestartet werden soll. Nach der Eingabe von 'y' wird mit der Säuberung begonnen. Die Abfrage kann mit '-f' bzw. '--force' verhindert werden.
Mit hfsprescue können Bytes einer Datei und Unicode Strings gesucht werden. Unter anderem kann mit dieser Funktion der Partitionsstart ermittelt werden. Die Parameter -ff and -fi können gleichzeitig in einem Befehl verwendet werden.
hfsprescue --find <device node|image file> [-ff <num bytes> <file1> [file2] [...]] [-fs <string>] [-o <offset in bytes>]
• Finde Bytes einer oder mehreren Dateien -ff
Das Auffinden der Bytes einer Datei (Inhalt) kann unter anderem verwendet werden wenn man den Startoffset einer Partition ermitteln muß. Es macht wenig Sinn nach der kompletten Datei zu suchen, weil die Datei fragmentiert sein kann und deshalb nichts gefunden wird. Die Dateigröße ist nicht limitiert, allerdings wird maximal nach einem 1MB großen Block gesucht. 1MB ist in diesem Fall sehr groß. Ich empfehle 1 Blocksize als Suchblockgröße.
Das Ergebnis der Suche wird in der Datei 'hfsprescue-data/find.log' abgespeichert.
Wenn Sie '-o <offset in bytes>' verwenden, dann beginnt die Suche beim Offset und ignoriert den Speicherplatz davor.
Suche nach Bytes Beispiel 1:
Befehl: hfsprescue --find /dev/sdb2 -ff 4096 PerfectPicture.jpg
Beispielausgabe:
File PerfectPicture.jpg: Bytes found at offset 746586112 + 28672 = 746614784 (0x2c800000 + 0x7000 = 0x2c807000)
Suche nach Bytes Beispiel 2: Mehrere Dateien
Befehl: hfsprescue --find /dev/sdb2 -ff 4096 PerfectPicture.jpg anyfile.doc
Beispielausgabe:
File anyfile.doc: Bytes found at offset 0 + 401408 = 401408 (0x0 + 0x62000 = 0x62000) File PerfectPicture.jpg: Bytes found at offset 746586112 + 28672 = 746614784 (0x2c800000 + 0x7000 = 0x2c807000)
• Suche String -fs
Dieser Parameter wird verwendet um Unicode Strings zu finden. Dateinamen sind als Unicode abgespeichert und können mit -fs gefunden werden. Man kann damit die Position von Verzeichniseinträgen finden. Der Parameter wird von hfsprescue automatisch in Unicode umgewandelt.
Das Ergebnis der Suche wird in der Datei 'hfsprescue-data/find.log' abgespeichert.
Wenn Sie '-o <offset in bytes>' verwenden, dann beginnt die Suche beim Offset und ignoriert den Speicherplatz davor.
Suche nach String Beispiel:
Befehl: hfsprescue --find /dev/sdb2 -fs myimportantfile.doc
Beispielausgabe:
String "myimportantfile.doc" found at offset 1048576 + 326870 = 1375446 (0x100000 + 0x4fcd6 = 0x14fcd6) String "myimportantfile.doc" found at offset 1048576 + 494446 = 1543022 (0x100000 + 0x78b6e = 0x178b6e)
hfsprescue speichert seine Dateien im './hfsprescue-data/' Verzeichnis, bzw. im Verzeichnis, dass mit '-d' angegeben wird.
filesfound.db | Detailinformationen über gefundene Dateien. Doppelte Einträge sind nicht entfernt. | |
fileinfo.db | Detailinformationen über gefundene Dateien. Doppelte Einträge sind entfernt. | |
fileinfo.sha | Zusatzdatei für das Aufräumen in der Datenbank. | |
foldertable.db | Detailinformationen über die Verzeichnisstruktur. | |
s1.log | Logdatei von Schritt 1. | |
s2.log | Logdatei von Schritt 2. | |
s3.log | Logdatei von Schritt 3. | |
s4.log | Logdatei von Schritt 4. | |
s5.log | Logdatei von Schritt 5. | |
onefile.log | Logdatei beim wiederherstellen einer einzelnen Datei '--one-file'. | |
find.log | Logdatei der Byte/Unicode Suche. | |
find-eof.log | Logdatei der Extents Overflow Files Suche '--find-eof'. | |
extract-eof.log | Logdatei vom Sichern des Extents Overflow Files '--extracto-eof'. | |
find-vh.log | Logdatei der Volume Header / Partitions Suche '--find-vh'. | |
find-avh.log | Logdatei der Alternate Volume Header Suche '--find-avh'. |
Hinweis: Logs werden an die bestehende Logdatei angehängt wenn eine Aktion erneut gestartet wird. Es obliegt dem Benutzer die Logdateien zurück zu setzen bzw. zu löschen.
Das 'restored' wird in dem Verzeichnis erstellt, in dem hfsprescue gestartet wird bzw. in dem Verzeichnis, dass mit dem Parameter '-d' angegeben wird. Ihre Dateien und Verzeichnisse werden in dieses Verzeichnis wiederhergestellt.
Wenn Sie '--one-file' verwenden, dann wird die Datei direkt in das 'recovered' Verzeichnis wiederhergestellt.
Nachdem Schritt 6 beendet wurde, befinden sich zusätzliche Dateien und Verzeichnisse im 'restored' Verzeichnis um Ihnen zu helfen, den Überblick zu behalten.
Verzeichnis: restored/newroot/recovered/
Dort befinden sich die wiederhergestellten Dateien.
Verzeichnis: restored/newroot/x_directory_problem/
Verzeichnisse und Dateien die keinem Verzeichnis yugeordnet werden konnten, befinden sich hier.
Verzeichnis: restored/newroot/x_unknown/
Es konnte kein passendes Verzeichnis gefunden werden. Möglicherweise sind die Dateien bereits gelöscht worden. Die Dateien in diesem Verzeichnis sind höchstwahrscheinlich defekt.
Dateien in restored/newroot/
INFO.TXT
Nur eine Informationsdatei für den User.recovered-files.txt, x_directory_problem-files.txt, x_unknown-files.txt
Auflistung der Dateien in den entsprechenden Verzeichnissen. Praktisch wenn man eine Übersicht über alle wiederhergestellten Dateien haben will.
Die folgenden Artikel zeigen Gründe warum Dateien nicht richtig wiederhergestellt werden konnten und was man dagegen tun kann. Meistens ist das Problem, daß falsch auf die Partitionsdaten zugegriffen wird. Hier erfahren Sie unter anderem wie der korrekte Partitionsstart ermittelt werden kann.
Übersicht:
• Wiederhergestellte Dateien sind defekt, warum?
• Die Partitionstabelle ist defekt, gelöscht, unbrauchbar! Wie kann ich den Startoffset der Partition ermitteln?
• Wie findet man den Partition Startoffset mit einer Referenzdatei?
• Unusual block size.
• Extents Overflow File Probleme.
• Permission denied / Zugriff verweigert.
• Precompiled - FATAL: kernel too old.
• sudo: hfsprescue: command not found.
• Problem bei Dateinamen mit Tilde usw.
Die Gründe für defekte Dateien können sein:
- Sie verwenden einen falschen Start der Partition (aufgrund einer defekten Partitionstabelle, oder Sie arbeiten mit einem Festplattenimage, usw.).
- Die Datei wurde gelöscht und auf dem kaputten Dateisystem mittlerweile überschrieben.
- Sie arbeiten mit der falschen Block Size.
- Das Extents Overflow File konnte nicht exportiert werden.
- Das Extents Overflow File ist beschädigt.
In den meisten Fällen wird ein falscher Start der Partition verwendet. Siehe Wie kann ich den Startoffset der Partition ermitteln?
hfsprescue kann helfen den korrekten Startoffset der Partition zu finden wenn
• man mit einer realen Festplatte arbeitet und
- die Partitionstabelle wurde beschädigt.ODER
- die Partitionstabelle wurde mit neuen Partitionsdaten überschrieben.
- die Partitionstabelle wurde gelöscht.
- die Verwendung des Programms kpartx ist nicht möglich.
- die Partitionstabelle wurde beschädigt.
- die Partitionstabelle wurde mit neuen Partitionsdaten überschrieben.
- die Partitionstabelle wurde gelöscht.
Wann benötige ich den Startoffset der Partition?
Wenn Sie auf die Partition nicht zugreifen kann, dann kann hfsprescue nicht die Block Size und den Start Block des Extents Overflow File auslesen. Somit ist es nicht möglich Dateien erfolgreich wieder herzustellen, weil die Dateiposition relativ zum Partitionsstart im Dateisystem abgespeichert sind.
Es gibt 2 Möglichkeiten um mit hfsprescue den Start einer Partition zu ermitteln.
1. Wenn der HFS+ Volume Header in Ordnung ist, dann siehe Auffinden des HFS+ Volume Header und den Startoffset der Partition ermitteln.
2. Wenn Sie eine Referenzdatei haben, dann siehe Wie finde ich den richtigen Startoffset der Partition mit einer Referenzdatei.
Bevor Sie die Suche starten, müssen die Wiederherstellungsschritte 1 und 2 beendet werden. Wenn dies vor einiger Zeit geschehen ist und die HFS+ Rescue Dateien noch vorhanden sind, dann müssen Sie die Schritte 1 und 2 nicht erneut durchführen.
Es ist notwendig die Block Size des defekten Dateisystems zu wissen. Normalerweise ist die Block Size 4096. Bei Partition die größer als 2 TB sind ist eine Block Size von 8192 üblich.
Weiters benötigen Sie eine Datei die sich auf der Partition befand. Es ist egal um welche Datei es sich handelt. Es kann eine ausführbare Datei sein (kann von einem funktionierenden Computer kopiert werden) oder eine Bilddatei (vielleicht von einem Backup). Ich bevorzuge eine Bilddatei. Wichtig ist, daß die Datei möglichst selten auf der Partition gespeichert ist, damit Anzahl der möglichen Positionen reduziert wird.
1) Zuerst prüfen Sie ob die Datei bei den Schritten -s1 und -s2 gefunden wurde. Für dieses Beispiel verwende ich eine Datei mit dem Namen 'PerfectPicture.jpg'.
hfsprescue --list | grep PerfectPicture.jpg
Beispielausgabe:
77: PerfectPicture.jpg, 892187 bytes, Sun May 10 18:21:18 2015, Start block 131074
Großartig, die Datei 'PerfectPicture.jpg' wurde gefunden. Außerdem haben wir Glück, denn die Datei ist nur ein Mal auf der Partition ;). Wenn Sie die Datei mehrmals gefunden wurde, dann verwenden Sie entweder eine andere Datei, oder Sie müssen verschiedene Offsetwerte ausprobieren bis Sie den richtigen Wert ermittelt haben.
2) Der nächste Schritt ist eine Bytesuche nach der Datei auf dem Laufwerk.
hfsprescue --find /dev/sdb -ff 4096 PerfectPicture.jpg
Beispielausgabe:
File bytes found at offset 746586112 + 28672 = 746614784 (0x2c800000 + 0x7000 = 0x2c807000)
Großartig, die Bytes der Datei wurden gefunden. Zum Glück nur ein Mal. Wenn die Bytes mehrmals gefunden wurden, dann müssen Sie die folgende Berechnung mit allen Offsets durchführen.
3) Die Formel.
offset = byte_search_result - list_start_block * block_size
Mit unseren Werten Sie die Formel so aus
offset = 746614784 - 131074 * 4096
Wenn Sie keinen Taschenrechner bei der Hand haben, dann können Sie die Shell (Kommandozeile) für die Berechnung verwenden.
echo $((746614784 - 131074 * 4096))
Das Ergebnis ist 209735680
Mein einer einfachen Überprüfung kann festgestellt werden ob das Ergebnis gültig sein könnte. Eine Modulo Operation mit dem Wert 512 muß 0 ergeben.
Befehl: echo $((209735680 % 512))
4) Überprüfen ob der berechnette Offset korrekt ist.
Stellen Sie eine Datei wieder her indem Sie den Parameter '--one-file' und die Dateinummer (von '--list') und den berechneten Offset verwenden.
hfsprescue --one-file /dev/sdb 77 -b 4096 -o 209735680
Dieser Befehl speichert die wiederhergestellte Datei unter 'restored/PerfectPicture.jpg' ab.
Nun vergleichen Sie die Referenzdatei mit der wiederhergestellten Datei. diff PerfectPicture.jpg restored/PerfectPicture.jpg
Wenn 'diff' keinen Unterschied meldet, dann ist der Offsetwert für die Partition korrekt.
Entfernen Sie das 'restored/' Verzeichnis und starten Sie mit Schritt 3 '-s3' und dem berechneten Startwert mit '-o'.
Beispiel: hfsprescue -s3 /dev/sdb -b 4096 -o 209735680
Die richtige Block Size ist notwendig um Dateien wiederherstellen zu können. Die Block Size ist im HFS+ Volume Header gespeichert. Wenn dieser Header beschädigt oder nicht verfügbar ist, dann kann hfsprescue die korrekte Block Size nicht auslesen. Es gibt verschiedene Ursachen für einen fehlerhaften Header. Entweder wurde der Header mit falschen Daten überschrieben, oder auf die Partition wird nicht von deren Anfang zugegriffen (dies ist hauptsächlich der Fehler wenn mit einem Festplattenimage gearbeitet wird).
Lösungen:
Bei überschriebenem/beschädigtem Volume Header: Einen Standardwert für die Block Size verwenden und mit '-b' verwenden.
Beispiel: -b 4096Wenn mit einem Festplattenimage gearbeitet wird: Das Programm kpartx verwenden oder den Startoffset der Partition mit '-o' setzen.
Beim Verlust der Partitionstabelle: Den Startoffset der Partition mit '-o' setzen.
Normalerweise ist der Wert für die Block Size '4096'. Bei Partitionen die größer als 2 TB sind ist eine Block Size von '8192' üblich.
Bei stark fragmentierten Dateien wird das Extents Overflow File benötigt um die Teile der Datei zusammen zu setzen. Das Extents Overflow File ist ein Bereich auf der HFS+ Partition. Wenn dieser Bereich überschrieben wurde, dann gibt es keine Möglichkeit, die betroffenen Dateien wieder herzustellen.
Mit '--find-eof' kann man mögliche Start Blöcke vom Extents Overflow File finden.
Mit '--extract-eof' kann man Extents Overflow File in einder datei speichern. Diese Datei wird dann beim Wiederherstellungsvorgang verwendet.
Sie benötigen root Rechte um auf den Datenträger zugreifen zu können. Verwenden Sie 'sudo'.
Beispiel: sudo hfsprescue -s1 /dev/sdb2
oder wechseln Sie zum root User mit 'su'.
Es kann auch zu Zugriffsproblemen kommen wenn das Dateisystem gemountet ist. In diesem Fall muß man es "unmounten" bevor man hfsprescue verwendet. Mac OS X Benutzer finden hier weitere Details.
Wenn Sie hfsprescue mit 'sudo' starten und das Programm befindet sich nicht im PATH, dann müssen Sie den Pfad angeben.
Beispiel: hfsprescue befindet sich im aktuellen Verzeichnis: sudo ./hfsprescue
Die x86 Linuxversionen sind mit LibC 2.11 kompiliert. Sollte Ihre Linux Distribution eine ältere LibC Version verwenden, dann erhalten Sie die Fehlermeldung 'FATAL: kernel too old'. In dem Fall müssen Sie hfsprescue auf Ihrem Computer kompilieren. Dafür wird GCC (GNU Compiler Collection) benötigt.
Dies betrifft Sie nur wenn Sie mit einem anderen Betriebssystem als Mac OS X Dateien wiedeherstellen.
Die Unicode zu UTF-8 Umwandlung der Dateinamen funktioniert nicht vollständig. Es gibt Probleme bei Umlauten, sowie Buchstaben mit einer Tilde usw.
Problem Behebung: Die fehlerhaften Buchstaben sollten korrigiert werden, wenn Sie die wiederhergestellten Dateien auf ein HFS+ Dateisystem kopieren.
Dieser Fehler wird vermutlich in einer kommenden Version behoben.
Wenn Sie Dateien mit asiatischen Dateinamen gespeichert hatten, dann müssen Sie den Parameter '--utf8len 2' im Schritt 2 setzten.
Beispiel: hfsprescue -s2 --utf8len 2
Wenn utf8len nicht gesetzt wird, dann werden alle Dateien mit asiatischen Dateinamen als ungültige Dateinamen herausgefiltert.
Hinweis: Man muß nicht nochmals -s1 durchführen wenn man utf8len ändern will. Einfach nochmal -s2 mit der gewünschten Einstellung starten.
Wenn Sie versuchen Dateien von einem Dateisystem, das automatisch gemountet wird, wieder herzustellen, dann unmounten Sie es mit 'diskutil'. So eine Situation kann eintreten wenn Sie z.B. das Dateisystem ungewollt formatiert haben.
Finden Sie den Gerätenamen mit 'mount' heraus.
Beispielausgabe:
/dev/disk0s2 on / (hfs, local, journaled) devfs on /dev (devfs, local, nobrowse) map -hosts on /net (autofs, nosuid, automounted, nobrowse) map auto_home on /home (autofs, automounted, nobrowse) /dev/disk6s2 on /Volumes/Untitled (hfs, local, nodev, nosuid, journaled, noowners)Die betroffene Partition ist '/dev/disk6s2 (/Volumes/Untitled)'.
Unmounten Sie die Partition mit 'sudo diskutil umount /dev/disk6s2'.
Nun können Sie mit hfsprescue auf die Partition zugreifen.
Beispiel: sudo hfsprescue -s1 /dev/disk6s2
Ich habe die erste Version des Programms für meinen Nachbar geschrieben. Es war nicht mehr möglich die HFS+ Partition zu mounten. Es kam die Fehlermeldung 'hfs: failed to load catalog file' und ein paar weitere Fehlermeldungen bezüglich B-Tree. Es war mir möglich einen Großteil der Dateien zu retten.
Mittlerweile ist das Programm stark verbessert worden und hat viele Funktionen dazu bekommen. Wenn es Probleme gibt, dann kann man mich kontaktieren.
© 2023 by Elmar Hanlhofer
Die Seite wurde zuletzt am 07/Apr/2023 geändert.