GNU/Linux >> Linux Esercitazione >  >> Linux

È possibile recuperare i file sovrascritti?

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 il mv richiede la copia (anziché spostare semplicemente le voci di directory), i nuovi blocchi verranno allocati come mv 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 usare strace 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 dal cp comando.

  • vi existing_file . Se vi 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 fa open("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664) , che avrà la stessa semantica di cp , 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 .


Linux
  1. Uno script Bash può essere agganciato a un file?

  2. Perché i file non possono essere manipolati da inode?

  3. Perché non posso creare file più grandi di 2 GB su Linux?

  4. Non riesci a smontare un file con backup in loop ma non ci sono file aperti?

  5. Come posso modificare più file in VIM?

Copiare file in Linux

Comando Cp in Linux (copia file)

Come rinominare uno o più file in Linux

Come posso correggere i permessi dei miei file?

Trasferisci file usando WinSCP

Come comprimere un file in Linux