LINUCA
LINUCA - Asociación de Usuarios GNU/Linux en Cantabria
CONTENIDOS
. La Asociación
. ¡ Apúntate a socio !
. Fotos
. Los más leídos
. Autores [Actividad]
. Últimos Comentarios
. ¡Todos los titulares!
. Guía de Estilo
. Cómo publicar en Linuca
. Links cortos
. Lista de Correo
   [Mensajes antiguos]
   [Etiqueta en la Lista]
. Todas las Listas
. ¿Sugerencias?
. ¡Sindícanos!
Gràcies Bulma!
Esta página usa el código fuente de Bulma :-)
Busquedas

Ultimos kernels
(17/09/2014 07:46:43)
Debian
Última actualización
stable: 12/07/2014
testing: 17/09/2014
unstable: 17/09/2014
Patas-arriba de la grabación de CD's (19815 lecturas)
Por Miguel Telleria
Snapy (http://www.mtelleria.com)
Creado el 28/10/2005 17:24 modificado el 28/10/2005 17:24

Mi tostadora empieza a dar sus últimos suspiros. A la hora de grabar con cdrecord en modo TAO se atasca en el momento de la fijación. Esto me ha forzado a explorar la grabación en modo SAO y a base de leer estándares, mirar código y capturar comandos SCSI he recompilado mucha información que quiero compartir con vosotros.

Este artículo pretende desmitificar algunos aspectos de la grabación de CD's como son la multisesión, los tipos de pistas y el modo SAO. La teoría se completa con ejemplos de comandos cdrecord, mkisofs y compañía.

Pagina1/1

Patas-arriba de la grabación de CD's

Índice General

1 Introducción

Ya sea por algunos prejuicios como lo que pone en el CD Write howto o por el hecho de que cdrdao tuviera problemas de licencias en Debian durante algún tiempo, el caso es que muchos (o al menos yo) hemos estado utilizando la opción por defecto de cdrecord de grabar datos siempre en modo TAO (Track At Once) y cerrando la opción a multisesión.

Los artículos de la gente no suelen mostrar otras opciones de grabar los CDs y una vez que se miran las cosas por dentro, se pueden descubrir aspectos interesantes como la multisesión y el modo SAO.

1.1 Licencia y advertencia

Este artículo está bajo licencia GNU FDL . Podéis bajaros el fichero fuente LATEX aquí .

Todo lo que pongo aquí es el resultado de muchas observaciones recogidas en un corto periodo de tiempo. Al no ser yo una autoridad en la materia es posible que haya comprendido alguna cosa de forma errónea. Vamos que aunque el artículo es largo no es la biblia y cualquier comentario o corrección serán bienvenidos.

2 Primero un poco de teoría

2.1 Estructura de un CD (CD-ROM, CD-Audio, CD-extra...)

Esto es un resumen de la sección 2 de CD recordable FAQ , así como otras referencias de [FUJI,MMC4,YELLOW]. Podéis contrastar esta información con los comandos de la sección 3.2

2.1.1 Sesiones, pistas y sectores

Globalmente un CD se divide en sesiones que corresponden a diferentes momentos de grabación. Internamente cada sesión se compone de 1:

Lead-in
Agrupa lo que se llama la pista 00 y contiene la tabla de contenidos (TOC) donde se indican los contenidos del area de programa y la existencia o no de una siguiente sesión (ver 2.1.3).

Area de programa
Aquí está el contenido de usuario propiamente dicho divido en pistas (tracks en inglés). Normalmente 2 tenemos o bien todo pistas de audio cada una conteniendo una canción o bien una única pista de datos conteniendo un sistema de ficheros ISO9660 o UDF.

Lead-out
Agrupa lo que se llama la pista AA y no contiene información en sí. Está pensada para que el laser tenga una cierta tolerancia para apagarse y reposicionarse.

La unidad de direccionamiento en los CDs es el sector que corresponde a 1/75avo de segundo de audio (98*6 muestras a 44100 Hz).

Existen 2 formas de numerar los sectores:

MSF
Nos basamos en la representación temporal MM:SS.FF donde MM:SS son los minutos y segundos mientras que FF es el número de sector 3. Así el último sector direccionable tiene la dirección 99:59.74.

LBA
Los numeramos como en los discos duros de manera consecutiva.

La numeración LBA empieza en el área de programa de la primera sesión mientras que la numeración MSF empieza 2 segundos antes del area de programa, es decir en el sector -150. En esta posición empieza un pre-gap fijo que todos los CDs tienen al principio de cada sesión. En ambos casos el Lead-In tendrá siempre una dirección negativa.

Teniendo en cuenta que el audio está muestreado en stereo a 16 bits (16 bit x 2 por muestra) esto hace que un sector corresponda a 2352 bytes de información principal. Para pistas que no son de audio, 2352 bytes es el tamaño ``bruto''. Dependiendo del tipo de pista de datos se reservarán más o menos bytes para sincronismo y protección de errores, por lo que el tamaño ``neto'' de un sector de datos será ligeramente inferior (normalmente 2048 bytes).

Además de la información principal que representa el audio o los datos del usuario, cada sector contiene 96 bytes de subcódigos o subcanales P,Q,R,S,T,U,V,W que llevan meta-información. Los 96 bytes están equitativamente repartidos en cada subcanal haciendo 12 bytes cada uno. A lo largo del CD los subcanales ocupan unos 500 Kb cada uno.

Los subcanales tienen 2 funciones principales:

  • En el lead-in el canal Q guarda el TOC repitiéndolo a lo largo de los 60 segundos que suele durar esta zona.

  • En el area de programa de los CDs de audio llevan metainformación como el valor del reloj, si se trata de un Gap y hasta posibles extensiones como el texto de un karaoke (CD-TEXT) o la imagen de la portada (CD-G).

A diferencia de la información principal, los subcanales no llevan ninguna protección contra errores, por lo que la única forma de garantizar una buena protección es repetir su contenido continuamente.

Para completar, comentar que antes de la primera sesión existe la zona Power Calibratin Area (PCA) de sólo lectura con metainformación sobre el disco y la potencia que el laser debe usar. Después viene la Program Management Area (PMA) utilizada por la grabadora para almacenar ciertos datos temporales necesarios en el proceso de grabación.

2.1.2 Tipos de pistas

Centrándonos en las pistas existen varios tipos dependiendo de como estén organizados los bytes de los sectores:

Tipo de pista Datos / sector comentario parametro cdrecord
CD-DA 2352 CD de audio Todos los bytes de datos se dedican integramente a muestras de audio sin otra protección extra de la que ya trae de por sí la información de usuario. Este es el tipo de pista de los CD's audio definidos en el clásico [RED] y cuya vigencia se mantiene hasta ahora 4.

-audio
CDROM 1 Mode 1 2048 Se reservan 304 bytes para una protección de errores adicional. Este es el CD-ROM de datos clásico definido en el [YELLOW] La gran mayoría de los CD-ROMs son de este tipo -data
CDROM 1 Mode 2 2336 También conocido como CDROM Mode 2 Formless, una variante del CD-ROM clásico definida en el mismo [YELLOW] pensada para datos tolerantes a errores ocasionales (audio y video). Nunca cuajó. Su funcionalidad fue reemplazada por los CD-ROM XA. -mode2
CDROM XA Mode 2 2048 (Form1)

2324 (Form2)

El standard [CDROMXA] redefine el formato de los sectores del CDROM 1 Mode 2 para que puedan coexistir en una misma pista sectores de datos fuertemente protegidos (Form1) con sectores de datos de audio y vídeo debilmente protegidos (Form2).

Su aplicación inicial era la grabación de datos y video en el video CD (VCD) [WHITE]. Pero también se ha hecho popular al ser el tipo de pista por defecto elegida por algunos programas de grabación cuando se crean CD's multisesión (2.1.4).

-xa (Form1) 5

-xa2 (Form2)

Además de esto están las pistas CD-I [GREENBOOK], con programas binarios para ser ejecutados en lectores especiales equipados con un procesador 68000. Es muy raro actualmente encontrar este tipo de CD's.


2.1.3 Multisesión, fijación/finalización CDs abiertos/cerrados

Finalmente, después de 15 años de uso de CD's, en 1995 salió el standard de la multisesión [MULTI]. El principio es muy simple: En el momento de grabar la sesión, si se quiere dejar el CD abierto, hay que incluir en el TOC de la sesión actual una entrada especial 6 que apunte a un sector de la sesión siguiente.

Por lo tanto en CD's abiertos, la última sesión tiene dicha entrada y apunta a una dirección del disco que está sin quemar, mientras que en los cerrados la última sesión no tiene esa entrada o la tiene apuntando al valor FF:FF.FF.

Siguiendo con la retórica, la diferencia entre fijar y finalizar una sesión es simplemente el incluir una entrada en el TOC o no. Como el TOC se repite continuamente en todo el Lead-In, la cantidad de datos que se escribe en ambas operaciones es la misma.

El hecho de que haya entradas que apuntan a direcciones sin quemar ofende a algunos lectores antiguos o puristas 7, pero en la práctica, la mayoría de los lectores modernos detectan el tipo especial de entrada del TOC y saben a qué atenerse.

Dado que la grabación de CD's es un proceso de una única pasada, una vez grabada la sesión no se puede cambiar el hecho de que esté abierta o no, ya que ello implicaría el modificar la parte Lead-In de la última sesión grabada. Por lo tanto no se puede añadir información a CD's ya cerrados aunque quede mucha área por quemar.

Cuando se añade una sesión, aunque sea una sesión de 0 pistas de contenido, se consumen al menos 2 minutos de espacio (4500 sectores, 18 MBytes en espacio de datos CD ROM 1 modo 1). Este espacio corresponde a las zonas lead-in y lead-out que tienen que tener al menos 1 minuto de duración cada una cuando están entre sesiones.


2.1.4 Multisesión y pistas en CD-ROM XA Form1

Alguna gente, como por ejemplo el autor del módulo isofs.c del kernel linux, creen que, de acuerdo a los standares, un CD-ROM multisesión debe tener las pistas de datos en CD-ROM Mode 2 XA (en vez del clásico CD-ROM 1 Mode 1).

Sea como fuere es un hecho que diferentes programas de grabación generan por defecto los 2 tipos de pista por lo que ambas pistas están perfectamente admitidas por todos los sistemas operativos populares. Sin embargo si que puede haber problemas si se mezclan los 2 tipos en un mismo CD.

2.1.5 Combinaciones posibles

Con la llegada de la multisesión ya no se hace otra cosa que:

  • o bien un CD con una primera sesión compuesta únicamente por pistas de audio (CD-DA) y una o varias posibles sesiones con una única pista de datos cada una (CD-ROM Modo 1 o CD-ROM XA). Cuando existen estas sesiones de datos añadidas, al CD se le denomina CD extra

  • o bien CD con una o varias sesiónes de datos cada una con una única pista CD-ROM Mode 1 o CD-ROM XA.

2.2 Grabadoras

Ahora que sabemos como se organizan los datos en el CD, es importante ver como se acceden a ellos con los lectores y grabadoras.

Aunque se puede utilizar el modo de acceso Raw (bruto), normalmente utilizaremos los modos TAO y SAO dejando a la grabadora la tarea de generar los lead-in's y lead-out a partir de nuestros datos.

2.2.1 Comandos MMC y bibliografía

En general las grabadoras siguen unos comandos estandar que se llaman MMC (MultiMedia Command set). Pertenecen a la familia de comandos SCSI y están por lo tanto regularizados por el comité T10 . Los estandares oficiales son de pago, pero las últimas versiones de los borradores se pueden descargar gratuitamente .

Os recomiendo el draft [MMC4], que aunque no es la última norma (ahora ya se está discutiendo el MMC5), tiene el fichero PDF completo y contiene información más que suficiente sobre los CD's.

El libro [FUJI] lista también los comandos y tiene además secciones interesantes sobre como se encapsulan estos comandos en conexiones no-SCSI como ATAPI, USB o Firewire.

Y finalmente, otra fuente de conocimiento son las opciones -V y -VV de cdrecord que muestran en pantalla los comandos mandados y datos recibidos. Con -VV también vemos el principio del buffer de datos que nosotros enviamos a la grabadora.

2.2.2 Modo de grabación TAO

TAO (Track At Once) es la forma más comun de grabar CDs de datos y de audio y es la que utilizan casi todos los programas por defecto.

Se le manda a la grabadora las pistas del área de programa una por una y es la propio grabadora la que lleva la cuenta de cuando empiezan. Después se le pide que cierre la sesión y entonces la grabadora generará ella solita el Lead-In y el Lead-Out.

En este modo la grabadora inserta un pre-gap fijo entre pistas que por defecto es de 2 segundos (150 sectores).

El programa de software no necesita recordar ninguna posición de las pistas ni siquiera donde empezar a escribir ya que esa información también se le pedirá a la grabadora (ver más abajo).

Sin embargo este modo tiene 2 problemas:

  • Los silencios entre pistas deben de ser como mínimo de 2 segundos 8. Esto puede ser molesto para ciertas grabaciones de audio en directo.

  • Después de grabar las pistas, el laser se tiene que reposicionar al principio para grabar el lead-in. Esta es la parte más delicada de la operación y es lo primero que falla cuando la grabadora empieza a envejecer :).

