|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Sergey Vlasov 2:5020/400 12 Dec 2006 23:21:07 To : Eugene Smirnoff Subject : Re: Считывание образов с CD/DVD-приводов -------------------------------------------------------------------------------- On Mon, 11 Dec 2006 00:53:00 +0300 Eugene Smirnoff wrote: > root@localhost:# dd bs=1 if=/dev/cdrom of=/mnt/common/qnx621.iso > dd: чтение `/dev/cdrom': Input/output error > 248627200+0 записей считано > 248627200+0 записей написано > скопировано 248627200 байт (249 MB), 770,611 секунд, 323 kB/s Это обычное явление для CD, записанных в режиме Track-at-once - при этом размер дорожки в TOC получается на несколько секторов больше, чем размер писавшегося туда образа, но последние сектора оказываются нечитаемыми. При записи в режиме Disk-at-once эта проблема не наблюдается. Кстати, readcd обламывается точно так же, как и dd. Как это обходить совсем правильно - не знаю; если известно, что на диске стандартная ФС iso9660, можно посмотреть размер через isosize -d 2048, после чего прочитать соответствующее число секторов (хоть через readcd, хоть через dd). K3b в этой ситуации просто пробует прочитать конец дорожки, и если это не удаётся, уменьшает её размер: // A data track recorded in TAO mode has two run-out blocks which cannot be read and contain // zero data anyway. The problem is that I do not know of a valid method to determine if a track // was written in TAO (the control nibble does definitely not work, I never saw one which did not // equal 4). // So the solution for now is to simply try to read the last sector of a data track. If this is not // possible we assume it was written in TAO mode and reduce the length by 2 sectors // unsigned char buffer[2048]; int i = 1; for( K3bDevice::Toc::iterator it = d->toc.begin(); it != d->toc.end(); ++it ) { if( (*it).type() == K3bDevice::Track::DATA ) { // we try twice just to be sure if( m_readerDevice->read10( buffer, 2048, (*it).lastSector().lba(), 1 ) || m_readerDevice->read10( buffer, 2048, (*it).lastSector().lba(), 1 ) ) { d->dataSessionProbablyTAORecorded.append(false); kdDebug() << "(K3bCdCopyJob) track " << i << " probably DAO recorded." << endl; } else { d->dataSessionProbablyTAORecorded.append(true); kdDebug() << "(K3bCdCopyJob) track " << i << " probably TAO recorded." << endl; } } ++i; } ... // HACK: if the track is TAO recorded cut the two run-out sectors if( d->dataSessionProbablyTAORecorded.count() > dataTrackIndex && d->dataSessionProbablyTAORecorded[dataTrackIndex] ) d->dataTrackReader->setSectorRange( track->firstSector(), track->lastSector() - 2 ); else d->dataTrackReader->setSectorRange( track->firstSector(), track->lastSector() ); -- Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru --- ifmail v.2.15dev5.3 * Origin: Talk.Mail.Ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/367244ae83d5.html, оценка из 5, голосов 10
|