... 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