Найти тему

Восстановление данных с неработающих флешек — частая просьба, с которой обращаются к «тыжпрограммисту»

Давай посмотрим, что можно сделать с «убитой» флешкой, применяя такие утилиты, как TestDisk и PhotoRec, а потом и без них — используя Hex-редактор и голову на плечах.

Предыстория
Недавно ко мне пришел товарищ с фразой: «У меня флешка сломалась, можешь посмотреть? В принципе, если не получится, то и ладно, но там есть несколько файлов, копий которых нет».
Я, конечно, флешку взял и обещал посмотреть, что можно сделать. Грех не помочь другу! Входные данные были такие: «винда перестала видеть флешку». Других внятных объяснений произошедшего я не добился.
И вот, когда выдалось немного свободного времени, настала пора попробовать восстановить какие-то данные с флешки.

Первым делом, подключив флешку к ноуту с Linux, я убедился, что аппаратная часть девайса жива, а повреждены именно данные на ней.
Второе, что я сделал, — снял образ.

Техника безопасности: снимаем образ:
Самая важная часть в восстановлении данных — не угробить своими действиями еще больше данных. Все описываемые в статье действия производились исключительно с образом флешки. Снять образ можно следующими командами (тебе, конечно, надо указать путь к своему устройству):
$ dd if=/dev/sdc of=flash.img bs=512
Как вариант, можно использовать команду ddrescue:
$ ddrescue /dev/sdc flash.img /tmp/flash.log
Лично я предпочитаю второй способ, поскольку ddrescue пытается считать данные в несколько проходов, а также (если ты дал команду писать лог) прервать чтение и продолжить с места остановки. Плюс к этому утилита дает красивый отчет о том, сколько данных считалось, а сколько нет, и оценку времени до конца съема образа.
Кроме того, имеет смысл работать с копией образа. Вдруг ты его испортишь, и не факт, что получится еще раз снять образ с флешки, если она умирает из-за аппаратных проблем. Для частичных копий образа и восстановления испорченных частей к начальному состоянию рекомендую пользоваться тем же всемогущим dd.
$ ddrescue flash.img backup_part.img bs=10M count=1
$ ddrescue backup_part.img flash.img conv=notrunc.

Техника безопасности: снимаем образ:
Самая важная часть в восстановлении данных — не угробить своими действиями еще больше данных. Все описываемые в статье действия производились исключительно с образом флешки. Снять образ можно следующими командами (тебе, конечно, надо указать путь к своему устройству):
$ dd if=/dev/sdc of=flash.img bs=512
Как вариант, можно использовать команду ddrescue:
$ ddrescue /dev/sdc flash.img /tmp/flash.log
Лично я предпочитаю второй способ, поскольку ddrescue пытается считать данные в несколько проходов, а также (если ты дал команду писать лог) прервать чтение и продолжить с места остановки. Плюс к этому утилита дает красивый отчет о том, сколько данных считалось, а сколько нет, и оценку времени до конца съема образа.
Кроме того, имеет смысл работать с копией образа. Вдруг ты его испортишь, и не факт, что получится еще раз снять образ с флешки, если она умирает из-за аппаратных проблем. Для частичных копий образа и восстановления испорченных частей к начальному состоянию рекомендую пользоваться тем же всемогущим dd.
$ ddrescue flash.img backup_part.img bs=10M count=1
$ ddrescue backup_part.img flash.img conv=notrunc.

Параметр notrunc нужен для того, чтобы dd не обрезала файл-назначение, когда закончатся данные в файле-источнике.

Сняв образ флешки, я взглянул на содержимое. Увиденное несколько меня удивило.

$ hexdump -C flash.img|less
00000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
00400000 01 76 0a 00 02 76 0a 00 03 76 0a 00 04 76 0a 00 |.v...v...v...v..|
00400010 05 76 0a 00 06 76 0a 00 07 76 0a 00 08 76 0a 00 |.v...v...v...v..|
00400020 09 76 0a 00 0a 76 0a 00 0b 76 0a 00 0c 76 0a 00 |.v...v...v...v..|
00400030 0d 76 0a 00 0e 76 0a 00 0f 76 0a 00 10 76 0a 00 |.v...v...v...v..|
00400040 11 76 0a 00 12 76 0a 00 13 76 0a 00 14 76 0a 00 |.v...v...v...v..|
...

В образе первые 4 Мбайт данных были забиты 0xFF. Поврежден блок флеш-памяти? Чья-то попытка стереть данные? Сбой какого-то приложения? Почему затерта область — неважно. Главное, что у нас нет ни таблицы разделов, ни структуры файловой системы... Хотя если приглядеться, то видна закономерность. Перед нами последовательность увеличивающихся на единицу 32-битных чисел (в формате LittleEndian): 0x000a7601, 0x000a7602, 0x000a7603... Следовательно, у нас на флешке, скорее всего, была файловая система FAT32.


Что ж, попробуем восстановить данные. Для начала возьмем утилиту TestDisk.

TestDisk
TestDisk — не просто утилита, а мощный комбайн по восстановлению данных.


О TestDisk
TestDisk разработан Кристофом Гренье и распространяется по лицензии GPL v2. Эта утилита предназначена в первую очередь для восстановления потерянных разделов на носителях информации, а также для восстановления загрузочного сектора.

TestDisk может:

- исправлять таблицу разделов, восстанавливать удаленные разделы;
- восстанавливать загрузочный сектор FAT32 из резервной копии;
- перестраивать (реконструировать) загрузочный сектор FAT12/FAT16/FAT32;
- исправлять таблицу FAT;
- перестраивать (реконструировать) загрузочный сектор NTFS;
- восстанавливать загрузочный сектор NTFS из резервной копии;
- восстанавливать MFT;
- определять резервный SuperBlock ext2/ext3/ext4;
- восстанавливать удаленные файлы на файловых системах FAT, NTFS и ext2;
- копировать файлы с удаленных разделов FAT, NTFS и ext2/ext3/ext4.
Запускаем TestDisk такой командой:

$ testdisk flash.img

О других способах и средствах расскажу в следующих статьях.

С уважением, Ильдар Ильдаров!