Para entender bien el procedimiento, merece la pena explorar la secuencia de comandos MMC que cdrecord envía a la grabadora y las respuestas de esta. A continuación listo los comandos importantes que he encontrado en mis observaciones (entre paréntesis los códigos de cada comando según [MMC4]):9:

  1. MODE_SELECT_10(55): Se indica modo TAO, el tipo de pistas, tiempo de gap, si es multisesión ([MMC4], pag 470)...

  2. Para cada pista:
    1. MODE_SELECT_10(55) para poner el ISRC y otros parámetros propios de la pista manteniendo los parámetros globales especificados al principio de la grabación.

    2. READ_TRACK_INFO(52) preguntando por la ``pista invisible'' (número FF). De aquí se obtiene el sector de comienzo de la siguiente pista en el área de programa. Esta dirección de comienzo ya tiene en cuenta el espacio del lead-in y los gaps entre pistas.

    3. Una serie de WRITE_10(2A) donde se manda la información en bloques de 64 Kb. En cada comando se especifica el sector de escritura y la cantidad de sectores.

    4. De vez en cuando un READ_BUFFER_CAPACITY(5C) para monotorizar el estado del buffer.

    5. Un SYNCHRONISE_CACHE(35) para asegurarse que todos los datos se han grabado y dar por finalizada la pista.

  3. CLOSE_TRACK/SESSION (5B): Se le pide a la grabadora que haga la finalización. El único parámetro que se le pasa en el CDB es close functin a 10b (sesión actual) ([MMC4] pag 218, [FUJI], pag 388).

    Supongo que la grabadora habrá ido anotando el comienzo de cada pista cada vez que se le lanza un SYNCHRONISE_CACHE y que con esa información (quizás guardada en el PMA??), junto con los parámetros enviados en el primer MODE_SELECT construye el TOC.

