Перейти к содержанию

Восстановление данных с оптических дисков


Рекомендуемые сообщения

Здравствуйте!

Имеем:

Оптический диск CD-RW c pdf-файлами на нем.

Данный диск был заполнен файлами следующим образом:

Под управлением ОС Windows файлы копировались на CD-RW диск при помощи <Ctrl+C> <Ctrl+V> или Drag'n'Drop (как на флешку).

На определенном этапе диск перестал читаться.

Задача: извлечь содержимое диска.

Попытка решить задачу:

Для этого нужно ответить на три вопроса:

1. Предполагаемый формат ФС (iso-9660, UDF, CDFS) и его спецификация

2. Спецификация PDF-файлов

3. Не помню

Восстановление проводится под управлением ОС Линукс.

Для этой цели был установлен пакет ddrescue (45Kb.), т. к. dd отказался его читать:

dd if=/dev/cdrom /tmp/cd.iso

bla - bla - bla

I/O error

Про остальные инструменты можно не упоминать.

Что касается первого вопроса, то предполагается, что это iso-9660, однако спецификации данной ФС я не нашел, разве только "Вика" сказала, что первые 32 КБ не используются, а о дальнейшей структуре написано пространно - мол, есть там такие-то структуры, насчет смещений и размеров молчок.

Данная информация нам понадобится в том случае, если подручными инструментами прочесть не получится. Тогда берем в руки ассемблер, грузимся в ДОС, и счастливые 90-е снова оживают.

ddrescue /dev/cdrom /tmp/cd.iso

Носитель прочитала (ушло более суток, подумал, зависла, сделал <Ctrl+C>. Размер файла вышел 600 Мб из 736 Мб).

Созданный файл просмотрел в текстовом режиме - присутствуют структуры каталогов с искомыми файлами.

Выдвинуто предложение написать парсер на С++ , который будет искать сигнатуры pdf-файлов и копировать их оттуда (файлы).

Вот тут нам и нужен ответ на второй вопрос - толковой спецификации тоже не нашел, кроме, разве, сигнатур: %PDF - начало файла, %EOF - конец файла.

В принципе, этого достаточно, но нам нужна гарантия того, что файлы на носителе не фрагментированы (спецификация ФС оптических дисков вроде гарантирует это).

Другие инструменты мне под руку не попадались.

Возможно, Вы посоветуете мне, какие пути решения этой задачи Вам известны?

Ссылка на комментарий
Поделиться на другие сайты

Ineu писал(а) Wed, 30 December 2009 01:07

mount /tmp/cd.iso /mnt -o loop

?

Это вряд ли. Образ-то заведомо битый у нас получился после использования dd... Впрочем, других идей нет Smile

Ссылка на комментарий
Поделиться на другие сайты

Алексей писал(а) Tue, 29 December 2009 23:57

dd if=/dev/cdrom /tmp/cd.iso

Опечатка ?

dd if=/dev/cdrom of=/tmp/cd.iso

Цитата:

Что касается первого вопроса, то предполагается, что это iso-9660,

Компьетер, на котором производилась запись затонул или уничтожен перед приходом налоговой полиции? )))

В таком случае осталось в памяти, какая система там была установлена и есть возможность узнать используемую ФС.

Установите, если понадобится, поддерку требуемой ФС и монтируйте файл, как Вам советовали ( -t ФС -o loop,ro).

И только, если это не принесет результатов, стоит искать специализированные утилиты восстановления, изучать внутренности ФС и т.д. Да и то лучше обратиться к профессионалам. Правда говорят, что они много просят за восстановление данных.

В общем возни хватит для того, чтобы и ночью помнить о бэкапе.

Ссылка на комментарий
Поделиться на другие сайты

По поводу монтирования: Вам уже сказали, что все попытки безуспешны, или Вы полагаете, что я, читая спецификации различных ФС, как сказку про колобка, не в состоянии прикрутить образ?

По поводу системы: в описании темы предельно ясно указано, на какой платформе и какими инструментами записан носитель, или Вы можете определить тип ФС по номеру версии Windows и номеру сервис пака? Тогда удивите нас: WindowsXP SP2

И контрольный в голову всем мудрым советчикам howto и backup:

Трактуйте название темы буквально - нас не интересует не причина, а пути решения проблем.

Спасибо за сотрудничество, Всех с Новым Годом! Very Happy

Ссылка на комментарий
Поделиться на другие сайты

Да Вы хам! Люди тратят своё время на участие в этой теме, а Вы позволяете себе язвить.

Алексей писал(а) Wed, 30 December 2009 17:29

По поводу монтирования: Вам уже сказали, что все попытки безуспешны, или Вы полагаете, что я, читая спецификации различных ФС, как сказку про колобка, не в состоянии прикрутить образ?

Я считаю, что Вы тролль и да - не в состоянии. Попросту по той причине, что Вы не написали, что пытались это сделать. Ткните пальцем, где у Вас написано "пытался смонтировать полученный через ddrescue образ". Я что-то не вижу, где это "нам уже сказали".

Ссылка на комментарий
Поделиться на другие сайты

Алексей писал(а) Wed, 30 December 2009 18:29

По поводу монтирования: Вам уже сказали, что все попытки безуспешны, или Вы полагаете, что я, читая спецификации различных ФС, как сказку про колобка, не в состоянии прикрутить образ?

Наверное, не то читаете, если так и не смогли примонтировать.

Цитата:

По поводу системы: в описании темы предельно ясно указано, на какой платформе и какими инструментами записан носитель, или Вы можете определить тип ФС по номеру версии Windows и номеру сервис пака? Тогда удивите нас: WindowsXP SP2

Похоже, Вы взялись за задачу в процессе "провода" старого года.

Упомянуто было только о windows, даже без указания версии. Даже я, не часто общаясь с вендой, знаю, что для записи дисков используются различные программы (некоторые из них могут и копипастить). Самый простой способ узнать ФС, естественно, посмотреть какой программой и с какими установками диск записан.

Если Вы продолжаете настаивать, что это сделано встроенными средствами венды, то microsoft.com говорит:

Windows XP Professional provides integrated support for writing data to CD-R and CD-RW. When writing data to CD, Windows XP Professional automatically uses the Joliet and ISO 9660 formats

Цитата:

И контрольный в голову всем мудрым советчикам howto и backup:

Трактуйте название темы буквально - нас не интересует не причина, а пути решения проблем.

У Вас проблемы с логикой. Именно самые прямые пути решения проблемы Вам и подсказывают.

Ссылка на комментарий
Поделиться на другие сайты

Вот за это спасибо - насчет формата создаваемых Windows дисков.

Однако, команда:

dd if=/dev/cdrom of=/mnt/cd.iso conv=sync,noerror

которую мне подсказали, создала файл на диске, размером с образ диска, пустой, содержащий в начале:

СD-ROM is NOT in ISO 9660 format

Правда, есть сомнения в компетентности данной программы.

Возможно, что не iso, но и не факт, что udf, возможно, есть еще альтернатива?

Проблема также и в том, что я не могу повторно получить снимок диска ни командами

dd, ни ddrescue - первый экземпляр затерся самодельным парсером

Насчет невысказанных попыток монтирования я надеялся на Вашу догадливость: что бы Вы стали делать, (я бы даже сказал, что Вам еще остается делать) сняв образ с диска - выбор действий и инструментов небогат.

В общем, пока что нам не удается извлечь данные с диска даже в испорченном виде - мне это начинает нравится

Ссылка на комментарий
Поделиться на другие сайты

Пришлось прибегнуть к программированию.

Воспользовался вызовом ioctl:

В исходниках вот это:

CDROMREADRAW read data in raw mode (2352 Bytes)

(struct cdrom_read)

usage:

union {

struct cdrom_msf msf; /* input */

char buffer[CD_FRAMESIZE_RAW]; /* return */

} arg;

ioctl(fd, CDROMREADRAW, &arg);

inputs:

cdrom_msf structure indicating an address to read.

Only the start values are significant.

outputs:

Data written to address provided by user.

error return:

EINVAL address less than 0, or msf less than 0:2:0

ENOMEM out of memory

notes:

