Я говорю не о восстановлении удаленных файлов , а о перезаписанных файлах. А именно следующими методами:
# move
mv new_file old_file
# copy
cp new_file old_file
# edit
vi existing_file
> D
> i new_content
> :x
Можно ли получить что-нибудь, если какое-либо из указанных выше трех действий выполнено, если на компьютере с Linux не установлено никаких специальных программ?
data-recovery
ext4
Вопрос переполнен
источник
источник
mv
) сродни удалениюold_file
, а не перезаписи, поэтому в этом случае будут применяться методы (если они существуют) для восстановления удаленных файлов, в отличие от перезаписанных файлов. Два других ваших примера действительно перезаписывают существующийold_file
иexisting_file
, соответственно.mv
отличается.Ответы:
Ответ: «Возможно, да, но это зависит от типа файловой системы и времени».
Ни один из этих трех примеров не перезапишет физические блоки данных old_file или существующие_file, за исключением случайного.
mv new_file old_file
, Это отвяжет old_file. Если на old_file есть дополнительные жесткие ссылки, блоки в этих оставшихся ссылках останутся неизменными. В противном случае блоки обычно (в зависимости от типа файловой системы) будут помещены в свободный список. Затем, еслиmv
требуется копирование (в отличие от простого перемещения записей каталога), новые блоки будут выделены какmv
записи.Эти вновь распределенные блоки могут быть или не быть теми же, которые были только что освобождены . В файловых системах, таких как UFS , блоки распределяются, если это возможно, из той же группы цилиндров, что и каталог, в котором был создан файл. Так что есть вероятность, что отсоединение файла от каталога и создание файла в этом же каталоге будет использоваться повторно ( и перезаписать) некоторые из тех же блоков, которые были только что освобождены. Вот почему стандартный совет для людей, которые случайно удаляют файл, - не записывать новые данные в файлы в их дереве каталогов (и желательно не во всю файловую систему), пока кто-то не попытается восстановить файл.
cp new_file old_file
будет делать следующее (вы можете использоватьstrace
для просмотра системных вызовов):Флаг O_TRUNC приведет к освобождению всех блоков данных, как это
mv
делалось выше. И, как указано выше, они, как правило, добавляются в свободный список и могут или не могут быть повторно использованы последующими записями, выполненнымиcp
командой.vi existing_file
, Еслиvi
это на самом делеvim
,:x
команда делает следующее:Так что он даже не удаляет старые данные; данные сохраняются в файле резервной копии.
На FreeBSD,
vi
делаетopen("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664)
, который будет иметь ту же семантику, чтоcp
и выше.Вы можете восстановить некоторые или все данные без специальных программ; все , что вам нужно ,
grep
иdd
, а также доступ к исходному устройству.Для небольших текстовых файлов, единственная
grep
команда в ответе @Steven D в вопросе, на который вы ссылаетесь, является самым простым способом:Но для больших файлов, которые могут быть в нескольких несмежных блоках, я делаю это:
который даст вам смещение в байтах совпадающей строки. Выполните это с помощью ряда
dd
команд, начиная сВы также хотели бы прочитать некоторые блоки до и после этого блока. В UFS файловые блоки обычно имеют размер 8 КБ и обычно распределяются довольно непрерывно, причем блоки одного файла чередуются с блоками 8 КБ из других файлов или свободного места. Длина файла в UFS составляет до 7 фрагментов по 1 КБ, которые могут быть или не быть смежными.
Конечно, в файловых системах, которые сжимают или шифруют данные, восстановление может быть не таким простым.
На самом деле в Unix очень мало утилит, которые перезаписывают блоки данных существующего файла. Тот, который приходит на ум, это
dd conv=notrunc
. Другой естьshred
.источник
btrfs
довольно устойчив к удаленным файлам. Он имеет тенденцию использовать блоки циклически, поэтому, если у вас достаточно места на устройстве, файл не будет перезаписываться в течение длительного времени. Смотрите здесьskip=
параметр dd , вместо чтения с начала ввода будет пропущено это количество блоков. По умолчанию размер блока составляет 512 байт, но его можно изменить с помощьюbs=
параметра.skip=
значение, которое на 1 блок (512 байт) меньше. В моем примере$(expr 13813610612 / 512 - 1)
. Если это не дает того, что вы хотите, попробуйте еще раз, вычитая 16 или 32, что позволит увидеть области, которые на 8192 и 16384 байта меньше; файлы часто размещаются в 8192-байтовых чанках. Если вы пытаетесь восстановить больший файл, попробуйте большее количество, чтобы сэкономить время. Я обычно используюcount=16
и смотрю на результат в редакторе,emacs
который не возражает, если некоторые данные не являются текстовыми.Я собираюсь сказать нет (с гигантской звездочкой).
Подумайте о том, как данные лежат на диске. У вас есть блоки, которые содержат данные и указывают на следующий блок (если он есть).
Когда вы перезаписываете данные, вы изменяете содержимое блока (и, если вы расширяете файл, все заканчиваются маркером). Так что ничто не должно быть в состоянии восстановить (см. Ниже).
Если вы укоротите файл, вы потеряете старые блоки, и они скоро будут переработаны. Если вы программист, подумайте о связанном списке, в котором вы «теряете» половину списка, не делая свободного / удаления. Эти данные все еще там, но удачи в их поиске.
Что-то, о чем может быть интересно подумать, это фрагментация.
Фрагментация происходит, когда на вашем диске есть «дыры» несмежных данных. Это может быть вызвано изменением файлов таким образом, что вы расширяете или укорачиваете их, и они больше не помещаются в исходное место на диске.
В случае, если размер файла превышает его первоначальный размер (он должен перемещаться в этот момент), в зависимости от вашей файловой системы вы можете скопировать весь файл в новое место, где старые данные все еще будут там (но помечены как свободные) или вы просто меняете старый конечный указатель и указываете на новое местоположение (это приведет к перебоям).
Короче говоря, ваши данные, вероятно, потеряны (без прохождения экстремального судебного процесса, когда вы смотрите на них под микроскопом); Однако есть вероятность, что он все еще там.
источник
ext4
илиxfs
используется. С копированием при записи файловых систем, таких какzfs
иbtrfs
вы на самом деле никогда не «меняете содержимое блока»; эти файловые системы всегда используют новые блоки для хранения новых данных. Кроме того, файловые системы, основанные на журналах,jffs2
также всегда записывают новые данные в новые местоположения (не «блоки», эти файловые системы не основаны на блоках). Это, как говорится, не означает, что легко найти, где хранятся старые данные, и сделать это до того, как пространство будет использовано повторно. Таким образом, ваш ответ, который нет, по-прежнему правильныйУбедитесь, что у вас достаточно дискового пространства в / var / tmp или где-то большом.
Пытаться
где / dev / sda1 будет вашим диском в вашей системе.
Затем найдите строку my-recovered-file для вашей строки.
В основном это может быть там, если вы найдете его, проверьте наличие пропущенных строк, скобок, системных символов и т. Д.
Используйте искомое слово из вашего файла, которое является довольно незаполненным, или строку, которая сократит объем данных в файле. Если вы ищете слово типа «эхо», вы получите множество строк, так как в системе будет много файлов со словом «эхо».
источник
Я переписал текстовый файл (VQ1.txt) с тестовыми данными стоимостью 12 часов :( Из-за того, что unix сохраняет предыдущую версию файла в формате text.txt ~, я перешел в папку, содержащую перезаписанный файл, с $ -ll Full список показал VQ1.txt ~, в котором были мои «потерянные» данные!
источник
TL; DR - если перезаписанный файл все еще остается открытым во время запущенного процесса, то эта запись в блоге может сохранить ваш бекон:
https://www.linux.com/news/bring-back-deleted-files-lsof/
В нем говорится об удаленных файлах, но мне повезло с этим, даже с файлом, который был перезаписан rsync. И я говорю о 60 ГБ файле, перезаписанном 4 МБ, и я смог восстановить оригинал, потому что, к счастью, я не остановил запущенный процесс, который держал его открытым.
источник