2.2.3 Modo de grabación SAO

En SAO (Session At Once) se empieza pasando a la grabadora el TOC codificado en lo que se denomina la CUE sheet. Aquí indicamos exactamente donde van a comenzar las pistas dentro del flujo que vamos a enviar después. Con esta información y los parametros que se le dan al principio de la grabación, la grabadora comienza a grabar el Lead-In.

A continuación se envían todas las pistas del area de programa de una sola vez. Para terminar se pide que termine de escribir los datos pendientes y la grabadora grabará el leadout.

Evidentemente el CUE-sheet tiene que corresponder exactamente a los datos del área de programa que se envían. Los programas de grabación permiten generarla a partir de las pistas que se le indican o tomarla como un parámetro más de entrada.

Fisicamente el disco se graba de continuo sin apagar ni reposicionar el laser. En cuanto a los silencios, si se quieren tener, se tienen que fabricar en la imagen que se manda.

Este método es el único que garantiza la obtención de 2 CD's idénticos en cuanto a la posicion de sus pistas 10 y por lo tanto es el único que se utiliza en producciones industriales.

De nuevo podemos capturar los comandos MMC que se envían.

  1. MODE_SELECT_10(55): Se indica modo SAO, el tipo de pistas, y si es o no multisesión [MMC4], pag 470)

  2. SEND_CUE_SHEET(5D): Se le pasa a la grabadora el TOC referente al área de programa que se va a enviar después.

  3. MODE_SELECT_10(55) para poner el ISRC y otros parámetros que se aplicarán a todas las pistas.

  4. READ_TRACK_INFO(52) preguntando por la ``pista invisible'' (número FF). De aquí se obtiene el sector de comienzo del área de programa actual.

  5. Una serie de WRITE_10(2A) donde se manda la información en bloques de 64 Kb a lo largo de toda la sesión

  6. De vez en cuando un READ_BUFFER_CAPACITY(5C) para monotorizar el estado del buffer.

  7. Un SYNCHRONISE_CACHE(35) para asegurarse que todos los datos se han grabado con lo que la grabadora genera el lead-out.

2.2.4 ¿Qué es eso del DAO (Disk At Once)?

Académicamente hablando DAO significa grabar la sesión de manera continua sin dejar la sesión abierta mientras que con SAO el tema de cerrar el disco o no es indiferente.

Cuando se introdujo la multisesión (en 1995 [MULTI]), la industria del CD ya llevaba un largo camino y los únicos términos acuñados, TAO y DAO, servían para diferenciar si se grababan las pistas una por una o todas a la vez. Puesto que no había concepto de multisesión, el grabar todas las pistas de golpe equivalía a grabar el CD entero, de ahí DAO era (Disk AT Once).

Al poco, la gente se dio cuenta de que el término DAO se prestaba a confusión, ya que el hecho de grabar las pistas de audio de una sesión de una sola vez, no significa necesariamente que el CD estuviera terminado (ej los CD extra 3.4).

Para evitar malentendidos, se empezó a utilizar el termino SAO (Session At Once) como contraposición a TAO y el termino DAO se quedó para especificar CD's SAO cerrados (como suele seguir siendo el caso de la principal aplicación industrial de SAO, los CD's comerciales).

