Use lsof para encontrar el número de inodo y debugfs para recrear un enlace rígido a él. Por ejemplo:
# 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
Antes de quejarse, falsifiqué la transcripción anterior ya que no tengo un archivo eliminado en este momento ;-)
Utilizo mi
para restablecer el tiempo de eliminación y el recuento de enlaces a valores razonables (0 y 1 respectivamente), pero no funciona correctamente: puede ver que el recuento de enlaces permanece en cero ls
. Creo que el núcleo podría estar almacenando en caché los datos del inodo. Probablemente debería fsck lo antes posible después de usar debugfs, para estar seguro.
En mi experiencia, debe crear el enlace con un nombre de archivo temporal y luego cambiar el nombre por el nombre correcto. Vincularlo directamente al nombre del archivo original parece causar daños en el directorio. YMMV!
readlink /proc/13381/fd/3
-> "/ home / vi / important_file (eliminado)" y/home/vi/important_file\ \(deleted\)
obviamente no existe.