Patas-arriba de la grabación de CD's
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.
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.
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
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.
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.
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.
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.
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.
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:
- MODE_SELECT_10(55): Se indica modo TAO, el tipo de pistas,
tiempo de gap, si es multisesión ([MMC4], pag 470)...
- Para cada pista:
- 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.
- 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.
- 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.
- De vez en cuando un READ_BUFFER_CAPACITY(5C) para
monotorizar el estado del buffer.
- Un SYNCHRONISE_CACHE(35) para asegurarse que todos los datos
se han grabado y dar por finalizada la pista.
- 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.
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.
- MODE_SELECT_10(55): Se indica modo SAO, el tipo de pistas,
y si es o no multisesión [MMC4], pag 470)
- SEND_CUE_SHEET(5D): Se le pasa a la grabadora el TOC
referente al área de programa que se va a enviar después.
- MODE_SELECT_10(55) para poner el ISRC y otros
parámetros que se aplicarán a todas las pistas.
- 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.
- 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
- De vez en cuando un READ_BUFFER_CAPACITY(5C) para
monotorizar el estado del buffer.
- Un SYNCHRONISE_CACHE(35) para asegurarse que todos los datos
se han grabado con lo que la grabadora genera el lead-out.
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.
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.
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.
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.
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
Para evitarme el tener que teclear siempre las mismas opciones (que
es lo que hace pesado al cdrecord) yo he hecho 2 cosas:
- 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.
- 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.
- 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
- Gravamos la primera imagen en modo SAO dejando abierta la
multisesión
Para hacer esto con cdrecord hay que tener en cuenta 2 cosas:
Con todo lo dicho, el comando queda (quitando los parametros guardados
en /etc/default/cdrecord:
cdrecord -v -eject -multi -sao -useinfo -data sesion1.iso
- 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
- 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.
- 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
- Volvemos a preguntar la información de multisesión al grabador
cdrecord -msinfo
Esta vez yo obtengo 21007,26511
- 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).
- 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.
- Grabamos las pistas de audio en modo SAO dejando el CD abierto.
cdrecord -v -eject -multi -sao -useinfo pista1.wav pista2.wav pista3.wav
- Obtenemos la información de multisesión:
cdrecord -msinfo
En mi caso me ha salido: 0,63352.
- 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.
- 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.
- 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:
- 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
- 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 |
- 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:
- cdrecord -v -eject -multi -sao -useinfo -data
sesion1.iso
- cdrecord -v -eject -multi -data sesion2.iso
- cdrecord -v -eject -multi -data sesion3.iso
- 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
- 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.
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.
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.
- 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 :).
Un agradecimiento especial a Diego y Nacho, los programadores del
nuevo proyecto g4c
por sus
referencias y correciones.
- 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
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
|