En este artículo he tomado la decisión de utilizar siempre el término SAO ya que todos los ejemplos conciernen CDs abiertos.

A notar también que se pueden hacer perfectamente CD's TAO cerrados pero que al no dar las pistas seguidas no se les puede llamar DAO's. Que yo sepa no existe ningún termino para indicar que una grabación TAO esté cerrada o no.

2.2.5 Otros modos de escritura

Para completar, decir que existen otros 2 modos de escritura:

Raw
Este es el método manual en el que la grabadora no nos ayuda nada. El lead-in, lead-out e incluso los subcanales son generados por la aplicación y mandados directamente a la grabadora.

Paquete
El modo paquete está pensado para poder escribir un CD incrementalmente en pequeños trozos de grabación pero sin generar cada vez la pérdida de 2 minutos como pasa con la multisesión.

En este modo se suele utilizar el sistema de ficheros UDF optimizado para poder añadir elementos sin consumir mucho espacio extra.

Todos estos temas quedan fuera del alcance de este artículo.

2.2.6 Combinaciones posibles

El comando cdrecord -prcap mostrará las capacidades que la grabadora anuncia tener, como tipos de CD's y DVD's que admite, modos de grabación, tipos de pista, velocidades...

Sin embargo esto no significa que cualquier combinación sea posible. Las mayores limitaciones suelen venir con el modo SAO. Hay firmwares que con la idea inicial de SAO=DAO se niegan a grabar sesiones abiertas en este modo. También es un caso frecuente el que no admitan grabar pistas CD-ROM XA en modo SAO.

Cuando se intenta una combinación imposible o no soportada, la grabadora da una respuesta de error con una Sense Key 0x5 y un Sense Code de 0x24, 0x25 o 0x26. Por ejemplo:

   cdrecord: Success. send_cue_sheet: scsi sendcmd: no error
   CDB:  5D 00 00 00 00 00 00 00 20 00
   status: 0x2 (CHECK CONDITION)
   Sense Bytes: 70 00 05 00 00 00 00 0E 00 00 00 00 26 00 00 00
   Sense Key: 0x5 Illegal Request, Segment 0
   Sense Code: 0x26 Qual 0x00 (invalid field in parameter list) Fru 0x0
   Sense flags: Blk 0 (not valid)
   resid: 32

Normalmente estas situaciones se detectan antes de que se haya escrito ningún dato (comando WRITE_10(2A)) por lo que el CD-R no suele quedar afectado.


2.3 Imagenes ISO9660

Hasta ahora hemos hablado de la estructura de sesiones y pistas en los CD's, y como se trasmiten los datos. Sin embargo no hemos hablado aún de como dichos datos están organizados.

Los datos que pongamos en principio es cosa nuestra, nada nos impide poner un sistema de ficheros ext2 o incluso fat, pero si queremos hacer las cosas como la gente corriente utilizaremos el sistema iso9660 la mayoría de las veces.

Al ser de sólo lectura, la estructura interna de iso9660 es muy sencilla. Los ficheros se ponen uno tras otro alineados con el comienzo y fin de los bloques típicamente de 2048 bytes (lo mismo que el tamaño del sector de la pista).

Al principio de la imagen 11se encuentra el PVD: Primary Volume Descriptor con información global del sistema de archivos: tamaño y número de bloques, etiqueta, presencia o no de extensiones Joliet, RockRidge...

Nota: A partir de aquí utilizaré el término sector para referirme a bloque de datos.

Luego llega la path list con la lista de directorios y ficheros. Para cada fichero se indica el número de sector en el que está.

Y poco más que decir salvo dos cosas.

2.3.1 ISO9660 y multisesión

Los punteros de número de sector que aparecen en el path list se interpretan siempre como valores absolutos dentro del CD.

Por lo tanto si se quiere crear una segunda sesión de datos, hay que conocer de antemano en que sector del CD se emplazará la pista de datos. Normalmente este valor se le pregunta a la propia grabadora mediante el comando MMC READ_TRACK_INFO(52) especificando FF como número de track. Por eso suele ser necesario tener el CD dentro del lector justo antes de comenzar a generar una imagen ISO de continuación 12.

Un segundo factor es la importación de ficheros de sesiones anteriores. Una vez montado, en un CD-ROM multisesión sólo valdrá el path_list de la última sesión. Por lo tanto para ver ficheros de sesiones anteriores, es necesario añadir sus entradas de path_list a la path_list de la imagen ISO que queremos generar. Esta acción se denomina mezclar (merge en ingles). Dado que la numeración de sectores es fija, basta con copiar solamente esas entradas sin hacer ningún ajuste más. Esto se puede hacer también de manera selectiva permitiendo que ciertos ficheros aparezcan y otros no.

2.3.2 CDROM's de arranque

El estandar El Torito [TORITO] describe como crear CD's de arranque.

Consiste en incluir un fichero con una imagen de arranque 13 y otro fichero llamado el boot catalogue que diga donde se encuentra la imagen y las opciones que se aplican a ella.

Estos ficheros se indican en una zona particular del fichero iso9660.

La imagen se puede ejecutar de 3 formas diferentes:

  • Con una emulación de disquete. La BIOS considerará la imagen como el primer disquete del sistema (/dev/fd0 o A: en Hasefroch) y desplazará el disquete existente a la segunda posición (/dev/fd1, B:) eliminando cualquier acceso al segundo lector. Utilizará entonces su propio sistema de arranque a partir de disquete para arrancar con el CDROM.

    Para ello la imagen ha de tener un tamaño estandar 1.2M, 1.44M o 2.88M.

    Este es el sistema que se utiliza con BIOS antiguas porque es el que menos problemas daba. Para construir esta imagen se suele utilizar Syslinux .

  • Con una emulación de disco duro. Este sistema no se utiliza nunca ya que oculta el disco duro a la BIOS.

  • Sin emulación. La imagen se carga directamente y las asignaciones de la BIOS no cambian para nada. Este es el sistema que se utiliza más actualmente. Para construir la imagen se utiliza Isolinux .

En cualquiera de los casos, para acceder al CD aparte de la imagen de arranque, hay que utilizar los comandos MMC estandar, por lo que la imagen tiene que contener los módulos o drivers de lectura de CD-ROM.


