Recuperare file cancellati con lsof

Segnalo un’ utile guida di Michael Stutz presente su linux.com che permette di recuperare abbastanza facilmente i file erroneamente rimossi.

Riporto qui di seguito una mia traduzione della stessa.

–>inizio articolo

Ci siete, dopo aver passato tutto il pomeriggio su un file audio per sistemarlo e farlo suonare proprio come piace a voi, e proprio quando state pensando: ” WoW suona proprio alla grande! aspetta un secondo che lo sposto “. A questo punto un campanello d’ allarme vi suona in testa :”Um, hai fatto mv, non rm vero?” Oops. Conosco il vostro disagio — e’ capitato a chiunque. Ma esiste un’ efficafce metodo per recuperare i file persi, e poiche’ funziona su ogni sistema linux standard, tutti devono sapere come fare.

Brevemente, un file come appare in una qualsiasi posizione del linux filesystem e’ attualmente un semplice link ad un inode, che contiene tutte le proprieta’ del file , come ad esempio i permess, i proprietari, cosi’ come gli indirizzi dei data block dove il contenuto dei file e’ memorizzato fisicamente nel disco. Quando voi eseguite il comando rm su un file, voi state rimuovendo il link che punta al rispettivo inode, ma non l’ inode stesso; altri processi(come il player audio) possono ancora averlo aperto e funzionante. Solo quando i programmi sono stati chiusi e tutti i link sono stati rimossi l’idnode e i blocchi ad esso associati ritornano ad essere disponibili per la scrittura. Il ritardo e’ la chiave per un veloce e felice recupero: se un processo ha ancora il file aperto, il file e’ ancora da qualche parte, anche se da cio’ che risulta guardando il contenuto della directory interessata, il file sembrerebbe gia’ sparito.

Qui’ e’ dove il Linux process pseudo-filesystem, la /proc directory, entra in gioco. Ogni processo all’ interno del sistema ha una directory in /proc con il proprio nome sopra, all’ interno della quale si possono trovare molte cose — come una fd (“file descriptor”) subdirectory contenente links a tutti i file che il processo ha aperti. Anche se un file e’ stato rimosso dal filesystem, una copia dei dati si potra’ trovare qui’:

/proc/process id/fd/file descriptor

Per sapere dove cercare, avrete bisogno dell’ id del processo che ha il file aperto, e del file descriptor. Li potrete avere con lsof, che sta per ” list of open files.”( Attualmente lsof fa molto piu’ di questo e sarebbe molto utile che tutti i sistemi lo avessero installato, quindi se il vostro non e’ tra questi potete prendere the latest version direttamente dall’ autore).

Una volta avute le informazioni da lsof, potrete semplicemente copiare i dati fuori da /proc e rinominarli successivamente.

Tutto cio’ si dimostra meglio con un esempio. Per prima cosa, create un file di testo da poter cancellare e ripristinare:

$ man lsof | col -b > myfile

Ora date un’occhiata al contenuto del file che avete appena creato

$ less myfile

Dovreste vedere una versione in semplice testo dell’ imponente man page di lsof.

ora premete Ctrl-Z per sospendere less. Tornati al prompt della shell assicuratevi che il file sia ancora dove lo avevate lasciato:

$ ls -l myfile
-rw-r--r--  1 jimbo jimbo 114383 Oct 31 16:14 myfile
$ stat myfile
  File: `myfile'
  Size: 114383          Blocks: 232        IO Block: 4096   regular file
Device: 341h/833d       Inode: 1276722     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1010/    jimbo)   Gid: ( 1010/    jimbo)
Access: 2006-10-31 16:15:08.423715488 -0400
Modify: 2006-10-31 16:14:52.684417746 -0400
Change: 2006-10-31 16:14:52.684417746 -0400

Ok il file c’e’. Ora Oops-atelo:

$ rm myfile
$ ls -l myfile
ls: myfile: No such file or directory
$ stat myfile
stat: cannot stat `myfile': No such file or directory
$

Sparito.

A questo punto, dovete fare in modo che il processo che tiene ancora aperto il vostro file non si chiuda, perche’ a volte capita anche questo, il file se ne andra’ veramente e i vostri problemi si intensificheranno. Il vostro processo less messo in background in questa guida, non e’ andato da nessuna parte(a meno che non lo abbiate killato o siate usciti dalla shell), ma se fosse stato un video o un audio file quello che stavate eseguendo, la prima cosa da fare a questo punto, ovvero una volta realizzato di aver eliminato il file, sarebbe stata quella di mettere immediatamente il player in pausa o mettere il processo in freeze, questo per evitare che il player finisca l’esecuzione del file e se ne esca.

Ora per riavere il file indietro. Per prima cosa guardate cosa lsof ha da dire su di esso (il file si intende)

$ lsof | grep myfile
less      4158    jimbo    4r      REG       3,65   114383   1276722 /home/jimbo/myfile (deleted)

La prima colonna vi dice il nome del comando associato con il processo, la seconda colonna e’ l’ id del processo, e i numeri nella quarta colonna sono i file descriptor (la “r” significa che e’ un file regolare). Ora sapete che il processo 4158 ha ancora il file aperto, e conoscete il file descriptor, 4. Questo e’ tutto quello che dovete sapere per copiare il file fuori da /proc.

Potreste credere che usare l’ opzione -a con cp sia la cosa migliore da fare in questo momento – mentre state recuperando il file – ma e’ invece importante che voi non lo facciate. Altrimenti, invece di copiare i dati letterali contenuti nel file, copiereste gli ormai broken symbolic link al file che ancora puntano a lui come se questo fosse ancora presente nella sua directory originale.

$ ls -l /proc/4158/fd/4
lr-x------  1 jimbo jimbo 64 Oct 31 16:18 /proc/4158/fd/4 -> /home/jimbo/myfile (deleted)
$ cp -a /proc/4158/fd/4 myfile.wrong
$ ls -l myfile.wrong
lrwxr-xr-x  1 jimbo jimbo 24 Oct 31 16:22 myfile.wrong -> /home/jimbo/myfile (deleted)
$ file myfile.wrong
myfile.wrong: broken symbolic link to `/home/jimbo/myfile (deleted)'
$ file /proc/4158/fd/4
/proc/4158/fd/4: broken symbolic link to `/home/jimbo/myfile (deleted)'

Quindi anziche’ tutto quello, utilizzate un classico cp per ottenere il trucco:

$ cp /proc/4158/fd/4 myfile.saved

E per finire, verificate che tutto sia andato a buon fine:

$ ls -l myfile.saved
-rw-r--r--  1 jimbo jimbo 114383 Oct 31 16:25 myfile.saved
$ man lsof | col -b > myfile.new
$ cmp myfile.saved myfile.new

Nessun reclamo da parte di cmp – il vostro ripristino sara’ il vero affare.

Comunque, ci sono molte altre cose utili che si possono fare con lsof in aggiunta al recupero di file persi

–>Fine articolo

Una risposta a Recuperare file cancellati con lsof

  1. Visit Website scrive:

    Appreciating the hard work you put into your blog and detailed information you provide.
    It’s great to come across a blog every once in a while that isn’t the same old rehashed information.

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: