Non sto parlando di recuperare file cancellati, ma sovrascritti File. Vale a dire con i seguenti metodi:
# move
mv new_file old_file
# copy
cp new_file old_file
# edit
vi existing_file
> D
> i new_content
> :x
È possibile recuperare qualcosa se viene eseguita una delle tre azioni precedenti presupponendo che non siano installati programmi speciali sulla macchina Linux?
Risposta accettata:
La risposta è "Probabilmente sì, ma dipende dal tipo di filesystem e dai tempi".
Nessuno di questi tre esempi sovrascriverà i blocchi di dati fisici di file_vecchio o file_esistente, se non per caso.
-
mv new_file old_file. Questo scollegherà old_file. Se sono presenti collegamenti fisici aggiuntivi a file_vecchio, i blocchi rimarranno invariati nei collegamenti rimanenti. In caso contrario, i blocchi verranno generalmente (dipende dal tipo di filesystem) inseriti in un elenco libero. Quindi, se ilmvrichiede la copia (anziché spostare semplicemente le voci di directory), i nuovi blocchi verranno allocati comemvscrive.Questi blocchi appena assegnati possono o non possono essere gli stessi che sono stati appena liberati . Su filesystem come UFS, i blocchi vengono allocati, se possibile, dallo stesso gruppo di cilindri della directory in cui è stato creato il file. Quindi c'è la possibilità che lo scollegamento di un file da una directory e la creazione di un file nella stessa directory vengano riutilizzati ( e sovrascrivi) alcuni degli stessi blocchi che sono stati appena liberati. Questo è il motivo per cui il consiglio standard per le persone che rimuovono accidentalmente un file è di non scrivere nuovi dati nei file nel loro albero di directory (e preferibilmente non nell'intero filesystem) finché qualcuno non può tentare il ripristino del file.
-
cp new_file old_filefarà quanto segue (puoi usarestraceper vedere le chiamate di sistema):open("old_file", O_WRONLY|O_TRUNC) = 4Il flag O_TRUNC causerà la liberazione di tutti i blocchi di dati, proprio come
mvfatto sopra. E come sopra, verranno generalmente aggiunti a un elenco gratuito e potrebbero o meno essere riutilizzati dalle successive scritture eseguite dalcpcomando. -
vi existing_file. Seviin realtà èvim, il:xcomando esegue le seguenti operazioni:unlink("existing_file~") = -1 ENOENT (No such file or directory)rename("existing_file", "existing_file~") = 0open("existing_file", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 3Quindi non rimuove nemmeno i vecchi dati; i dati vengono conservati in un file di backup.
Su FreeBSD,
vifaopen("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664), che avrà la stessa semantica dicp, sopra.
Puoi recuperare alcuni o tutti i dati senza programmi speciali; tutto ciò di cui hai bisogno è grep e dd e accedere al dispositivo non elaborato.
Per piccoli file di testo, il singolo grep il comando nella risposta di @Steven D nella domanda a cui ti sei collegato è il modo più semplice:
grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1
Ma per file più grandi che potrebbero trovarsi in più blocchi non contigui, faccio questo:
grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file
che ti darà l'offset in byte della riga corrispondente. Segui questo con una serie di dd comandi, a cominciare da
dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)
Vorresti anche leggere alcuni blocchi prima e dopo quel blocco. Su UFS, i blocchi di file sono in genere 8 KB e di solito sono allocati in modo abbastanza contiguo, i blocchi di un singolo file vengono intercalati alternativamente con blocchi da 8 KB da altri file o spazio libero. La coda di un file su UFS è composta da un massimo di 7 frammenti da 1 KB, che possono essere contigui o meno.
Correlati:concatenare file specifici in un unico file?Naturalmente, sui file system che comprimono o crittografano i dati, il ripristino potrebbe non essere così semplice.
In realtà ci sono pochissime utilità in Unix che sovrascriveranno i blocchi di dati di un file esistente. Uno che mi viene in mente è dd conv=notrunc . Un altro è shred .