Jump to content
Sign in to follow this  
handler

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

Recommended Posts

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

Имеем:

Оптический диск 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 - конец файла.

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

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

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

Share this post


Link to post
Share on other sites

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

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

?

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

Share this post


Link to post
Share on other sites

Алексей писал(а) 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).

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

Алексей писал(а) 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:

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

СD-ROM is NOT in ISO 9660 format

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Воспользовался вызовом 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

Share this post


Link to post
Share on other sites

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

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

Алексей писал(а) 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 в файл. И возвращаемые ошибки не забудьте проверить}

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Алексей писал(а) 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.

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...