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