Use lsof para encontrar o número do inode e debugfs para recriar um link físico para ele. Por exemplo:
# 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 você reclamar, eu formei a transcrição acima, pois não tenho um arquivo deletado para entregar agora; -)
Eu uso mi
para redefinir o tempo de exclusão e a contagem de links para valores sensíveis (0 e 1, respectivamente), mas isso não funciona corretamente - você pode ver que a contagem de links permanece em zero em ls
. Eu acho que o kernel pode estar armazenando em cache os dados do inode. Você provavelmente deve fazer o fsck na primeira oportunidade depois de usar o debugfs, para estar no lado seguro.
Na minha experiência, você deve criar o link usando um nome de arquivo temporário e, em seguida, renomear para o nome adequado. Vinculá-lo diretamente ao nome do arquivo original parece causar corrupção de diretório. YMMV!