3 Y ahora un poco de practica

3.1 Opciones por defecto de cdrecord y mkisofs

Para evitarme el tener que teclear siempre las mismas opciones (que es lo que hace pesado al cdrecord) yo he hecho 2 cosas:

  1. Al menos en Debian, en el fichero /etc/default/cdrecord se pueden especificar algunos parámetros básicos como el dispositivo (ATA:1,0,0 para kernels 2.6 con ide-cd y 0,n,0 para 2.4 con ide-scsi), la velocidad de grabación y el tamaño de la FIFO.

  2. Además me he creado un simple script bash en /usr/local/bin/micdrecord con el resto de opciones que utilizo en la mayoría de los casos. El script se reduce a:
             #!/bin/bash
    
             /usr/bin/cdrecord -v -eject -multi $*
    
             # $ ignorar esta linea (AucTeX creía que estaba en modo matemático)
    

La opción -v hace que se muestre la cuenta de los bytes escritos, -multi hace que la sesión se quede siempre abierta para poder añadir más cosas en el futuro, -eject hace que el CD se expulse al terminar la grabación.

Algo parecido he hecho para mkisofs (/usr/local/bin/mimkisofs):

         #!/bin/sh

         /usr/bin/mkisofs -J -R -r -v $*

         #$ ignorar esta linea (AucTeX creía que estaba en modo matemático)

Las opciones -R y -J activan las extensiones RockRidge y Joliet, -r hace que los permisos de los ficheros también se incluyan en la imagen y -v hace que se vaya mostrando el proceso.


3.2 Obteniendo información de la grabadora y del CD

Para ver las capacidades del lector, cdrecord -prcap lista lo que puede y no puede hacer el lector. No se necesita tener un CD introducido.

En cuanto al contenido del CD no he encontrado ningún comando que nos dé de una tirada toda la información del TOC comodamente puesta. Sin embargo los siguientes comandos nos dan toda la información necesaria en casos normales:

cdrecord -toc Muestra el comienzo de cada pista saltándose los lead-out y lead-in de entre las sesiones. Sin embargo no nos dice nada en cuanto a sus duraciónes.

Podemos identificar también el tipo de pista:

cd-da
control:0 (modo 1 o -1 en función de si es la última sesión o no).
CD-ROM 1 Mode 1
control: 4 Mode 1
CD-ROM XA Mode 2
control: 4 Mode 2
Curiosamente este comando no nos dice si el CD esta abierto o no. He probado con 2 CD's del mismo contenido, uno abierto y otro no y no he apreciado ninguna diferencia.
cdrecord -msinfo Cuando el CD está abierto (se grabó con la opción -multi) nos da 2 números: primero el sector donde empieza el área de programa de la última sesión actual del CD y segundo el sector dondé empezará el área de programa de la sesión futura.

Estos 2 numeros hay que pasárselos con la opcion -C a mkisofs. El primero le sirve para localizar el PVD de la última sesión del CD y así poder acceder a los ficheros anteriores para la mezcla. El segundo es el offset que debe aplicar a los ficheros nuevos de la imagen actual.

Si el CD está cerrado, este comando puede provocar un error SCSI que no tiene mayores repercusiones.

isoinfo -d -T <sector> -i /dev/cdrom Solo para pistas de datos que contienen imágenes ISO9660 donde sector es el numero de comienzo de la sesión obtenido con cdrecord -toc.

Este comando nos lee el PVD (Sect 2.3) donde está el tamaño del bloque de la imagen ISO así como el número de bloques/sectores que la componen. Podemos asumir que el resto de sectores no llevan información de usuario y contienen los lead-out y lead-in de cada sector.

