handler Опубликовано 29 декабря, 2009 Жалоба Поделиться Опубликовано 29 декабря, 2009 Здравствуйте! Имеем: Оптический диск 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 Опубликовано 29 декабря, 2009 Жалоба Поделиться Опубликовано 29 декабря, 2009 mount /tmp/cd.iso /mnt -o loop ? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Legalizer Опубликовано 30 декабря, 2009 Жалоба Поделиться Опубликовано 30 декабря, 2009 Ineu писал(а) Wed, 30 December 2009 01:07 mount /tmp/cd.iso /mnt -o loop ? Это вряд ли. Образ-то заведомо битый у нас получился после использования dd... Впрочем, других идей нет Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Ineu Опубликовано 30 декабря, 2009 Жалоба Поделиться Опубликовано 30 декабря, 2009 Каких только образов мы не монтировали... ) Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
gogi Опубликовано 30 декабря, 2009 Жалоба Поделиться Опубликовано 30 декабря, 2009 Алексей писал(а) 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). И только, если это не принесет результатов, стоит искать специализированные утилиты восстановления, изучать внутренности ФС и т.д. Да и то лучше обратиться к профессионалам. Правда говорят, что они много просят за восстановление данных. В общем возни хватит для того, чтобы и ночью помнить о бэкапе. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
handler Опубликовано 30 декабря, 2009 Автор Жалоба Поделиться Опубликовано 30 декабря, 2009 По поводу монтирования: Вам уже сказали, что все попытки безуспешны, или Вы полагаете, что я, читая спецификации различных ФС, как сказку про колобка, не в состоянии прикрутить образ? По поводу системы: в описании темы предельно ясно указано, на какой платформе и какими инструментами записан носитель, или Вы можете определить тип ФС по номеру версии Windows и номеру сервис пака? Тогда удивите нас: WindowsXP SP2 И контрольный в голову всем мудрым советчикам howto и backup: Трактуйте название темы буквально - нас не интересует не причина, а пути решения проблем. Спасибо за сотрудничество, Всех с Новым Годом! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Ineu Опубликовано 30 декабря, 2009 Жалоба Поделиться Опубликовано 30 декабря, 2009 Да Вы хам! Люди тратят своё время на участие в этой теме, а Вы позволяете себе язвить. Алексей писал(а) Wed, 30 December 2009 17:29 По поводу монтирования: Вам уже сказали, что все попытки безуспешны, или Вы полагаете, что я, читая спецификации различных ФС, как сказку про колобка, не в состоянии прикрутить образ? Я считаю, что Вы тролль и да - не в состоянии. Попросту по той причине, что Вы не написали, что пытались это сделать. Ткните пальцем, где у Вас написано "пытался смонтировать полученный через ddrescue образ". Я что-то не вижу, где это "нам уже сказали". Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
gogi Опубликовано 30 декабря, 2009 Жалоба Поделиться Опубликовано 30 декабря, 2009 Алексей писал(а) 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: Трактуйте название темы буквально - нас не интересует не причина, а пути решения проблем. У Вас проблемы с логикой. Именно самые прямые пути решения проблемы Вам и подсказывают. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
handler Опубликовано 1 января, 2010 Автор Жалоба Поделиться Опубликовано 1 января, 2010 Вот за это спасибо - насчет формата создаваемых Windows дисков. Однако, команда: dd if=/dev/cdrom of=/mnt/cd.iso conv=sync,noerror которую мне подсказали, создала файл на диске, размером с образ диска, пустой, содержащий в начале: СD-ROM is NOT in ISO 9660 format Правда, есть сомнения в компетентности данной программы. Возможно, что не iso, но и не факт, что udf, возможно, есть еще альтернатива? Проблема также и в том, что я не могу повторно получить снимок диска ни командами dd, ни ddrescue - первый экземпляр затерся самодельным парсером Насчет невысказанных попыток монтирования я надеялся на Вашу догадливость: что бы Вы стали делать, (я бы даже сказал, что Вам еще остается делать) сняв образ с диска - выбор действий и инструментов небогат. В общем, пока что нам не удается извлечь данные с диска даже в испорченном виде - мне это начинает нравится Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
handler Опубликовано 4 января, 2010 Автор Жалоба Поделиться Опубликовано 4 января, 2010 Пришлось прибегнуть к программированию. Воспользовался вызовом 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 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
gogi Опубликовано 5 января, 2010 Жалоба Поделиться Опубликовано 5 января, 2010 Предвидя возможную реакцию, не стану критиковать Ваш чудной велосипедостроительный способ восстановления данных с диска. Перейду к тому, что остается, а остается разгадать новогоднюю загадку... Алексей писал(а) 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 в файл. И возвращаемые ошибки не забудьте проверить} И еще. Не забудьте необходимые заголовочные файлы добавить. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
handler Опубликовано 5 января, 2010 Автор Жалоба Поделиться Опубликовано 5 января, 2010 В исходниках сказано: 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 Может, я что-то напутал в адресации секторов? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
gogi Опубликовано 5 января, 2010 Жалоба Поделиться Опубликовано 5 января, 2010 Алексей писал(а) 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. Ваши игры с программированием подобны занятию человека, который, увидев белый экран телевизора, вместо того, чтобы воткнуть на место антенну, полез внутрь, при этом об электронике зная только то, что она поддается воздействию паяльника. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
handler Опубликовано 6 января, 2010 Автор Жалоба Поделиться Опубликовано 6 января, 2010 Во втором цикле опечатка - начиная с 2 ( это написано в исходниках ) В спецификации удф написано, что указатель на файловый дескриптор находится в секторе 256. Чтение 0:5:31 (5*75+31-150 = 256) ioctl(fd , CDROMREADMODE1 , &arg) возвращает -1. Думаю, стоит сначала переместить указатель при помощи CDROMSEEK(...) Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.