A veces las personas eliminan archivos que no deberían, un proceso de larga duración todavía tiene el archivo abierto, y recuperar los datos mediante captura /proc/<pid>/fd/N
no es lo suficientemente impresionante. Lo suficientemente impresionante sería si pudiera "deshacer" la eliminación ejecutando alguna opción mágica en ln que le permitiera volver a vincular al número de inodo (recuperado a través de lsof).
No puedo encontrar ninguna herramienta de Linux para hacer esto, al menos con Google superficial.
¿Qué tienes, serverfault?
EDITAR1: La razón por la que capturar el archivo /proc/<pid>/fd/N
no es lo suficientemente impresionante es porque el proceso que todavía tiene el archivo abierto todavía le está escribiendo. Una eliminación elimina la referencia al inodo del espacio de nombres del sistema de archivos. Lo que quiero es una forma de recrear la referencia.
EDIT2: 'debugfs ln' funciona, pero el riesgo es demasiado alto, ya que afecta a los datos sin procesar del sistema de archivos. El archivo recuperado también es loco inconsistente. El recuento de enlaces es cero y no puedo agregarle enlaces. Estoy peor de esta manera ya que solo puedo usar /proc/<pid>/fd/N
para acceder a los datos sin corromper mi fs.
/path/to/deleted/file
esté en el mismo sistema de archivos que el archivo justo antes de que se elimine, de lo contrario, esto fallará. (Puede obtener el viejo camino conls -l /proc/<pid>/fd/<handle>
)tmpfs
sistemas de archivos, pero no en egext3
. Además, esta característica se deshabilitó por completo en 2.6.39, consulte la confirmación . Por lo tanto, esta solución ya no funcionará con el kernel 2.6.39 o más reciente y en versiones anteriores depende del sistema de archivos.ln -L
no funciona para mí. Tengo un archivo eliminado e intenté volver a vincularlo a la ruta original.ln
Me da unaln: failed to create hard link /my/path/file.pdf => /proc/19674/fd/16: No such file or directory
. Pero puedo, por ejemplo, con éxitocat /proc/19674/fd/16
Parece que ya entiendes mucho, así que no entraré en detalles excesivos. Hay varios métodos para encontrar el inodo y, por lo general, puede detectar y redirigir STDOUT. Puedes usar
debugfs
. Ejecute este comando dentro de:ln <$INODE> FILENAME
Asegúrese de tener copias de seguridad del sistema de archivos. Probablemente necesitarás ejecutar un fsck después. Probé esto con éxito con un inodo aún escrito y funciona para crear un nuevo enlace duro a un inodo desreferenciado.
Si el archivo está desvinculado con un archivo sin abrir en ext3, los datos se pierden. No estoy seguro de cuán consistentemente cierto es esto, pero la mayor parte de mi experiencia de recuperación de datos es con ext2. De las preguntas frecuentes ext3:
También hay información relevante en esta pregunta:
Sobreescribí un archivo grande con uno en blanco en un servidor Linux. ¿Puedo recuperar el archivo existente?
fuente
la forma de depuración como viste realmente no funciona y, en el mejor de los casos, tu archivo se eliminará automáticamente (debido al diario) después del reinicio y, en el peor de los casos, puedes destruir tu sistema de archivos como resultado del "ciclo de reinicio de la muerte". La solución correcta (TM) es realizar la recuperación en el nivel VFS (que también tiene el beneficio adicional de trabajar con prácticamente todos los sistemas de archivos Linux actuales). La forma de llamada del sistema (parpadeo) se ha desactivado cada vez que apareció en LKML, por lo que la mejor manera es a través de un módulo + ioctl.
Un proyecto que implementa este enfoque y tiene un código razonablemente pequeño y limpio es fdlink ( https://github.com/pkt/fdlink.git para una versión probada con el núcleo de ubuntu maverick). Con él, después de insertar el módulo (sudo insmod flink_dev.ko) puede hacer "./flinkapp / proc // fd / X / my / link / path" y hará exactamente lo que desea.
También puede usar una versión de vfs-undelete.sourceforge.net portada hacia adelante que también funciona (y también puede volver a vincular automáticamente al nombre original), pero el código de fdlink es más simple y funciona igual de bien, por lo que es mi preferencia.
fuente
No sé cómo hacer exactamente lo que quieres, pero lo que haría es:
No es ideal, obviamente, pero es posible. La otra opción es jugar con debugfs (usando el
link
comando), ¡pero eso da miedo en una máquina de producción!fuente
link
no funcionó en mis pruebas pero loln
hizo.Me encontré con el mismo problema hoy. Lo mejor que se me ocurre es correr
en una sesión tmux / screen hasta que finalice el proceso.
fuente
>
) al archivo eliminado?Interesante pregunta. Un entrevistador me hizo la misma pregunta en una entrevista de trabajo. Lo que le dije fue que no había una manera fácil de hacer esto y, en general, no valía la pena el tiempo y el esfuerzo involucrados. Le pregunté cuál creía que era la solución a este problema ...
fuente
Utilice Sleuthkit icat.
fuente
La solución rápida que funcionó para mí, sin herramientas intimidantes:
1) encuentre el proceso + fd mirando directamente en / proc:
2) Luego, una técnica similar a la de @ nickray, con
pv
:Es posible que necesite Ctrl-C cuando termine (
ls /proc/{procnum}/fd/{fdnum}
le indicará que el archivo ya no existe), pero si conoce el tamaño exacto en bytes, puede usarlopv -S
para que salga cuando se alcance el recuento.fuente