Da es sich um ein Mehrbenutzer- und Multitasking-Betriebssystem handelt, ist es schwierig, gelöschte Dateien unter Linux wiederherzustellen. Obwohl der Löschbefehl nur den Dateiknoten zum Löschen markiert und den Dateiinhalt nicht tatsächlich löscht, überschreiben andere Benutzer und einige Prozesse, die auf die Festplatte schreiben, die Daten schnell.
1. Eine kurze Einführung in die Struktur des Ext2-Dateisystems
Im von Linux verwendeten Ext2-Dateisystem werden Dateien in Blöcken gespeichert. Standardmäßig beträgt die Größe jedes Blocks 1 KB und verschiedene Blöcke werden durch Blocknummern unterschieden. Jede Datei verfügt außerdem über einen Knoten, der den Dateieigentümer, Lese- und Schreibberechtigungen, den Dateityp und andere Informationen enthält. Bei einer Datei, die kleiner als 12 Blöcke ist, wird die Blocknummer des Dateidatenblocks direkt im Knoten gespeichert. Wenn die Datei größer als 12 Blöcke ist, speichert der Knoten die Blocknummer eines indirekten Blocks nach 12 Blocknummern. In dem Block, der dieser indirekten Blocknummer entspricht, werden die Blocknummern von 256 Dateidatenblöcken gespeichert (jeder Block in Ext2fs). Die Zahl belegt 4 Bytes, sodass die Blocknummer, die in einem Block gespeichert werden kann, 1024/4 = 256 beträgt. Wenn größere Dateien vorhanden sind, erscheinen auch sekundäre indirekte Blöcke und ** indirekte Blöcke im Knoten.
2. Methoden zum Wiederherstellen versehentlich gelöschter Dateien
Die meisten Linux-Distributionen bieten ein debugfs-Tool, mit dem sich das Ext2-Dateisystem bearbeiten lässt. Doch bevor dieses Tool zum Einsatz kommt, müssen noch einige Arbeiten erledigt werden.
Mounten Sie zunächst die Partition, auf der sich die versehentlich gelöschte Datei befindet, im schreibgeschützten Modus erneut. Verwenden Sie den folgenden Befehl: (vorausgesetzt, die Datei befindet sich in der /usr-Partition)
mount -r -n -o remount /usr -r bedeutet schreibgeschütztes Mounten; -n bedeutet, dass nicht nach /etc/mtab geschrieben wird. Wenn Sie Dateien auf /etc wiederherstellen, fügen Sie diesen Parameter hinzu. Wenn das System meldet, dass die Partition xxx ausgelastet ist, können Sie mit dem Befehl „fuser“ überprüfen, welche Prozesse die Dateien auf dieser Partition verwenden:
Fixiereinheit –v –m /usr
Wenn keine wichtigen Prozesse vorhanden sind, stoppen Sie diese mit dem folgenden Befehl:
Fuser -k –v –m /usr
Diese Dateisysteme können dann erneut gemountet werden.
Wenn alle Dateien in einer großen /-Partition installiert sind, können Sie mit Linux Single am Boot-Prompt in den Einzelbenutzermodus wechseln, um das Risiko zu minimieren, dass der Systemprozess Daten auf die Festplatte schreibt, oder die Festplatte einfach an einem anderen Ort hängen . auf der Maschine. Darüber hinaus sollten Sie die wiederhergestellten Daten nicht nach/oben schreiben, um eine Beschädigung dieser nützlichen Daten zu vermeiden. Wenn auf dem Computer DOS/Windows vorhanden ist, können Sie auf diese Partitionen schreiben:
mount –r –n /dev/hda1 /mnt/had
Dann können Sie debugfs ausführen: (vorausgesetzt, Linux befindet sich in /dev/hda5)
#debugfs /dev/hda5
Die debugfs-Eingabeaufforderung debugfs wird angezeigt:
Verwenden Sie den Befehl lsdel, um Informationen zu vielen gelöschten Dateien aufzulisten:
debugfs:lsdel debugfs: 2692 gelöschte Inodes gefunden. Inode Owner Mode Size Blocks Zeit gelöscht 164821 0 100600 8192 1/ 1 So, 13. Mai 19:22:46 2001 36137 0 100644 4 1/ 1 Di, 24. April 10:11:15 2001 196829 0 100644 149500 38/ 38 Montag, 27. Mai 13:52:04 2001 |
Es sind viele Dateien aufgelistet (2692 finden Sie hier). Das erste Feld ist die Dateiknotennummer, das zweite Feld ist der Dateieigentümer, das dritte Feld sind die Lese- und Schreibberechtigungen, gefolgt von der Dateigröße, der Anzahl der belegten Blöcke usw Löschzeitpunkt.
Dann können wir anhand der Dateigröße und des Löschdatums bestimmen, welche wir benötigen. Wir möchten beispielsweise die Datei mit dem Knoten 196829 wiederherstellen:
Sie können sich zunächst den Dateidatenstatus ansehen:
debugfs:stat <196829> Inode: 196829 Typ: normal Modus: 0644 Flags: 0x0 Version: 1 Benutzer: 0 Gruppe: 0 Größe: 149500 Datei-ACL: 0 Verzeichnis-ACL: 0 Links: 0 Blockanzahl: 38 Fragment: Adresse: 0 Nummer: 0 Größe: 0 ctime: 0x31a9a574 – Montag, 27. Mai 13:52:04 2001 atime: 0x31a21dd1 – Di, 21. Mai 20:47:29 2001 mtime: 0x313bf4d7 – Di, 5. März 2001, 08:01:27 Uhr dtime: 0x31a9a574 – Montag, 27. Mai 13:52:04 2001 BLÖCKE: 594810 594811 594814 594815 594816 594817 GESAMT: 38 |
Dann können Sie den Befehl dump verwenden, um die Datei wiederherzustellen:
debugfs: dump <196829> /mnt/hda/01.sav
Dadurch wird die Datei wiederhergestellt. Debugfs beenden:
debugfs:quit
Eine andere Möglichkeit besteht darin, den Inode manuell zu bearbeiten:
debugfs:mi <196829> Modus [0100644] Benutzer-ID [0] Gruppen-ID [0] Größe [149500] Erstellungszeit [0x31a9a574] Änderungszeit [0x31a9a574] Zugriffszeit [0x31a21dd1] Löschzeitpunkt [0x31a9a574] 0 Linkanzahl [0] 1 Blockanzahl [38] Dateiflags [0x0] Reserviert1[0] Datei-ACL [0] Verzeichnis acl [0] Fragmentadresse [0] Fragmentnummer [0] Fragmentgröße [0] Direktblock Nr. 0 [594810] Dreifacher indirekter Block [0] |
Nach Verwendung des mi-Befehls wird jeweils eine Zeile mit Informationen zur Bearbeitung angezeigt. Für andere Zeilen können Sie direkt die Eingabetaste drücken, um zu bestätigen, die Löschzeit auf 0 (nicht gelöscht) und die Linkanzahl auf 1 ändern. Nachdem Sie die Änderungen vorgenommen haben, beenden Sie debugfs:
debugfs:quit
Überprüfen Sie dann /dev/hda5 mit fsck
fsck /dev/hda5
Das Programm meldet, dass es den verlorenen Datenblock gefunden und in „lost+found“ abgelegt hat. Die Dateien in diesem Verzeichnis sind das, was wir wollen.