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 lemv
nécessite une copie (par opposition au simple déplacement des entrées de répertoire), les nouveaux blocs seront alloués en tant quemv
é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 utiliserstrace
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 lecp
commande. -
vi existing_file
. Sivi
est en faitvim
, 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 queopen("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664)
, qui aura la même sémantique quecp
, 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
.