Ich spreche nicht von der Wiederherstellung gelöschter Dateien, sondern von überschriebenen Dateien. Nämlich durch die folgenden Methoden:
# move
mv new_file old_file
# copy
cp new_file old_file
# edit
vi existing_file
> D
> i new_content
> :x
Ist es möglich, irgendetwas abzurufen, wenn eine der oben genannten drei Aktionen ausgeführt wird, vorausgesetzt, dass keine speziellen Programme auf dem Linux-Rechner installiert sind?
Akzeptierte Antwort:
Die Antwort lautet „Wahrscheinlich ja, aber es hängt vom Dateisystemtyp und vom Timing ab.“
Keines dieser drei Beispiele überschreibt die physikalischen Datenblöcke von old_file oderexisting_file, außer zufällig.
-
mv new_file old_file
. Dadurch wird die Verknüpfung von old_file aufgehoben. Wenn es zusätzliche harte Links zu old_file gibt, bleiben die Blöcke in diesen verbleibenden Links unverändert. Andernfalls werden die Blöcke im Allgemeinen (abhängig vom Dateisystemtyp) auf einer freien Liste platziert. Wenn dann dermv
erfordert das Kopieren (im Gegensatz zum bloßen Verschieben von Verzeichniseinträgen), neue Blöcke werden alsmv
zugewiesen schreibt.Diese neu zugewiesenen Blöcke können dieselben sein, die gerade freigegeben wurden, oder auch nicht . Auf Dateisystemen wie UFS werden Blöcke nach Möglichkeit aus derselben Zylindergruppe zugewiesen wie das Verzeichnis, in dem die Datei erstellt wurde. Es besteht also die Möglichkeit, dass beim Aufheben der Verknüpfung einer Datei mit einem Verzeichnis und beim Erstellen einer Datei in demselben Verzeichnis ( und überschreiben) einige der gleichen Blöcke, die gerade freigegeben wurden. Aus diesem Grund lautet der Standardratschlag für Personen, die versehentlich eine Datei entfernen, keine neuen Daten in Dateien in ihrem Verzeichnisbaum (und vorzugsweise nicht in das gesamte Dateisystem) zu schreiben, bis jemand versuchen kann, die Datei wiederherzustellen.
-
cp new_file old_file
Folgendes tun (Sie könnenstrace
verwenden um die Systemaufrufe zu sehen):open("old_file", O_WRONLY|O_TRUNC) = 4
Das O_TRUNC-Flag bewirkt, dass alle Datenblöcke freigegeben werden, genau wie
mv
oben gemacht. Und wie oben werden sie im Allgemeinen zu einer freien Liste hinzugefügt und können von den nachfolgenden Schreibvorgängen, die vomcp
durchgeführt werden, wiederverwendet werden oder nicht Befehl. -
vi existing_file
. Wennvi
ist eigentlichvim
, der:x
Befehl macht Folgendes:unlink("existing_file~") = -1 ENOENT (No such file or directory)
rename("existing_file", "existing_file~") = 0
open("existing_file", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 3
Es entfernt also nicht einmal die alten Daten; die Daten werden in einer Sicherungsdatei aufbewahrt.
Unter FreeBSD
vi
machtopen("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664)
, die die gleiche Semantik wiecp
haben , oben.
Sie können einige oder alle Daten ohne spezielle Programme wiederherstellen; Alles, was Sie brauchen, ist grep
und dd
, und Zugriff auf das Raw-Gerät.
Für kleine Textdateien ist das einzelne grep
Befehl in der Antwort von @Steven D in der Frage, auf die Sie verlinkt haben, ist der einfachste Weg:
grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1
Aber für größere Dateien, die sich möglicherweise in mehreren nicht zusammenhängenden Blöcken befinden, mache ich Folgendes:
grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file
Dadurch erhalten Sie den Offset in Bytes der übereinstimmenden Zeile. Darauf folgt eine Reihe von dd
Befehle, beginnend mit
dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)
Sie möchten auch einige Blöcke vor und nach diesem Block lesen. Auf UFS sind Dateiblöcke normalerweise 8 KB groß und werden normalerweise ziemlich zusammenhängend zugewiesen, wobei die Blöcke einer einzelnen Datei abwechselnd mit 8 KB-Blöcken aus anderen Dateien oder freiem Speicherplatz verschachtelt werden. Das Ende einer Datei auf UFS besteht aus bis zu 7 1-KB-Fragmenten, die zusammenhängend sein können oder nicht.
Verwandte:Bestimmte Dateien zu einer einzigen Datei verketten?Auf Dateisystemen, die Daten komprimieren oder verschlüsseln, ist die Wiederherstellung natürlich möglicherweise nicht so einfach.
Es gibt tatsächlich nur sehr wenige Dienstprogramme in Unix, die die Datenblöcke einer vorhandenen Datei überschreiben. Eines, das mir in den Sinn kommt, ist dd conv=notrunc
. Ein anderes ist shred
.