
Manchmal löschen Leute Dateien, die sie nicht löschen sollten, ein lang laufender Prozess hat die Datei noch geöffnet und die Wiederherstellung der Daten durch catting /proc/<pid>/fd/N
ist einfach nicht genial genug. Genial genug wäre, wenn Sie das Löschen „rückgängig machen“ könnten, indem Sie eine magische Option für ln ausführen, die Ihnen erlaubt, erneut auf die Inode-Nummer zu verlinken (wiederhergestellt durch lsof).
Ich kann keine Linux-Tools dafür finden, zumindest nicht bei flüchtiger Google-Suche.
Was hast du, Serverfehler?
EDIT1: Der Grund, warum das Catting der Datei /proc/<pid>/fd/N
nicht genial genug ist, ist, dass der Prozess, der die Datei noch geöffnet hat, immer noch in sie schreibt. Ein Löschvorgang entfernt den Verweis auf den Inode aus dem Dateisystem-Namespace. Was ich möchte, ist eine Möglichkeit, den Verweis neu zu erstellen.
EDIT2: „debugfs ln“ funktioniert, aber das Risiko ist zu hoch, da es Rohdaten des Dateisystems beschädigt. Die wiederhergestellte Datei ist außerdem wahnsinnig inkonsistent. Die Linkanzahl ist null und ich kann keine Links hinzufügen. Auf diese Weise bin ich schlechter dran, da ich einfach /proc/<pid>/fd/N
auf die Daten zugreifen kann, ohne mein Dateisystem zu beschädigen.
Antwort1
Genial genug wäre, wenn Sie das Löschen durch Ausführen einer magischen Option für ln „rückgängig machen“ könnten, mit der Sie eine erneute Verknüpfung mit der Inode-Nummer (wiederhergestellt über lsof) herstellen könnten.
Diese Genialität wurde eingeführt ln
inVersion 8.0(GNU/coreutils) mit der -L|--logical
Option, die ln
eine Dereferenzierung eines /proc/<pid>/fd/<handle>
ersten bewirkt. Also ein einfaches
ln -L /proc/<pid>/fd/<handle> /path/to/deleted/file
reicht aus, um eine gelöschte Datei erneut zu verknüpfen.
Antwort2
Es klingt, als ob Sie bereits viel verstehen, daher werde ich nicht zu sehr ins Detail gehen. Es gibt mehrere Methoden, um den Inode zu finden, und Sie können normalerweise cat und STDOUT umleiten. Sie können verwendendebugfs
. Führen Sie diesen Befehl aus innerhalb von:
ln <$INODE> FILENAME
Stellen Sie sicher, dass Sie Backups des Dateisystems haben. Wahrscheinlich müssen Sie anschließend ein fsck ausführen. Ich habe dies erfolgreich mit einem Inode getestet, in den noch geschrieben wird, und es funktioniert, einen neuen Hardlink 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 zutrifft, aber die meisten meiner Erfahrungen mit der Datenwiederherstellung stammen aus ext2. Aus den ext3-FAQs:
F: Wie kann ich gelöschte Dateien von meiner ext3-Partition wiederherstellen? Eigentlich geht das nicht! Einer der Entwickler, Andreas Dilger, sagte dazu Folgendes:
Um sicherzustellen, dass ext3 eine Trennung nach einem Absturz sicher fortsetzen kann, setzt es die Blockzeiger im Inode auf Null, während ext2 diese Blöcke in den Block-Bitmaps lediglich als unbenutzt kennzeichnet und den Inode als „gelöscht“ kennzeichnet und die Blockzeiger unverändert lässt.
Ihre einzige Hoffnung besteht darin, nach den Teilen Ihrer Dateien zu „greppen“, die gelöscht wurden, und das Beste zu hoffen.
Auch in dieser Frage finden Sie relevante Informationen:
Antwort3
die Debugfs-Methode funktioniert, wie Sie gesehen haben, nicht wirklich und im besten Fall wird Ihre Datei nach dem Neustart automatisch gelöscht (aufgrund des Journals) und im schlimmsten Fall können Sie Ihr Dateisystem zerstören, was zu einem „Neustart-Todeszyklus“ führt. Die richtige Lösung (TM) besteht darin, die Wiederherstellung auf VFS-Ebene durchzuführen (was außerdem den zusätzlichen Vorteil hat, mit praktisch allen aktuellen Linux-Dateisystemen zu funktionieren). Die Systemaufrufmethode (flink) wurde jedes Mal abgelehnt, wenn sie in LKML auftauchte, daher ist die beste Methode ein Modul + ioctl.
Ein Projekt, das diesen Ansatz implementiert und über relativ kleinen und sauberen Code verfügt, ist fdlink (https://github.com/pkt/fdlink.gitfür eine mit dem Kernel von Ubuntu Maverick getestete Version). Damit können Sie nach dem Einfügen des Moduls (sudo insmod flink_dev.ko) einfach „./flinkapp /proc//fd/X /my/link/path“ ausführen und es wird genau das tun, was Sie wollen.
Sie können auch eine weiterportierte Version von vfs-undelete.sourceforge.net verwenden, die ebenfalls funktioniert (und auch automatisch auf den ursprünglichen Namen zurückverlinken kann), aber der Code von fdlink ist einfacher und funktioniert genauso gut, deshalb bevorzuge ich diese.
Antwort4
Ich weiß nicht genau, wie ich das machen soll, was Sie wollen, aber ich würde Folgendes tun:
- Öffnen Sie die Datei RO von einem anderen Prozess aus
- Warten Sie, bis der ursprüngliche Prozess beendet wird
- Kopieren Sie die Daten von Ihrem geöffneten FD in eine Datei
Natürlich nicht ideal, aber möglich. Die andere Möglichkeit besteht darin, mit debugfs herumzuspielen (mit dem link
Befehl), aber das ist auf einer Produktionsmaschine ziemlich beängstigend!