Manchmal löschen Leute Dateien, die sie nicht löschen sollten. Bei einem langen Prozess ist die Datei immer noch geöffnet, und das Wiederherstellen der Daten durch Catting ist /proc/<pid>/fd/N
einfach nicht großartig genug. Genial genug wäre, wenn Sie das Löschen "rückgängig machen" könnten, indem Sie eine magische Option ausführen, mit der Sie sich wieder mit der Inode-Nummer verbinden können (wiederhergestellt durch lsof).
Ich kann keine Linux-Tools finden, um dies zu tun, am wenigsten mit flüchtigem Googeln.
Was hast du, Serverfehler?
EDIT1: Der Grund, warum das Catting der Datei /proc/<pid>/fd/N
nicht großartig genug ist, ist, dass der Prozess, bei dem die Datei noch geöffnet ist, noch in die Datei schreibt. Beim Löschen wird der Verweis auf den Inode aus dem Namespace des Dateisystems entfernt. Was ich möchte, ist eine Möglichkeit, die Referenz neu zu erstellen.
EDIT2: 'debugfs ln' funktioniert, aber das Risiko ist zu hoch, da es rohe Dateisystemdaten frobs. Die wiederhergestellte Datei ist auch verrückt inkonsistent. Die Linkanzahl ist Null und ich kann keine Links hinzufügen. Mir geht es auf diese Weise schlechter, da ich nur /proc/<pid>/fd/N
auf die Daten zugreifen kann, ohne meine fs zu beschädigen.
/path/to/deleted/file
auf dem Laufenden ist Datei demselben Dateisystem befindet wie die Datei unmittelbar vor dem Löschen. Andernfalls schlägt dies in der Tat fehl. (Sie können den alten Pfad mit bekommenls -l /proc/<pid>/fd/<handle>
)tmpfs
Dateisystemen funktioniert, aber nicht auf zBext3
. Außerdem wurde diese Funktion in 2.6.39 komplett deaktiviert, siehe Commit . Daher funktioniert diese Lösung nicht mehr mit Kernel 2.6.39 oder neuer und hängt in früheren Versionen vom Dateisystem ab.ln -L
funktioniert bei mir nicht. Ich habe eine gelöschte Datei und habe versucht, sie erneut mit dem ursprünglichen Pfad zu verknüpfen.ln
gibt mir eineln: failed to create hard link /my/path/file.pdf => /proc/19674/fd/16: No such file or directory
. Aber ich kann zB erfolgreichcat /proc/19674/fd/16
Es hört sich so an, als würdest du schon viel verstehen, also werde ich nicht zu sehr ins Detail gehen. Es gibt verschiedene Methoden, um die Inode zu finden, und Sie können STDOUT normalerweise cat- und redirect-fähig machen. Sie können verwenden
debugfs
. Führen Sie diesen Befehl aus in:ln <$INODE> FILENAME
Stellen Sie sicher, dass Sie Backups des Dateisystems haben. Du wirst wahrscheinlich danach ein fsck ausführen müssen. Ich habe dies erfolgreich mit einem Inode getestet, in den noch geschrieben wird, und es funktioniert, um eine neue feste Verknüpfung zu einem dereferenzierten Inode zu erstellen.
Wenn die Verknüpfung der Datei mit einer nicht geöffneten Datei in ext3 aufgehoben wird, gehen die Daten verloren. Ich bin mir nicht sicher, wie konsequent dies ist, aber der größte Teil meiner Datenwiederherstellungserfahrung ist mit ext2. Aus den ext3 FAQ:
Es gibt auch relevante Informationen in dieser Frage:
Ich habe eine große Datei mit einer leeren auf einem Linux-Server überschrieben. Kann ich die vorhandene Datei wiederherstellen?
quelle
Wie Sie gesehen haben, funktioniert das Debuggen nicht wirklich und im besten Fall wird Ihre Datei nach dem Neustart automatisch (aufgrund des Journals) gelöscht. Die richtige Lösung (TM) besteht darin, das Wiederherstellen in der VFS-Ebene durchzuführen (was auch den zusätzlichen Vorteil hat, mit praktisch allen aktuellen Linux-Dateisystemen zu arbeiten). Der Systemaufruf (flink) wurde jedes Mal abgeschossen, wenn er in LKML angezeigt wurde. Der beste Weg ist also ein Modul + ioctl.
Ein Projekt, das diesen Ansatz implementiert und relativ kleinen und sauberen Code enthält, ist fdlink ( https://github.com/pkt/fdlink.git für eine Version, die mit dem Kernel von Ubuntu Maverick getestet wurde). Nachdem Sie das Modul (sudo insmod flink_dev.ko) eingefügt haben, können Sie einfach "./flinkapp / proc // fd / X / mein / link / path" ausführen und es wird genau das tun, was Sie wollen.
Sie können auch eine vorwärts portierte Version von vfs-undelete.sourceforge.net verwenden, die ebenfalls funktioniert (und auch automatisch auf den ursprünglichen Namen zurückgreifen kann), aber der Code von fdlink ist einfacher und funktioniert genauso gut, also ist es meine Präferenz.
quelle
Ich weiß nicht, wie ich genau das machen soll, was Sie wollen, aber was ich tun würde, ist:
Natürlich nicht ideal, aber möglich. Die andere Möglichkeit besteht darin, mit Debugfs (mit dem
link
Befehl) herumzuspielen , aber das ist auf einer Produktionsmaschine beängstigend!quelle
link
hat bei meinen Tests nicht funktioniert, hat es aberln
getan.Bin heute auf dasselbe Problem gestoßen. Das Beste, was ich mir einfallen lassen kann, ist zu rennen
in einer tmux / screen-Sitzung, bis der Vorgang endet.
quelle
>
) zu der gelöschten Datei benötigen ?Interessante Frage. Ein Interviewer hat mir in einem Vorstellungsgespräch die gleiche Frage gestellt. Was ich ihm sagte, war, dass es keinen einfachen Weg gab, dies zu tun, und im Allgemeinen die damit verbundene Zeit und Mühe nicht wert war. Ich habe ihn gefragt, was seiner Meinung nach die Lösung für dieses Problem ist ...
quelle
Verwenden Sie Sleuthkit icat.
quelle
Die schnelle Lösung, die für mich ohne einschüchternde Werkzeuge funktioniert hat:
1) finde den Prozess + fd indem du direkt in / proc schaust:
2) Dann eine ähnliche Technik wie bei @ nickray, mit
pv
eingeworfen:Möglicherweise müssen Sie Strg-C drücken, wenn Sie fertig sind (dies
ls /proc/{procnum}/fd/{fdnum}
zeigt an, dass die Datei nicht mehr vorhanden ist). Wenn Sie jedoch die genaue Größe in Byte kennen, können Siepv -S
sie beenden, sobald die Anzahl erreicht ist.quelle