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 ilmv
richiede la copia (anziché spostare semplicemente le voci di directory), i nuovi blocchi verranno allocati comemv
scrive.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_file
farà quanto segue (puoi usarestrace
per vedere le chiamate di sistema):open("old_file", O_WRONLY|O_TRUNC) = 4
Il flag O_TRUNC causerà la liberazione di tutti i blocchi di dati, proprio come
mv
fatto sopra. E come sopra, verranno generalmente aggiunti a un elenco gratuito e potrebbero o meno essere riutilizzati dalle successive scritture eseguite dalcp
comando. -
vi existing_file
. Sevi
in realtà èvim
, il:x
comando esegue le seguenti operazioni:unlink("existing_file~") = -1 ENOENT (No such file or directory)
rename("existing_file", "existing_file~") = 0
open("existing_file", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 3
Quindi non rimuove nemmeno i vecchi dati; i dati vengono conservati in un file di backup.
Su FreeBSD,
vi
faopen("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
.