Перезаписанные файлы могут быть восстановлены?

Лучше отключите это и просто закройте пользователей (или даже просто каждого пользователя) при перемещении данных. Если у Вас будут люди, входящие в систему, то они изменят данные, которые будут скопированы, и затем необходимо было бы перезапустить копию. Промывка и повторение, пока у Вас нет всего этого. Затем переключитесь, но Вы не можете сделать этого, в то время как они зарегистрированы. И так далее. Сглаживать ошибки в любой такой схеме - большая работа, и если это - просто временная мера, забудьте об этом. Слишком много работы, слишком много риска.

44
13.04.2017, 15:36
5 ответов

Ответ: "Возможно, да, но это зависит от типа файловой системы и времени"

Ни один из этих трех примеров не перезапишет физические блоки данных old_file или existing_file, за исключением случайности.

  • mv new_file old_file. Это разблокирует старый_файл. Если к старому_файлу будут добавлены дополнительные жесткие ссылки, то блоки останутся неизменными в оставшихся ссылках. В противном случае, блоки, как правило (в зависимости от типа файловой системы), будут помещены в свободный список. Тогда, если mv требует копирования (в отличие от простого перемещения записей каталога), новые блоки будут распределены так, как это делает mv.

    Эти вновь назначенные блоки могут быть или не быть теми же самыми, которые были только что освобождены . На файловых системах типа UFS блоки выделяются, по возможности, из той же группы цилиндров, что и каталог, в котором был создан файл. Поэтому есть вероятность того, что при разблокировке файла из каталога и создании файла в том же каталоге будут повторно использованы (и перезаписаны) некоторые из тех же блоков, которые только что были освобождены. Вот почему стандартный совет людям, случайно удалившим файл, - не записывать новые данные в файлы в дереве каталогов (а желательно не во всю файловую систему) до тех пор, пока кто-нибудь не сможет попытаться восстановить файл.

  • cp new_file old_file сделает следующее (вы можете использовать strace, чтобы увидеть системные вызовы):

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

    Флаг O_TRUNC приведет к освобождению всех блоков данных, так же как и mv, описанное выше. И, как было сказано выше, они, как правило, будут добавлены в свободный список, и могут или не могут быть повторно использованы последующими записями, выполняемыми командой cp.

  • vi existing_file. Если vi на самом деле является vim, команда :x делает следующее:

    unlink("existing_file~") = -1 ENOENT (Нет такого файла или директории)
    rename("existing_file", "existing_file~") = 0
    open("existing_file", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 3

    Таким образом, он даже не удаляет старые данные; данные сохраняются в файле резервной копии.

    На FreeBSD, vi делает open("existing_file",O_WRONLY|OCREAT|O_TRUNC, 0664), что будет иметь ту же семантику, что и cp, описанную выше.


Можно восстановить некоторые или все данные без специальных программ; все, что вам нужно, это grep и dd, а также доступ к необработанному устройству.

Для небольших текстовых файлов, единственная команда grep в ответе из @Steven D в вопросе, с которым вы связались, является самым простым способом:

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

Но для больших файлов, которые могут быть в нескольких не связанных между собой блоках, я делаю это:

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

, что даст вам смещение в байтах соответствующей строки. Следуйте этому примеру с помощью серии команд dd, начиная с

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

Вы также захотите прочитать несколько блоков до и после этого блока. В UFS файловые блоки обычно имеют размер 8 КБ и обычно распределяются достаточно смежно, причем блоки одного файла чередуются с блоками по 8 КБ из других файлов или из свободного пространства. Хвост файла на UFS составляет до 7 фрагментов по 1 КБ, которые могут быть или не быть смежными.

Конечно, в файловых системах, которые сжимают или шифруют данные, восстановление может быть не таким простым.


На самом деле в Unix очень мало утилит, которые перезаписывают блоки данных существующего файла. На ум приходит dd conv=notrunc. Другая - shred.

64
27.01.2020, 19:34

Я скажу нет (с гигантской звездочкой).

Подумайте о том, как данные лежат на диске. У вас есть блоки, которые содержат данные и указывают на следующий блок (если он есть).

Когда вы перезаписываете данные, вы изменяете содержимое блока (а если вы расширяете файл, то весь конечный маркер). Таким образом, ничто не должно быть восстановлено (см. ниже).

Если вы укоротите файл, то потеряете старые блоки, и они вскоре будут переработаны. Если вы программист, подумайте о связанном списке, где вы "теряете" половину списка, не делая free/delete. Эти данные все еще там, но удачи вам в их поисках.

Может быть интересно подумать о фрагментации.

Фрагментация происходит, когда у вас на диске есть "дыры" в несоприкасающихся данных. Это может быть вызвано модификацией файлов таким образом, что вы расширяете или укорачиваете их, и они больше не помещаются в их исходное место на диске.

В случае, если файл вырастет после своего первоначального размера (он должен быть перемещен в этот момент), в зависимости от вашей файловой системы, вы можете скопировать весь файл в новое место, где старые данные все еще будут там (но помечены как свободные), или вы просто измените старый указатель на конец и заставите его указать на новое место (это приведет к "молочнице").

Короче говоря, ваши данные, вероятно, потеряны (без прохождения экстремального процесса криминалистики, когда вы смотрите на них под микроскопом); однако, есть шанс, что они все еще там.

6
27.01.2020, 19:34

Я не совсем уверен, как это работает с вашим файловым менеджером, но, предположительно, «open in terminal» - это то, что вы используете в каталогах, и это просто открывает окно терминала в этом месте. Если да, достаточно получить сценарий из файла инициализации для интерактивных оболочек без входа в систему. Если вы используете bash , то это ~/.bashrc , и вам нужно отредактировать этот файл и добавить в него следующую строку:

. ~/myscript

Это предполагает, что myscript находится в вашем ~/. Теперь каждый раз при запуске новой оболочки, включая открытие нового терминала, этот файл будет использоваться в качестве источника.


Однако обратите внимание, что отображаемый сценарий не является сценарием bash. В bash нет команды setenv , это С-оболочка. Эквивалент bash будет:

#!/bin/bash
export DISPLAY=127.0.0.1:10.0
cd /ast/dcm/data
-121--74211-

Я не верю, что есть способ в целом. Вы сказали, что Unix/Linux, но, возможно, вас интересует решение для конкретной ОС?

Например, Solaris хранит аргумент процессов в двух расположениях. Один из них является неизменяемым буфером в ядре, связанным с процессом. Но поскольку это буфер ядра, длина ограничена и может быть усеченной версией командной строки.

Другое местоположение - ARGV [] в самом процессе. Это может быть запрошено (например, с помощью pargs ) и вернет неусеченное содержимое. Но поскольку ARGV является частью памяти процесса, его можно модифицировать в любое время. Содержимое может отличаться от содержимого командной строки, запустившей процесс.

Более поздний пользователь не может гарантированно найти исходную командную строку.


Я только что нашел ответ Стефана Шазеласа на аналогичную проблему: ps: full command is too long

Похоже, он включает метод, который пытается декодировать ARGV [] в двоичных файлах x86 ELF, но я не смог получить из него данные в тестовом случае. Я не знаю почему. Но техника кажется разумной.

-121--108521-

Я перезаписал текстовый файл (VQ1.txt) с тестовыми данными за 12 ч: ( Представление о том, что unix сохраняет предыдущую версию файла в формате text.txt ~, заставил меня заглянуть в папку, содержащую перезаписанный файл с $ -ll В полном списке указан файл VQ1.txt ~ с моими «потерянными» данными!

$ cat VQ1.txt~  
Start time at: Thu Apr  2 18:07:23 PDT 2015
User, KW: 12hrFA_OEM_HelloVoiceQ
Test Case: 
Detection:  1, 1, 04-03 01:07:00.673 D/MultiKeywordBdctReceiver( 1743): vs status 258 : 2 : 1
Detection:  2, 1, 04-03 01:09:04.813 D/MultiKeywordBdctReceiver( 1743): vs status 258 : 2 : 1
Detection:  3, 1, 04-03 04:09:26.023 D/MultiKeywordBdctReceiver( 1743): vs status 258 : 2 : 1
Detection:  4, 1, 04-03 04:11:29.893 D/MultiKeywordBdctReceiver( 1743): vs status 258 : 2 : 1
Detection:  5, 1, 04-03 07:12:27.013 D/MultiKeywordBdctReceiver( 1743): vs status 258 : 2 : 1
Detection:  6, 1, 04-03 07:14:30.803 D/MultiKeywordBdctReceiver( 1743): vs status 258 : 2 : 1
Detection:  7, 1, 04-03 08:37:13.113 D/MultiKeywordBdctReceiver( 1743): vs status 258 : 2 : 1
Detection:  8, 1, 04-03 10:21:23.533 D/MultiKeywordBdctReceiver( 1743): vs status 258 : 2 : 1
Detection:  9, 1, 04-03 10:23:27.733 D/MultiKeywordBdctReceiver( 1743): vs status 258 : 2 : 1
Detection:  10, 1, 04-03 13:23:47.893 D/MultiKeywordBdctReceiver( 1743): vs status 258 : 2 : 1
Detection:  11, 1, 04-03 13:25:52.203 D/MultiKeywordBdctReceiver( 1743): vs status 258 : 2 : 1

12hrFA_OEM_HelloVoiceQ,  
KW detect count: 11
0
27.01.2020, 19:34

TL;DR -Если перезаписанный файл все еще остается открытым запущенным процессом, эта запись в блоге может спасти вас:

https://www.linux.com/news/bring-back-deleted-files-lsof/

В нем говорится о удаленных файлах, но мне с ним повезло даже с файлом, который был перезаписан rsync. И я говорю о файле размером 60 ГБ, перезаписанном файлом размером 4 МБ, и я смог восстановить оригинал, потому что, к счастью, я не остановил запущенный процесс, который держал его открытым.

3
27.01.2020, 19:34

Я оказался в такой же ситуации -Я сделал "mv FILE1.c FILE2.c".

Вы требовали, чтобы «на машине с Linux не было установлено никаких специальных программ», что возможно, если вы устанавливаете эти инструменты на другие машины или используете livedisk.

Остановить или ограничить запись на диск

В такой ситуации лучше всего ограничить любую запись в системе под рукой, потому что вы действительно можете перезаписать данные, которые хотите сохранить.

Итак, прежде всего, я надеюсь, что вы не просматриваете веб-страницы с компьютера, на котором у вас есть данные!

В некоторых случаях файл все еще может быть открыт в процессе. Если вы думаете, что это так, пока не останавливайте машину. Возможно, вы захотите сначала перевести процесс, удерживающий файл открытым, в спящий режим, прежде чем искать дескриптор ваших данных. И в этом случае вам не нужно останавливать свою машину. По крайней мере еще один ответ указывает на метод. Файл часто будет иметь громоздкое имя в каталоге, где он был расположен (посмотрите, используяls -lart-самые последние файлы появляются последними, и дата может подсказать вам, что является лучшим предположением ).

Использовать систему восстановления

Затем, согласно вашим приоритетам, выполните одно из следующих действий:

Если вы можете подключить диск к другому компьютеру или загрузиться с другого раздела, USB-накопителя или Live CD:

Остановите машину, если это приемлемо для вас (и вашей системы ), просто выключите ее, отключив вилку питания, аккумулятор или нажав и удерживая кнопку включения/выключения.
Чистое отключение питания добавляет некоторый риск перезаписи нужного файла.

Если вы не можете запустить другую систему:Ограничьте свои записи в систему. Убить программы, которые могут записывать на диск.

«photorec», установленный с «testdisk»

Большую часть времени я использую "testdisk". Я попал на эту страницу, когда проверял, есть ли другой метод, о котором я не знал.

«testdisk» — это набор инструментов, которые я часто устанавливаю заранее, и я установил его на свой «устаревший» компьютер с Ubuntu 16.04 (по уважительной причине ).

Вы требовали, чтобы «на машине с linux не было установлено никаких специальных программ» -вы можете установить «testdisk» на другую машину и прочитать оттуда исходный диск. Вы также можете загрузиться с USB-диска.

Если вы не можете этого сделать, вы можете установить его в системе под рукой. В этом случае я рекомендую удалить некоторые старые большие файлы, которые у вас есть, такие как большой ZIP, который вы скачали некоторое время назад, или iso. Я делаю это, потому что полагаю, что последние данные имеют тенденцию располагаться ближе к концу диска, а не к его началу.

Затем вы можете просто установить 'testdisk', используя что-то вроде (пример для Debian):

apt-get install testdisk

Затем запустите "photorec" и дайте ему восстановить файлы в (раздел )устройства, отличный от того, на котором находятся ваши данные. Это может быть USB-накопитель, сетевой диск и даже каталог /tmp в некоторых случаях (, когда он отображается в ОЗУ ).

photorec /d PATH_TO_OTHER_DEVICE

После выбора устройства для восстановления выберите «[Файл]» в нижнем меню. Затем отмените выбор всех параметров и выберите только тот тип файла, который вы ищете. В моем случае это был файл «C» -, поэтому я выбрал «текст». photorecпо-прежнему создал .cфайлы, которые он нашел. Затем запустите [Search]и смотрите только в пространстве Free.

Во время восстановления я выполнил команду типа:

grep minTemp recup*/*.c

В пути, где каталоги восстановления были созданы photorec. Я знал, что в моем файле присутствует «minTemp», и я искал файл c.

Я получил 30 записей о разных версиях файла, сначала изучив более крупные.

photorecвсе еще выполнялся, но теперь были новые совпадения в 'minTemp', поэтому я остановил этот процесс, так как был уверен, что у меня есть нужный мне файл.

Внешняя служба

В зависимости от вашего опыта вы также можете передать работу на субподряд. Есть довольно много компаний, специализирующихся на восстановлении данных -, они не устанавливают никаких инструментов на ваш диск. Минимальная стоимость составляет около 500 долларов, если субподрядчик может восстановить данные.

Подготовить

Чтобы лучше справиться с такой ситуацией, подготовьтесь!:

  • Узнайте, как восстанавливать данные до того, как это произойдет, попробуйте восстановить некоторые данные, когда вам не нужно их восстанавливать.
  • Установите 'testdisk' в свои системы до того, как он вам понадобится (при установке testdisk данные не будут перезаписаны, так как он уже установлен );
  • Храните ваши данные в разделе, отличном от ваших системных файлов -некоторые даже рекомендуют отдельный раздел для каталога /tmp;
  • Использовать моментальные снимки. Вы можете сделать это на уровне «устройства» (, zfs/btrfs ), инструментов моментальных снимков (, rsnapshot )и даже в частных облаках, которые могут хранить некоторые старые версии файлов. Существуют также системы NAS, в которые встроена такая функция (. ​​Предыдущие версии можно найти в каталогах «.snapshot»;
  • Используйте инструменты резервного копирования, такие как ShadowProtect, Acronis и другие, которые позволяют часто выполнять инкрементное резервное копирование онлайн-дисков.
  • Подготовьте USB-накопитель с инструментами восстановления и соответствующими действующими ОС. [Я держу один при себе].
1
31.12.2020, 17:34

Теги

Похожие вопросы