Parfois, des personnes suppriment des fichiers qu’elles ne devraient pas, un processus de longue durée a toujours le fichier ouvert, et récupérer les données à la volée /proc/<pid>/fd/N
n’est tout simplement pas assez impressionnant. Ce serait assez génial si vous pouviez "annuler" la suppression en exécutant une option magique sur ln qui vous permettrait de vous reconnecter au numéro d'inode (récupéré via lsof).
Je ne trouve aucun outil Linux pour le faire, le moins avec Google rapide.
Qu'est-ce que tu as, serverfault?
EDIT1: La raison pour laquelle le fichier /proc/<pid>/fd/N
n'est pas assez impressionnant est parce que le processus qui a toujours le fichier ouvert est encore en train de l'écrire. Une suppression supprime la référence à l'inode de l'espace de noms du système de fichiers. Ce que je veux, c'est un moyen de recréer la référence.
EDIT2: 'debugfs ln' fonctionne, mais le risque est trop élevé car il bloque les données brutes du système de fichiers. Le fichier récupéré est également fou incohérent. Le nombre de liens est égal à zéro et je ne peux pas y ajouter de liens. Je suis pire de cette façon puisque je peux simplement utiliser /proc/<pid>/fd/N
pour accéder aux données sans corrompre mon fs.
/path/to/deleted/file
trouve sur le même système de fichiers que le fichier était juste avant sa suppression, sinon, cela échouera. (Vous pouvez obtenir l'ancien chemin avecls -l /proc/<pid>/fd/<handle>
)tmpfs
systèmes de fichiers, mais pas sur, par exempleext3
. De plus, cette fonctionnalité a été complètement désactivée dans 2.6.39, voir la validation . Cette solution ne fonctionnera donc plus avec le noyau 2.6.39 ou plus récent et dans les versions antérieures, cela dépend du système de fichiers.ln -L
ne fonctionne pas pour moi. J'ai un fichier supprimé et j'ai essayé de le relier au chemin d'origine.ln
me donne unln: failed to create hard link /my/path/file.pdf => /proc/19674/fd/16: No such file or directory
. Mais je peux par exemple avec succèscat /proc/19674/fd/16
On dirait que vous comprenez déjà beaucoup, alors je n’entrerai pas dans les détails. Il existe plusieurs méthodes pour trouver l'inode et vous pouvez généralement chat et rediriger STDOUT. Vous pouvez utiliser
debugfs
. Exécutez cette commande dans:ln <$INODE> FILENAME
Assurez-vous que vous avez des sauvegardes du système de fichiers. Vous aurez probablement besoin de lancer un fsck après. J'ai testé cela avec succès avec un inode toujours en cours d'écriture et cela fonctionne pour créer un nouveau lien dur vers un inode déréférencé.
Si le fichier n'est pas lié à un fichier non ouvert dans ext3, les données sont perdues. Je ne suis pas sûr que cela soit toujours vrai, mais l'essentiel de mon expérience de récupération de données se fait avec ext2. De la FAQ ext3:
Il y a aussi des informations pertinentes dans cette question:
J'ai écrasé un fichier volumineux par un fichier vierge sur un serveur Linux. Puis-je récupérer le fichier existant?
la source
la méthode de débogage que vous avez vue ne fonctionne pas vraiment et au mieux votre fichier sera automatiquement supprimé (à cause du journal) après le redémarrage et au pire vous pouvez détruire votre système de fichiers, ce qui entraînerait un "cycle de redémarrage de la mort". The Right Solution (TM) consiste à effectuer la suppression de suppression au niveau VFS (ce qui présente également l’avantage supplémentaire de fonctionner avec pratiquement tous les systèmes de fichiers Linux actuels). La voie d'appel système (flink) a été supprimée chaque fois qu'elle est apparue dans LKML. La meilleure façon de procéder consiste donc à utiliser un module + ioctl.
Fdlink ( https://github.com/pkt/fdlink.git pour une version testée avec le noyau d'ubuntu maverick) est un projet qui met en œuvre cette approche et a un code raisonnablement petit et propre . Avec celui-ci, après avoir inséré le module (sudo insmod flink_dev.ko), vous pouvez simplement faire "./flinkapp / proc // fd / X / my / link / path" et il fera exactement ce que vous voulez.
Vous pouvez également utiliser une version à port transféré de vfs-undelete.sourceforge.net qui fonctionne également (et peut également renvoyer automatiquement le lien au nom d'origine), mais le code de fdlink est plus simple et fonctionne tout aussi bien, c'est donc ma préférence.
la source
Je ne sais pas comment faire exactement ce que vous voulez, mais ce que je ferais, c'est:
Pas idéal, évidemment, mais possible. L'autre option consiste à jouer avec debugfs (à l'aide de la
link
commande), mais c'est plutôt effrayant sur une machine de production!la source
link
n'a pas fonctionné lors de mes tests, mais l'aln
fait.Couru dans le même problème aujourd'hui. Le mieux que je puisse trouver est de courir
dans une session tmux / screen jusqu'à la fin du processus.
la source
>
) vers le fichier supprimé?Question interessante. Un interviewer m'a posé la même question lors d'un entretien d'embauche. Ce que je lui ai dit, c'est qu'il n'y avait pas de moyen facile de faire cela et qu'en général, cela ne valait pas le temps et les efforts nécessaires. Je lui ai demandé quelle était, à son avis, la solution à ce problème ...
la source
Utilisez Sleuthkit icat.
la source
La solution rapide qui a fonctionné pour moi, sans outils intimidants:
1) trouvez le processus + fd en regardant directement dans / proc:
2) Ensuite, une technique similaire à celle de @ nickray, avec
pv
:Vous devrez peut-être appuyer sur Ctrl-C lorsque
ls /proc/{procnum}/fd/{fdnum}
vous aurez terminé ( vous indiquerez que le fichier n'existe plus), mais si vous connaissez la taille exacte en octets, vous pouvez l'utiliserpv -S
pour le faire quitter lorsque le nombre est atteint.la source