As of 2.6.8.1, comments in <linux/cdrom.h> indicate that this

ioctl accepts a cdrom_read structure, but actual source code

reads a cdrom_msf structure and writes a buffer of data to

the same address.

MSF values are converted to LBA values via this formula:

lba = (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;

Остается загадкой способ инициализации msf-cтруктуры для последовательного считывания секторов диска.

К стати, формат - UDF

Ссылка на комментарий
Поделиться на другие сайты

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

Перейду к тому, что остается, а остается разгадать новогоднюю загадку...

Алексей писал(а) Mon, 04 January 2010 23:39

Остается загадкой способ инициализации msf-cтруктуры для последовательного считывания секторов диска.

Напишите, например, функцию обратного преобразования lba в msf. И вызывайте ее перед вызовом ioctl.

int getmsf (int lba, struct cdrom_msf *msf){  int f= lba + CD_MSF_OFFSET;  msf->cdmsf_min0= f / (CD_SECS * CD_FRAMES);  int s= f % (CD_SECS * CD_FRAMES);  msf->cdmsf_sec0= s / CD_FRAMES;  msf->cdmsf_frame0= s % CD_FRAMES;}//  В основной программеunion {   struct cdrom_msf msf;               /* input */   char buffer[CD_FRAMESIZE_RAW];      /* return */} arg;int i;for (i=0; i < CD_MINS * CD_SECS * CD_FRAMES; i++) {  getmsf (i, (struct cdrom_msf*)&arg);  // теперь вызывайте ioctl() и записывайте содержимое arg в файл. И возвращаемые ошибки не забудьте проверить}

И еще. Не забудьте необходимые заголовочные файлы добавить.

Ссылка на комментарий
Поделиться на другие сайты

В исходниках сказано:

lba : 0 - 40xxx

msf : 0:2:0 - 89:59:74

превод lba -> msf

( ( ( m * 60) + s ) * 75 + f )- 150

написал три вложенных цикла:

for ( m = 0; m <= 89 : m++ ) {

for ( s = 0 ; s <= 59 ; s++ ) {

for ( f = 0 ; f <= 47 ; f++ ) {

arg.msf.cdmf_min0 = m;

arg.msf.cdmf_sec0 = s;

arg.msf.cdmf_frame0 = f;

ret = ioctl( fd , CDROMREADMODE1 , &arg );

} } }

Только вот возвращает удачных 2-3 чтения из 10

Может, я что-то напутал в адресации секторов?

Ссылка на комментарий
Поделиться на другие сайты

Алексей писал(а) Tue, 05 January 2010 21:53

В исходниках сказано:

lba : 0 - 40xxx

msf : 0:2:0 - 89:59:74

превод lba -> msf

( ( ( m * 60) + s ) * 75 + f )- 150

Как раз наоборот. По этой формуле msf -> lba.

Цитата:

написал три вложенных цикла:

for ( m = 0; m <= 89 : m++ ) {

for ( s = 0 ; s <= 59 ; s++ ) {

for ( f = 0 ; f <= 47 ; f++ ) {

arg.msf.cdmf_min0 = m;

arg.msf.cdmf_sec0 = s;

arg.msf.cdmf_frame0 = f;

ret = ioctl( fd , CDROMREADMODE1 , &arg );

} } }

Только вот возвращает удачных 2-3 чтения из 10

Может, я что-то напутал в адресации секторов?

Елси не захотели пользоваться готовой функцией, то исправляйте свои ошибки. Их, как минимум, две.

1. В последнем цикле f < 75 (то же самое f <= 74)

2. Не учли, что в первом блоке (минута 0) счет секторов начинаетя с 2, а не с 0.

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

Ссылка на комментарий
Поделиться на другие сайты

Во втором цикле опечатка - начиная с 2 ( это написано в исходниках )

В спецификации удф написано, что указатель на файловый дескриптор находится в секторе 256.

Чтение 0:5:31 (5*75+31-150 = 256) ioctl(fd , CDROMREADMODE1 , &arg) возвращает -1.

Думаю, стоит сначала переместить указатель при помощи CDROMSEEK(...)

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...