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

Wie kann man eine gelöschte Datei wiederherstellen, wenn sie noch von einem Prozess geöffnet wird?

... besser als zu einem bestimmten Zeitpunkt zu kopieren (und nur den Schnappschuss des Dateiinhalts zu diesem Zeitpunkt zu sammeln) ist "tail -f " diese Datei in eine neue Datei:

tail -c +0 -f /proc/PIDofProgram>/fd/# > /new/path/to/file

(Dank der vorsichtigen Programmierer von tail funktioniert das sogar mit binärer Ausgabe.)

Während seiner Laufzeit wird der tail -f selbst hält die Datei geöffnet und verhindert sicher, dass sie von der Festplatte gelöscht wird, wenn das ursprüngliche Programm endet. Stoppen Sie daher nicht die tail -f Unmittelbar nachdem Ihr ursprüngliches Programm endet - überprüfen Sie das angehängte /new/path/to/file zuerst, ob es ist was du willst. Wenn dies nicht der Fall ist (oder aus einem anderen Grund nicht zufriedenstellend ist), können Sie die Originaldatei erneut kopieren, diesmal jedoch nach alle Schreibvorgänge wurden von "Program" und dem noch laufenden tail -f abgeschlossen 's /proc/PIDoftail/fd/ Verzeichnis.


Wenn /home NFS ist, gibt es eine .nfsNNNNNNNNNN-Datei in /home/vi, auf die Sie zugreifen/kopieren können. Wenn home ein lokales Dateisystem ist, sollten Sie dasselbe über den Link /proc/PID/fd/3 tun können:

cp /proc/PID/fd/3 /tmp/recovered_file

Wenn Sie die Datei tatsächlich wiederherstellen möchten, finden Sie hier einen Blogbeitrag zu diesem Thema.


Verwenden Sie lsof, um die Inode-Nummer zu finden, und debugfs, um einen festen Link darauf neu zu erstellen. Zum Beispiel:

# lsof -p 12345 | grep /var/log/messages
syslogd 12345 root    3w   REG                8,3    3000    987654 /var/log/messages (deleted)
# mount | grep var
/dev/sda2 on /var type ext3 (rw)
# debugfs -w /dev/sda2
debugfs: cd log
debugfs: ln <987654> tmp
debugfs: mi tmp
                      Mode    [0100600] 
                   User ID    [0] 
                  Group ID    [0] 
                      Size    [3181271] 
             Creation time    [1375916400] 
         Modification time    [1375916322] 
               Access time    [1375939901]
             Deletion time    [9601027] 0
                Link count    [0] 1
               Block count    [6232] 
                File flags    [0x0] 
...snip...
debugfs:  q
# mv /var/log/tmp /var/log/messages
# ls -al /var/log/messages
-rw------- 0 root root 3301 Aug  8 10:10 /var/log/messages

Bevor Sie sich beschweren, ich habe das obige Transkript gefälscht, da ich gerade keine gelöschte Datei zur Hand habe;-)

Ich verwende mi um die Löschzeit und die Anzahl der Links auf vernünftige Werte (0 bzw. 1) zurückzusetzen, aber es funktioniert nicht richtig - Sie können sehen, dass die Anzahl der Links in ls auf Null bleibt . Ich denke, der Kernel könnte die Inode-Daten zwischenspeichern. Sie sollten nach der Verwendung von debugfs wahrscheinlich so schnell wie möglich fsck, um auf der sicheren Seite zu sein.

Nach meiner Erfahrung sollten Sie den Link mit einem temporären Dateinamen erstellen und dann in den richtigen Namen umbenennen. Das direkte Verknüpfen mit dem ursprünglichen Dateinamen scheint zu einer Beschädigung des Verzeichnisses zu führen. YMMV!

  • http://glandium.org/blog/?p=87
  • http://www.cyberciti.biz/tips/linux-ext3-ext4-deleted-files-recovery-howto.html

Linux
  1. Wie kann man feststellen, welcher Prozess eine Datei erstellt?

  2. Wie stellt man Xfs-Daten nach Rm wieder her?

  3. Wie kann man sich nach Kate-Abstürzen erholen?

  4. Eine gelöschte Datei wiederherstellen??

  5. CentOS / RHEL:So stellen Sie eine gelöschte /etc/passwd-Datei wieder her

So stellen Sie gelöschte Dateien unter Linux wieder her

So stellen Sie gelöschte Befehle unter Linux wieder her

So stellen Sie gelöschte Dateien in Ubuntu über TestDisk wieder her

So verwenden Sie Linux zum Wiederherstellen gelöschter Dateien

Unix/Linux stellt gelöschte Dateien wieder her

Wie sortiere ich die ps-Ausgabe nach der Startzeit des Prozesses?