Por último también hay varias formas de explorar el contenido de una imagen ISO9660. Además de montarla en loopback (lo cual requiere un proceso especial si es una segunda multisesión, ver 3.5), podemos averiguar varias cosas de un fichero iso con el comando isoinfo. En todos los casos -N <sector> es el sector de offset especificado a la hora de crear la imagen (el segundo número del output de cdrecord -msinfo. Para la imagen de la primera sesión no hace falta ponerlo.

-d -N <sector> -i <fichero-iso> Nos lee el encabezado PVD. Si el valor de sector es incorrecto obtendremos un error en la última línea o una información incorrecta respecto a las extensiones RockRidge.
-l -J -R -N <sector> -d -i <imagen-iso>

Con esto obtenemos un listado ls-lR de todos los ficheros de la imagen incluídos los importados de la sesión anterior. En cada línea se nos especifica en que sector se coloca cada fichero.


3.3 Grabación de un CD multisesión con cdrecord

Tenemos 3 directorios: sesion1, sesion2 y sesion3. Haremos el CD de manera incremental con cada uno de ellos.

Para hacerlo más ``especial'' vamos a grabar la primera sesión en modo SAO y con un tipo de pista CD-ROM 1 Mode 1, el único que la grabadora nos deja.

  1. Creamos la imagen iso inicial en el fichero sesion1.iso, incluímos Joliet (-J), Rock Ridge(-R) y pasamos los permisos(-r). Al volumen le llamamos ``sesion1'' (-V):
         mkisofs -R -r -J -v -V sesion1 -o sesion1.iso sesion1
    

  2. Gravamos la primera imagen en modo SAO dejando abierta la multisesión

    Para hacer esto con cdrecord hay que tener en cuenta 2 cosas:

    • Cuando se especifica el modo SAO (-sao) hay que darle a cdrecord el numero de bytes que hay que grabar de antemano de forma que pueda generar la CUE-sheet. Si la imagen es iso9660 (o también para pistas de audio en .wav) lo más práctico es utilizar es utilizar simplemente la opción -useinfo 14

    • En multisesión (-multi, quizás por los rumores de 2.1.4, cdrecord cambia el tipo de pista de datos por defecto a CD-ROM XA Mode 2 Form 1. Esto en sí no es grave, pero sin embargo en modo SAO muchas grabadoras no aceptan este tipo de pista por lo que forzamos la pista de datos clásica especificando -data.

      Para resolver el problema se le fuerza a cdrecord a utilizar el tipo de pista normal (CD-ROM 1 Modo 1) con la opción -data.

    Con todo lo dicho, el comando queda (quitando los parametros guardados en /etc/default/cdrecord:

        cdrecord -v -eject -multi -sao -useinfo -data sesion1.iso
    

  3. Para crear la siguiente imagen ISO necesitamos conocer el principio y final de la última sesión presente en el CD:

        cdrecord -msinfo
    

    Si el CD no esta abierto (no pusimos -multi antes), entonces puede que a cdrecord le de un media loading error y pida que se meta otro CD. Evidentemente basta con dar a Ctrl-C.

    En mi caso la última línea me ha dado los valores 0, 21007

  4. Creamos la segunda imagen ISO especificando el offset (-C) y haciendo el merge (-M) con los ficheros de la sesión anterior.

         mkisofs -v -J -R -r -V ``sesion2'' -o sesion2.iso -C 0,21007 -M /dev/cdrom sesion2
    

    Nota: También podríamos haber dado -M sesion1.iso en vez de tener que mirar en el CD anterior. Y podríamos incluso no hacer ninguna mezcla con lo que los ficheros de la primera sesión quedarían tapados por la segunda.

  5. Añadimos la segunda imagen al CD.

    Esta vez lo he tenido que hacer en modo TAO 15. Fuerzo de nuevo el modo de pista CD-ROM 1 Mode 1 para mantener el mismo tipo de pista de datos en todas las sesiones CD.

    El comando queda:

        cdrecord -v -eject -multi -data sesion2.iso
    

  6. Volvemos a preguntar la información de multisesión al grabador

        cdrecord -msinfo
    

    Esta vez yo obtengo 21007,26511

  7. Generamos la tercera imagen ISO de una forma similar a la segunda.

    mkisofs -v -J -R -r -V ``sesion3'' -o sesion3.iso -C 21007,26511 -M /dev/cdrom sesion3
    

    Esta vez no podríamos especificar -M sesion2.iso ya que los ficheros no se encuentran físicamente en los sectores que tiene el índice. Para esto tendríamos que utilizar un fichero ISO conteniendo dicha imagen desplazada a su posición exacta en el CD (ver 3.5).

  8. Sólo nos queda añadir el tercer fichero iso (y dejamos el CD abierto siempre).

        cdrecord -v -eject -multi -data sesion2.iso
    


3.4 Grabación de un cd extra

Un CD extra es un CD cuya primera sesión contiene exclusivamente pistas de audio y las siguientes pistas de datos. En nuestro caso tenemos 3 canciones: pista1.wav, pista2.wav, pista3.wav y 2 pistas de datos sesion1 y sesion2.

El proceso es similar al anterior.

  1. Grabamos las pistas de audio en modo SAO dejando el CD abierto.

        cdrecord -v -eject -multi -sao -useinfo pista1.wav pista2.wav pista3.wav
    

  2. Obtenemos la información de multisesión:

        cdrecord -msinfo
    

    En mi caso me ha salido: 0,63352.

  3. Generamos la primera imagen ISO:

    mkisofs -v -J -R -r -V sesion1 -o sesion1.iso -C 0,63352 sesion1
    

    El caso del CD extra es el típico en el que no se hace el merge con la sesión anterior, por lo que se omite el parámetro -M.

  4. Grabamos la primera imagen ISO al CD (de nuevo la grabadora no me deja hacer SAO)

        cdrecord -v -eject -multi sesion1.iso
    

    Como no he puesto la opción -data la pista se grabará como CD-ROM XA Mode 2 Form 1. Pues muy bien.

  5. Y ahora ya sabéis el resto, no?

        cdrecord -msinfo
        mkisofs -v -J -R -r -V sesion2 -o sesion2.iso -C 63352,79861 -M /dev/cdrom sesion2
        cdrecord -v -eject -multi sesion2.iso
    


3.5 Extracción y montaje en loopback de imágenes ISO multisesión

Todo lo que entra ha de poder salir. Si por alguna razón queremos copiar un CD multisesión sin regenerar las sesiones o queremos recuperar algún fichero que quedó tapado, tiene que haber algún modo de conseguirlo. Mientras sepamos lo que estamos haciendo podremos conseguir lo que queramos.

Tenemos el CD multisesión de la práctica en 3.3. Queremos obtener las sesiones en el disco duro y montarlas en loopback.

En algunos casos quizás se pudiera obtener todo de una tirada con readcd /dev/cdrom o un dd con una amplitud lo suficientemente grande para abarcar todas las sesiones. El problema sin embargo es que las zonas de leadout-leadin entre sesiones no suelen tener los códigos de protección contra error calculados con lo que dan errores de lectura tanto a readcd como al driver del cdrom de linux que es utilizado por dd.

Por lo tanto tenemos que extraer cada sesión separadamente y unirlas manteniendo su posición abosoluta dentro de un único fichero.

Propongo el siguiente proceso:

  1. Hacemos un cdrecord -toc que nos da:

    first: 1 last 4
    track:   1 lba:         0 (        0) 00:02:00 adr: 1 control: 4 mode: 1
    track:   2 lba:     21007 (    84028) 04:42:07 adr: 1 control: 4 mode: 1
    track:   3 lba:     33498 (   133992) 07:28:48 adr: 1 control: 4 mode: 1
    track:lout lba:     51873 (   224052) 12:28:63 adr: 1 control: 4 mode: -1
    

    Con esto vemos que las 3 sesiones empiezan en los sectores 0, 21007, 33498

  2. Como sabemos que son pistas iso, utilizamos isoinfo para averiguar su tamaño.

    isoinfo -d -T 0 -i /dev/cdrom          -> Volume size is: 9607
    isoinfo -d -T 21007 -i /dev/cdrom      -> Volume size is: 5589
    isoinfo -d -T 33498 -i /dev/cdrom      -> Volume size is: 11473
    

    Asegurándonos siempre de que el tamaño del bloque es de 2048 bytes.

    Ya tenemos todos los datos y nos podemos hacer la tabla siguiente.

    Pista Comienzo Tamaño Sector siguiente
    1 0 9607 9607
    2 21007 5589 26596
    3 33498 11473 44971

  3. Extraemos las pistas.

    Se pueden hacer tanto con dd como con readcd

    Usando dd Usando readcd
    dd bs=2048 if=/dev/cdrom of=sesion1.iso count=9607 readcd sectors=0-9607 -f=sesion1.iso
    dd bs=2048 if=/dev/cdrom of=sesion2.iso count=5589 skip=21007 readcd sectors=21007-26596 -f=sesion2.iso
    dd bs=2048 if=/dev/cdrom of=sesion3.iso count=11473 skip=33498 readcd sectors=33498-44971 -f=sesion3.iso

    Con esto ya tendríamos suficiente para volver a crear un nuevo CD a partir de las imágenes. Es importante que cada sesión se graba en el mismo modo SAO/TAO que en el CD original ya que si no TAO produce 2 sectores más de lead-out lo que hace que los punteros de ficheros de las sesion siguientes no correspondan a la realidad.

    En el caso del ejemplo tendríamos que hacer:

    1. cdrecord -v -eject -multi -sao -useinfo -data sesion1.iso

    2. cdrecord -v -eject -multi -data sesion2.iso

    3. cdrecord -v -eject -multi -data sesion3.iso

  4. Para montar las imágenes en loopback tenemos que crear primero un fichero que represente al CD donde cada sesión esté ubicada en la misma posición que el CD. El espacio intermedio lo rellenaremos de ceros.

    A partir de las tablas que nos hemos construído, calculamos los espacios intermedios.

    Espacio Comienzo Final Tamaño
    1-2 9607 0 21006 11400  
    2 26596 33497 6902

    Generamos los ficheros de valor a partir de /dev/zero.

    dd if=/dev/zero of=inter1 bs=1 count=11400
    dd if=/dev/zero of=inter2 bs=1 count=6902
    

    Ahora concatenamos todos con:

    cat sesion1.iso inter1 sesion2.iso inter2 sesion3.iso > total.iso
    

  5. Se monta el fichero en loopback con una opción especial

    A diferencia de cuando está en el CD donde el kernel puede preguntar al lector sobre la última sesión disponible, ahora el kernel no puede saber donde está el último encabezado iso9660.

    Por lo tanto si queremos ver las sesiones superiores tenemos que dar una opción a mount para decirle donde comienza la nueva sesión. Esa sesión es sbsector 16.

    El comendo queda:

    mount -o loop,sbsector=33498 total.iso /cdrom
    

    Y evidentemente se pueden dar especificar los otros sectores del TOC por si se quiere montar sólo la segunda partición con la primera.

3.6 Extracción de pistas audio

Este ejemplo es muy sencillo. Yo recomiendo utilizar cdparanoia ya que a diferencia de cddawav hace reintentos cuando el audio no se saca bien en los CDs rebeldes.

Para sacar en modo batch unos cuantas pistas de audio, el comando más sencillo es:

cdparanoia -B <primera-pista>-<ultima-pista>

Los ficheros se guardarán con el nombre de trackN.wav.

Si queréis pasarlos a mp3 está el programa abcde que hace una serie de operaciones en cadena recuperando la información de CDDB y poniendola en las ID-TAGS de los ficheros.

4 Conclusiones

Hemos hecho un paseo por las diferentes opciones de grabación de CD's corrientes (audio y datos) utilizando programas de línea de comandos.

Espero que este artículo haya aclarado las dudas siguientes:

  • Por defecto cdrecord deja los CD's cerrados, hay que ponerle la opción -multi para que los deje abiertos.

  • No hay ningún problema en grabar datos en SAO y audio en TAO. En ambos casos es la grabadora la que genera el Lead-In, Lead-out y los subcanales (aunque en SAO hay que ayudarle con la CUE-sheet).

  • SAO hace que el laser no tenga nunca que apagarse ni reposicionarse al tener que generar el TOC de la sesión, lo cual es una ventaja para ciertas grabadoras en fase terminal como la mía.

  • cdrecord puede grabar perfectamente en modo SAO. No es necesario utilizar cdrdao.

  • Si queremos enredar en el Lead-In, Lead-Out o en los subcanales, tendremos que utilizar el modo de grabación Raw. Esto queda fuera del alcance de este artículo.

  • SAO en principio no tiene porque impedir la multisesión, aunque algunos firmwares opinen lo contrario (asociando SAO a DAO).

  • Los modos de pista CD-ROM 1 Mode 1 y CD-ROM XA Mode 2 Form 1 son equivalentes en funcionalidad y ambos son perfectamente aceptables para la multisesión o para la sesión única.

  • Las imágenes ISO en multisesión deben de estar ajustadas al offset con el que se vayan a grabar. Si además se quieren incorporar los ficheros de la sesión anterior, es necesario tener dicha sesión a mano bien en el CD o bien en un fichero colocado en el mismo offset que el CD.

  • El hecho de que un CD sea de arranque o no en x86 depende únicamente de la imagen ISO.

5 Me ha gustado mucho el artículo, pero no podrías también hablar de...

DVDs
Todo un mundo aparte, otra organización de datos, sistemas DVD+R y DVD-R, DVD's de video comerciales... La sección 4.4 de [MMC4] junto con el capítulo 4 de [FUJI] son un buen comienzo para entrar en el ajo.

UDF
Un sistema de archivos que se utiliza en los DVD's y también en algunos CD's y que también hay que considerarlo. El estandar está disponible en [UDF].

cdrdao, growisofs
Existen otras aplicaciones en linea de comandos que probablemente puedan remplazar a cdrecord. Nada como mirar sus páginas man.

Interfaces gráficas
k3b, graveman, xcdroast... sin duda interesantes y de uso más común que la línea de comandos. Sin embargo para ver y mostrar como funcionan las cosas por dentro las interfaces gráficas tienen 2 lagunas:
  • No proveen un buen sistema de traceo de los comandos que envían y la información que reciben.

  • Si son front-ends de programas de consola no se puede personalizar las opciones que envían a dichos programas.

Proteccion de datos
: bonus-tracks y otras tristes irregularidades que traen los CD's modernos para intentar limitarnos la copia privada. Un tema interesante que requiere el dominio del modo Raw.

Todos estos son temas muy interesantes y animo a otros a que retomen el camino y nos sorprendan con nuevos artículos :).

6 Agradecimientos

Un agradecimiento especial a Diego y Nacho, los programadores del nuevo proyecto g4c por sus referencias y correciones.

Bibliografía

CDFAQ
Andy McFadden's CD Recordable FAQ.

FUJI
Documento de Toshiba-Pioneer llamado ``Fuji'' aparentemente por el nombre del volcan..

MMC
Drafts SCSI MMC en t10.org

MMC4
Ultimo draft de SCSI MMC4

RED
Philips Red book standard for CD-Digital Audio, 1980-85

YELLOW
Philips Yellow book standard for CD-ROM 1, disponible en PDF como ECMA-130 en ECMA

UDF
Especificación UDF de OSTA .

ISO9660
ISO 9660 File system standard, disponible en PDF como ECMA-119 en ECMA

CDROMXA
Philips CD-ROM eXtended Architecture specification.

WHITE
Philips White Book for Video CD specification.

GREENBOOK
Philips CD-i specification.

MULTI
Multisession specification, Philips & Sony, 1995

TORITO
Estandar El Torito para crear CD's de arranque en ordenadores x86. Desarrollado por Phoenix y disponible en Phoenix.com

Sobre este documento...

Patas-arriba de la grabación de CD's

This document was generated using the LaTeX2HTML translator Version 2002-2-1 (1.71)

Copyright © 1993, 1994, 1995, 1996, Nikos Drakos, Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999, Ross Moore, Mathematics Department, Macquarie University, Sydney.

The command line arguments were:
latex2html -html_version=3.2 -no_navigation -split 0 -show_section_numbers patas_arriba_grabacion_cds.tex

The translation was initiated by Miguel Telleria de Esteban on 2005-10-28


Notas al pie

... de
... Normalmente2
La especificación [CDROMXA] permite poner una única pista de datos al principio seguida de pistas de audio. Sin embargo esto puede ser peligroso para los altavoces de reproductores antiguos por que esta funcionalidad ha sido reemplazada por la multisesión.
... sector3
F viene del término frame que en algunos estándares ([YELLOW]) es el nombre oficial de sector. Sin embargo esto se presta a confusión con el término small frame que representa la mínima cantidad de audio extraíble (6 muestras).

Para evitar confusiones en el artículo siempre utilizo el término sector.

... ahora4
Salvo algunas tristes modas ``anti-piratería'' como el bonus track que no se abordan en este artículo
... (Form1)5
Existe la también opción -xa1 pero entonces la aplicación que genera la imagen tiene que generar 8 bytes más de metainformación por sector
... especial6
Tecnicamente modo 5 y valor de POINT 'BO'
... puristas7
De aquí la insistencia en los estandares de que no se deben intercambiar CDs abiertos
... segundos8
Al parecer esto es debido a que estos silencios se incluye una metainformación conocida como el TCB (Track Control Block)
...mmc4):9
información obtenida de la verbosidad de cdrecord y contrastada más o menos con su código fuente (cdrecord.c, drv_mmc.c y scsi_cdr.c).
... pistas10
Lo que garantiza que el identificativo de CDDB también sea el mismo
... imagen11
exactamente en el 16avo sector de 2048 bytes
... continuación12
Aunque conociendo el sistema de grabación se podría adivinar este offset, al ser la grabadora la que va a decidirlo de todas formas en las grabaciones TAO y SAO, es mejor preguntarle a ella
... arranque13
el documento da la posibilidad de poner una por defecto y otras que el usuario pueda seleccionar después, pero aquí vamos a describir el caso simple
...-useinfo 14
Para pistas de datos, la página man recomienda en general utilizar la opción ts=<nr_bytes> donde se puede dar el tamaño del fichero.
... TAO15
la grabadora no se quejó al pedirle modo SAO pero mi CD quedó iligible
...sbsector 16
man mount


Miguel Telleria de Esteban 2005-10-28

Imprimir
Version para
imprimir

Imprimir
Version
PDF
Comentarios
1.  Re: Patas-arriba de la grabación de CD's (29/10/2005 12:11, #4228)
  Por: LinuxCart
¡Ufff!. Me he quedado muerto. Vaya pedazo de artículo. Se nota que te lo has currado. Si estás estudiando deberías aprovecharlo para que te pusieran alguna matricula de honor. ;)

