Начнем с небольшой теории, когда вы удаляете данные, по факту они не удаляются сразу с жесткого диска. Они просто становится по сути невидимым для вас, но всё еще остаётся лежать где-то на жёстком диске и место занимаемое этими данными помечается как доступное. При создании файлов данные разбиваются на куски и хранятся в определённые блоках на жестком диске и пока другие данные не перезапишут эти данные удаленных файлов, они всё еще будут находится там.

file deleting process

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

  1. Файлы помечаются как удалённые и скрываются от пользователя
  2. Все блоки в которых хранятся данные файлов помечаются как для перезаписи, т.е. меняется состояние блоков. Место занимаемое данными помечается как свободное и доступное для перезаписи
  3. При создании новых файлов данные могут быть помещены в эти блоки и соответственно перезаписывают те данные, которые были помечены для перезаписи

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

Устанавливаем Scalpel

Для восстановления удалённых данных, если они еще не перезаписаны мы будем пользоваться утилитой Scalpel.

sudo apt install scalpel

sudo yum install epel-release
sudo yum install scalpel

sudo pacman -S scalpel

Файл конфигурации

Я думаю стоит обратит отдельное внимание на файл конфигурации (/etc/scalpel.conf), так как в нём прописаны уже предустановленные типы файлов, которые вы можете восстановить. Дело в том, что Scalpel ищет только те файлы, расширение которых подпадает под настройки в файле конфигурации.

Но помимо расширения в файле также указывается минимальный и максимальный размер файла. А также стандартный заголовок и нижний колонтитул файла.

Для примера возьмём строку jpg y 5:200000000 \xff\xd8\xff\xe0\x00\x10 \xff\xd9, где:

  • jpg - Расширение файла
  • y - Чувствительны ли верхний и нижний колонтитулы к регистру
  • 5:200000000 - Минимальный и максимальный размер файла
  • \xff\xd8\xff\xe0\x00\x10 - Стандартный заголовок, идентифицирующий начало файла
  • \xff\xd9 - Стандартный нижний колонтитул, обозначающий конец файла

Восстанавливаем данные

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

Если вы восстанавливаете файлы с расширением, который уже есть в файле конфигурации то проблем по сути возникнуть недолжно. Например, попробуем восстановить удалённые картинки с диска /dev/sda в папку /sdb (отдельный диск).

sudo vim scalpel.conf
jpg y 5:200000000 \xff\xd8\xff\xe0\x00\x10 \xff\xd9
sudo scalpel -c scalpel.conf -o /sdb/ /dev/sda

Восстанавливаем файлы txt

Вот тут уже немного посложнее, мы уже говорили, что в конфиге также указывается Стандартный заголовок и Стандартный нижний колонтитул. Это значит, что мы каким-то образом сперва должны получить эти значения для удалённого файла. Звучит немного сложно, но давайте попробуем разобраться.

  1. Если вы знаете что ваш удалённый файл начинался со строки just, то вы можете создать новый файл и получить Стандартный заголовок и Стандартный нижний колонтитул.
echo "just for test" > 111.txt
  1. Теперь получим заголовок используя утилиту head, где считаем первые 4 символов и переведём их в hex.
head --bytes 4 111.txt | hexdump -C
6a 75 73 74
  1. Тоже самое сделаем и с концом файла, чтобы получить нижний колонтитул
tail --bytes -4 111.txt | hexdump -C
65 73 74 0a
  1. Редактируем файл конфигурации
sudo vim scalpel.conf 
txt     y       100000  \x6a\x75\x73\x74 \x65\x73\x74\x0a
  1. Запускаем восстановление
sudo scalpel -c scalpel.conf -o /sdb/ /dev/sda 
txt with header "\x6a\x75\x73\x74" and footer "\x65\x73\x74\x0a" --> 57845 files
  1. Проверяем что в директорию /sdb восстановились файлы txt, которые начинаются со строки just for test
sudo grep -rnw /sdb1/ -e "just for test"
/sdb1/txt-0-50/00050711.txt:1:just for test

Итог

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