GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Können überschriebene Dateien wiederhergestellt werden?

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 der mv erfordert das Kopieren (im Gegensatz zum bloßen Verschieben von Verzeichniseinträgen), neue Blöcke werden als mv 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önnen strace 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 vom cp durchgeführt werden, wiederverwendet werden oder nicht Befehl.

  • vi existing_file . Wenn vi ist eigentlich vim , 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 macht open("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664) , die die gleiche Semantik wie cp 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 .


Linux
  1. Warum können Dateien nicht von Inode manipuliert werden?

  2. Zählen Sie Zeilen in großen Dateien

  3. Wie kann ich eine Datei bearbeiten, wenn es kein vi, vim, joe usw. gibt?

  4. Warum kann ich unter Linux keine Dateien erstellen, die größer als 2 GB sind?

  5. Kann eine Loop-Backed-Datei nicht unmounten, aber es gibt keine geöffneten Dateien?

Kopieren von Dateien unter Linux

Cp-Befehl in Linux (Dateien kopieren)

So benennen Sie eine Datei (en) in Linux um

Wie kann ich die Berechtigungen meiner Dateien korrigieren?

Übertragen Sie Dateien mit WinSCP

So komprimieren Sie eine Datei unter Linux