Kategorie

Wiederherstellen von Dateien in einem gelöschten Ordner (ext3)

Juli 12th, 2012

Eine Datei ist so schnell gelöscht und ein Backup nicht immer zur Hand. Zum Glück gibt es bei ext3 und ext4 Hoffnung auf eine relativ einfache Wiederherstellung der Daten.

Hier ein einfaches Beispiel:

Die Lösung ist unter Debian und Ubuntu denkbar einfach.

Bauen wir doch zuerst unsere kleine Testumgebung auf:

Wir erstellen einen Ordner und welchseln in diesen:

mkdir test && cd test

Wir erstellen unser Test-Image und formatieren es mit ext3:

dd if=/dev/zero of=test.img count=2k bs=4096 status=noxfer && echo j | mkfs.ext3 test.img

Nun müssen wir es nur noch mounten (falls der mount Befehl nicht funktioniert, das ganze mit sudo probieren):

mkdir mnt; mount -o loop test.img mnt/

Einen einfachen Ordner erstellen:

mkdir mnt/directory

Nun erstellen wir ein paar Dateien (10 an der Anzahl):

for i in {1..10} ; do echo "Erstelle die Datei Nummer $i" ; dd if=/dev/urandom of=mnt/directory/myfile_$i count=1k bs=512 status=noxfer ; done

Nun noch das ganze definitiv auf die Festplatte schreiben:

sync

Nun löschen wir testweise fünf Dateien:

for i in {3..7} ; do echo "Erstelle die Datei Nummer $i" ; rm mnt/directory/myfile_$i ; done

umounten das ganze und löschen den Ordner

sudo umount mnt; rmdir mnt

Um die Datei wiederherzustellen unter Debian:

aptitude install ext3grep

Wir halten nun ausschau nach unseren Dateien:

ext3grep --dump-names test.img
Running ext3grep version 0.10.1
WARNING: I don't know what EXT3_FEATURE_COMPAT_EXT_ATTR is.
Number of groups: 1
Minimum / maximum journal block: 306 / 1335
Loading journal descriptors... sorting... done
The oldest inode block that is still in the journal, appears to be from 1340653254 = Mon Jun 25 21:40:54 2012
Number of descriptors in journal: 472; min / max sequence numbers: 2 / 31
Finding all blocks that might be directories.
D: block containing directory start, d: block containing more directory entries.
Each plus represents a directory start that references the same inode as a directory start that we found previously.
Searching group 0: DDD++++++++++
Writing analysis so far to 'test.img.ext3grep.stage1'. Delete that file if you want to do this stage again.
Result of stage one:
  3 inodes are referenced by one or more directory blocks, 3 of those inodes are still allocated.
  2 inodes are referenced by more than one directory block, 2 of those inodes are still allocated.
  0 blocks contain an extended directory.
Result of stage two:
  3 of those inodes could be resolved because they are still allocated.
All directory inodes are accounted for!
Writing analysis so far to 'test.img.ext3grep.stage2'. Delete that file if you want to do this stage again.
directory
directory/myfile_1
directory/myfile_10
directory/myfile_2
directory/myfile_3
directory/myfile_4
directory/myfile_5
directory/myfile_6
directory/myfile_7
directory/myfile_8
directory/myfile_9
lost+found

Logischerweise ist dies für unsere Suche ein wenig gar viel Text. Schränken wir also mittels regex ein wenig ein, damit wir nur noch unsere 5 gelöschten Dateien sehen:

ext3grep --dump-names test.img | egrep myfile_[3-7]
directory/myfile_3
directory/myfile_4
directory/myfile_5
directory/myfile_6
directory/myfile_7

Um zum Beispiel die Datei “myfile_4” wiederherzustellen, genügt folgender Befehl:

ext3grep --restore-file directory/myfile_4 test.img

Wenn wir die ganze Liste wiederherstellen möchten, können wir dies auch so machen:

for i in $(ext3grep --dump-names test.img | egrep myfile_[3-7] | xargs) ; 
do echo "################" ; 
echo "Stelle die Datei $i wieder her" ; 
ext3grep --restore-file $i test.img ; 
done

Die Dateien wurden nun im Ordner RESTORED_FILES abgelegt. Ein kurzer find-befehl zeigt uns alle wiederhergestellten Dateien:

manuel@nmalinux:~/test$ find RESTORED_FILES/ | sort -n
RESTORED_FILES/
RESTORED_FILES/directory
RESTORED_FILES/directory/myfile_3
RESTORED_FILES/directory/myfile_4
RESTORED_FILES/directory/myfile_5
RESTORED_FILES/directory/myfile_6
RESTORED_FILES/directory/myfile_7

Wichtige Hinweise:

  • Benutze nie ext3grep für die Wiederherstellung von Daten bei einem gemountetem System!
  • Bei grossen Filesystemen und einer 32-bit Architektur kann ext3grep gerne crashen. Daher lieber vorgängig schon ein 64-Bit System benutzen.
  • ext3grep kann keine Dateien wiederherstellen wenn keine “Rückstände” vorhanden sind
  • Einige Dateien welche mit ext3grep wiederhergestellt sind, haben null bytes. Diese Dateien werden wohl nicht wiederhergestellt werden können.

Ursprünglich wurde dieser Blog-Eintrag von einem unserer Mitarbeiter geschrieben: Blog von: Manuel Ambauen