понедельник, 11 мая 2015 г.

Восстановление таблицы разделов на карте памяти

Это история со счастливым концом о поломке карты памяти. Она адресована обладателям SDXC-карточек объёмом от 64 ГБ и больше, у которых в один прекрасный день камера (в случае автора — GoPro) сообщает «SD ERR» и отказывается работать. Поломка карты могла быть вызвана попыткой её установки в планшет, который рассчитан на карты 32 ГБ максимум, или неосторожным извлечением из компьютера, или сбоем самой камеры, неважно. Так или иначе, карта неработоспособна, а на ней остались ценные данные, поэтому просто взять и переформатировать её нельзя.

Вставляем карту в компьютер с линуксом. Ничего не происходит. Пробуем примонтировать карту вручную, зная, что в картах большого объёма используется файловая система exFAT:

$ sudo mount /dev/sdf1 /mnt/disk -t exfat
FUSE exfat 1.0.1
ERROR: exFAT file system is not found.

Ошибка подтверждает факт поломки карты. Чтобы не усугубить ситуацию, снимаем с карты образ, заодно проверяя на физические дефекты, с помощью GNU ddrescue:

$ sudo ddrescue -d /dev/sdf1 sdcard.img

Если по окончании работы ddrescue выводится нулевой счётчик ошибок (errors: 0), значит, карта не повреждена физически, и невозможность её чтения связана с нарушением целостности данных.
Дальнейшие действия рекомендуется производить со снятым образом, а не с картой. Для восстановления таблицы разделов существует утилита TestDisk. Запускаем:

$ testdisk sdcard.img

Нажимаем два раза на Enter и попадаем в следующее меню:


Выбор установлен в None — это ни о чём особенно не говорит. После нажатия Enter видим следующее меню:


Заходим в подменю Advanced (ещё один Enter):


Несмотря на сбитую таблицу разделов, содержимое карты всё же опознано: это один раздел с файловой системой exFAT. Достаточно восстановить таблицу разделов, и карта (т.е. образ) снова заработает. Существует резервная копия таблицы разделов, которая особым образом хранится в существующем найденном разделе. Команда для восстановления таблицы разделов из резервной копии находится в подменю Boot (нажимаем Enter):


Информация на экране гласит, что загрузочный сектор (с таблицей разделов) поломан, но резервная копия в норме. Выбираем команду Backup BS, нажимаем Enter, на следующем экране вводим подтверждение (Y), и дело сделано:


Для выхода из TestDisk нужно нажать «q» несколько раз. Образ теперь изменён — на нём восстановлена таблица разделов. В принципе, TestDisk предоставляет возможности для просмотра структуры директорий на разделе и экспорта файлов, включая удалённые. Однако, практика показывает, что экспортированные файлы (даже не удалённые) отличаются от исходных и непригодны к использованию. Видимо, это связано с неприспособленностью TestDisk к большим exFAT-разделам. Утилита PhotoRec для восстановления файлов, родственная TestDisk, обладает аналогичным недостатком. Поэтому, если восстанавливать удалённые файлы не требуется, то TestDisk можно далее не применять, а воспользоваться штатным средством для монтирования exFAT-раздела из образа:

$ sudo mount -o ro,loop sdcard.img /mnt/disk -t exfat
FUSE exfat 1.0.1
$ ls /mnt/disk/
DCIM Edit_And_Play_With_GoPro_Software.url MISC

Файловая система восстановлена (собственно, она и не ломалась). Файлы с примонтированного образа можно скопировать в обычную файловую систему и проверить. Если файлы в порядке, то остаётся пройти тот же путь для восстановления таблицы разделов на исходной карте:

$ sudo testdisk /dev/sdf1

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

2 комментария:

Чехлатый Алексей комментирует...

А если Backup boot record - тоже Bad как и Boot sector, что делать в этом случае?

Dmitry комментирует...

Не знаю, увы.