Muchas gracias por el artículo. Ya se donde consultar cuando tenga alguna duda de esto.

 
2.  Re: Patas-arriba de la grabación de CD's (29/10/2005 12:16, #4229)
  Por: El cobarde anónimo
Genial!!!! (sobran comentarios)

 
3.  Re: Patas-arriba de la grabación de CD's (30/10/2005 14:06, #4237)
  Por: RiCe (http://www.linuca.org)
Miguel, ya veo que te has ofuscado con la grabadora, espero que al menos ahora seas capaz de tostar sin tener que comprarte una nueva.

Muy chulo el artículo.

Un saludo!!

 
4.  Re: Patas-arriba de la grabación de CD's (31/10/2005 16:25, #4244)
  Por: Netwalker
Ahora lo suyo seria que se ofusque con la grabadora de DVDs, por seguir el hilo...

No, venga. Ahora en serio: tema cojonudo y bien explicado. Quien quiera criticarte solo podra mencionar algun detallito de dislexia o que entra en detalle tecnico (que era la idea).

Sigue asi. Un saludo


 
5.  Re: Patas-arriba de la grabación de CD's (13/11/2005 13:17, #4294)
  Por: El cobarde anónimo
!!!!!!!!Ole por tu pedazo de articulo desde Barcelona!!!!!

 
Calificacion
***0
Votos: 13
Relacionados
. Comandos y trucos para linux
. CD-RW y DVD-RW bajo linux
. Grabar CDs a altas velocidades
SECCIONES
Artículo
Truco
Noticias
Breve
Enlace
Linuca
Libros
Tira ECOL
Tira Ecol
Modificado: 16/11/2006 14:35:18 | Tiempo Total: 0.032 segs | Kernel: Linux - x86_64 - 2.6.18-xen | Last Boot: 03/12/2010 01:21 CET
Powered By WEB-Bulma   Apache   Mysql   PHP   Gimp