GNU/Linux >> Tutoriels Linux >  >> Linux

Les fichiers écrasés peuvent-ils être récupérés ?

Je ne parle pas de récupérer des fichiers supprimés, mais écrasés des dossiers. A savoir par les méthodes suivantes :

# move
mv new_file old_file

# copy
cp new_file old_file

# edit
vi existing_file
> D
> i new_content
> :x

Est-il possible de récupérer quoi que ce soit si l'une des trois actions ci-dessus est effectuée en supposant qu'aucun programme spécial n'est installé sur la machine Linux ?

Réponse acceptée :

La réponse est "Probablement oui, mais cela dépend du type de système de fichiers et de la synchronisation."

Aucun de ces trois exemples n'écrasera les blocs de données physiques de old_file ou existing_file, sauf par hasard.

  • mv new_file old_file . Cela dissociera old_file. S'il existe des liens physiques supplémentaires vers old_file, les blocs resteront inchangés dans ces liens restants. Sinon, les blocs seront généralement (cela dépend du type de système de fichiers) placés sur une liste libre. Ensuite, si le mv nécessite une copie (par opposition au simple déplacement des entrées de répertoire), les nouveaux blocs seront alloués en tant que mv écrit.

    Ces blocs nouvellement alloués peuvent ou non être les mêmes que ceux qui viennent d'être libérés . Sur les systèmes de fichiers comme UFS, les blocs sont alloués, si possible, à partir du même groupe de cylindres que le répertoire dans lequel le fichier a été créé. Il est donc possible que le fait de dissocier un fichier d'un répertoire et de créer un fichier dans ce même répertoire réutilise ( et écraser) certains des mêmes blocs qui viennent d'être libérés. C'est pourquoi le conseil standard aux personnes qui suppriment accidentellement un fichier est de ne pas écrire de nouvelles données dans les fichiers de leur arborescence de répertoires (et de préférence pas dans l'ensemble du système de fichiers) jusqu'à ce que quelqu'un puisse tenter de récupérer le fichier.

  • cp new_file old_file fera ce qui suit (vous pouvez utiliser strace pour voir les appels système) :

    open("old_file", O_WRONLY|O_TRUNC) = 4

    Le drapeau O_TRUNC entraînera la libération de tous les blocs de données, tout comme mv fait ci-dessus. Et comme ci-dessus, ils seront généralement ajoutés à une liste libre, et pourront ou non être réutilisés par les écritures ultérieures effectuées par le cp commande.

  • vi existing_file . Si vi est en fait vim , le :x commande fait ce qui suit :

    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

    Donc, il ne supprime même pas les anciennes données ; les données sont conservées dans un fichier de sauvegarde.

    Sous FreeBSD, vi est-ce que open("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664) , qui aura la même sémantique que cp , ci-dessus.

Vous pouvez récupérer tout ou partie des données sans programmes spéciaux; tout ce dont vous avez besoin est grep et dd , et l'accès au périphérique brut.

Pour les petits fichiers texte, le seul grep commande dans la réponse de @Steven D dans la question à laquelle vous avez lié est le moyen le plus simple :

grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1

Mais pour les fichiers plus volumineux qui peuvent se trouver dans plusieurs blocs non contigus, je fais ceci :

grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file

qui vous donnera le décalage en octets de la ligne correspondante. Suivez ceci avec une série de dd commandes, commençant par

dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)

Vous voudrez également lire certains blocs avant et après ce bloc. Sur UFS, les blocs de fichiers font généralement 8 Ko et sont généralement alloués de manière assez contiguë, les blocs d'un seul fichier étant entrelacés en alternance avec des blocs de 8 Ko provenant d'autres fichiers ou d'espace libre. La fin d'un fichier sur UFS peut contenir jusqu'à 7 fragments de 1 Ko, qui peuvent ou non être contigus.

En relation :Concaténer des fichiers spécifiques dans un seul fichier ?

Bien sûr, sur les systèmes de fichiers qui compressent ou chiffrent les données, la récupération peut ne pas être aussi simple.

Il existe en fait très peu d'utilitaires sous Unix qui écrasent les blocs de données d'un fichier existant. Celui qui me vient à l'esprit est dd conv=notrunc . Un autre est shred .


Linux
  1. Comment puis-je lier symboliquement un fichier sous Linux?

  2. Pourquoi les fichiers ne peuvent-ils pas être manipulés par inode ?

  3. Compter les lignes dans les fichiers volumineux

  4. comment puis-je rechercher des fichiers et les compresser dans un seul fichier zip

  5. Comment puis-je modifier un fichier s'il n'y a pas de vi, vim, joe, etc. ?

Copier des fichiers sous Linux

Commande Cp sous Linux (Copier des fichiers)

Comment renommer un ou plusieurs fichiers sous Linux

Comment puis-je corriger les autorisations de mes fichiers ?

Transférer des fichiers à l'aide de WinSCP

Comment compresser un fichier sous Linux