Collegamento a un inode specifico


14

Ho un file che è stato eliminato, ma è ancora tenuto aperto da un programma. Ho trovato il numero dell'inode usando lsof. Come posso creare un collegamento reale a quell'inode?

Risposte:


31

Non è possibile creare un collegamento ad esso, ma è possibile recuperarlo. Facciamo un esperimento:

$ echo blurfl >myfile.txt
$ tail -f myfile.txt &
$ rm myfile.txt

myfile.txt ora non c'è più, ma l'inode è mantenuto in vita dal comando tail. Per recuperare il file, trova prima il PID del processo mantenendo l'inode:

$ ps auxw | grep tail
sunny      409  0.0  0.0   8532   824 pts/5    S    18:07   0:00 tail -f myfile.txt

Il PID è 409. chdir in / proc / 409 / fd / ed elenca i contenuti:

dr-x------ 2 sunny sunny  0 2009-07-24 18:07:18 .
dr-xr-xr-x 7 sunny sunny  0 2009-07-24 18:07:17 ..
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 0 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 1 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:18 2 -> /dev/pts/5
lr-x------ 1 sunny sunny 64 2009-07-24 18:07:33 3 -> /home/sunny/tmp/myfile.txt (deleted)

Le directory / proc / [PID] / fd / contengono collegamenti simbolici ai descrittori di file di tutti i file utilizzati dal processo. In questo caso il collegamento simbolico "3" punta al file eliminato. Quindi, per ripristinare il file, copia il contenuto in un nuovo file:

$ cat 3 >/home/mydir/saved_file.txt

L'ho fatto con un debugger del filesystem in un lontano passato (es. "Debugfs dump"), ma il concetto è lo stesso.
Gerald Combs,

1
bella risposta, +1
asdmin

Questo non funziona per me. Dato che '3' è un symlink penzolante, non un descrittore di file "reale", crea sempre solo un file vuoto.
Rob Chanter,

4
@Rob: No, non lo fa. Se il descrittore di file è in uso, il collegamento simbolico punta a dati validi, altrimenti il ​​collegamento simbolico non esisterebbe in primo luogo. Quando il file viene chiuso, il collegamento simbolico scompare. Hai avuto uno spazio dopo il "3", giusto? In caso contrario, si uscita il contenuto del descrittore di file 3 nella shell corrente, invece, e di quella probabilmente vuote.
sunny256

1
L'unico problema è che se il file è ancora in fase di scrittura, la copia effettuata verrà troncata. Probabilmente non c'è tempo tra quando la scrittura si interrompe e il file viene chiuso per fare ciò in modo da ottenere un file completo.
KayEss,


-8

Non esiste un modo portatile per farlo sotto Linux. Il modo migliore sarebbe probabilmente far cessare tutte le attività sul file system, terminare il programma che tiene aperto il file, smontare il file system e utilizzare un debugger del file system per ricollegarlo a una directory. Se il file system viene esportato tramite NFS, almeno alcune versioni di NFS potrebbero consentire di leggere i dati del file su NFS.


2
potresti perdere il file una volta ucciso il programma
DukeLion,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.