Copiando CDs en Linux

Posted on Thursday, July 10, 2003

Copiando CDs en Linux

Lo necesario

Las herramientas estándar para copiar CDs en Linux son las cdrtools, pero para este artículo usaremos cdrdao. Para usar los técnicas que explico para ahorrar espacio necesitarás:

Si el CD es de audio, alguno de éstos (por orden de preferencia, aunque los dos primeros son imprescindibles):

Para otro tipo de CDs alguno de éstos (por orden de preferencia, aunque lo más probable es que ya los tengas todos instalados):

Conociendo la grabadora

Lo primero que tenemos que hacer es averiguar donde está la grabadora si es que no lo sabemos ya.

Desafortunadamente, parece ser que Linux no permite enviar comandos SCSI a través de ATAPI para unidades IDE, por lo que en un principio no se podrían usar grabadoras IDE. Pero afortunadamente el kernel nos permite hacer un apaño con el módulo ide-scsi (Emulación de SCSI para unidades ATAPI). Si tienes una unidad ATAPI tendrás que activar dicho módulo siguiendo las instrucciones del archivo README.ATAPI de las cdrtools. Si no tienes instalado cdrtools puedes consultar dicho archivo aquí: http://www.fokus.gmd.de/research/cc/glone/employees/joerg.schilling/private/man/README/README.ATAPI o aquí: ftp://ftp.berlios.de/pub/cdrecord/README.ATAPI

Si sabes qué dispositivo dentro de /dev es el que le corresponde a tu unidad CD-R (probablemente esté en /dev/scd*, /dev/sr*, /dev/sg*, /dev/cdroms/* o /dev/scsi) entonces creas un enlace llamado /dev/cdrecorder hacia ese dispositivo y podrás usar cdrdao sin necesidad de especificar el dispositivo. Por ejemplo, si tu grabadora está en /dev/cdroms/cdrom1 entonces creas un enlace simbólico llamado /dev/cdrecorder con el siguiente comando:

ln -s /dev/cdroms/cdrom0 /dev/cdrecorder

y podrás usar cdrdao sin especificarle la unidad, por ejemplo:

cdrdao write tocfile

Ten en cuenta que si estás usado devfs tendrás que hacer el enlace simbólico de otra forma para que no desaparezca al reiniciar el ordenador. La forma de hacerlo usando devfs es añadiendo esto en /etc/devfsd.conf (suponiendo que el CD-R se encuentre en /dev/cdroms/cdrom1):

LOOKUP ^cdrecorder$ CFUNCTION GLOBAL mksymlink cdroms/cdrom1 cdrecorder REGISTER ^cdroms/cdrom1$ CFUNCTION GLOBAL mksymlink $devname cdrecorder UNREGISTER ^cdroms/cdrom0$ CFUNCTION GLOBAL unlink cdrecorder

Si no quieres crear el enlace simbólico puedes decirle a cdrdao en que unidad se encuentra el CD-R cada vez que lo ejecutes, por ejemplo:

cdrdao write --device /dev/sg0 tocfile

Si no sabemos qué dispositivo es el que le corresponde, escribimos

cdrdao scanbus

Nos mostrará por cada unidad SCSI tres números separados por comas que son el bus, el id y el lun y a continuación la descripción de la unidad. Esos tres números tendrás que pasárselos a cdrdao cada vez que lo uses, por ejemplo:

cdrdao write --device 0,0,0 tocfile

Copiando CDs 'on the fly'

Desde luego la forma que menos espacio consume en el disco duro es copiar directamente de CD a CD (si dispones de otra unidad de CD, aparte de la grabadora), pues no consume espacio en el disco duro. Pero es menos recomendable pues si se produce algún error al leer el CD original o una desincronización el CD de destino se echará a perder, mientras que eso no pasaría si si copiara primero al disco duro. La sintaxis sería la siguiente:

cdrdao copy --source-device <dispositivo_e> --device <dispositivo_s> --on-the-fly <archivo_toc>

Sustituyendo <dispositivo_e> por el dispositivo donde se encuentra el CD original, <dispositivo_s> para el dispositivo de la grabadora y <archivo> por el archivo donde se guardará la tabla de contenidos. Por ejemplo:

cdrdao copy --source-device /dev/cdrom --device /dev/sg0 --on-the-fly tocfile

Grabando CDs pasándolos por el disco duro

Bien, para grabar un CD sin usar el método 'on the fly' tenemos que guardar por una parte la tabla de contenidos (TOC) en un archivo, que es donde se encuentra la información sobre la estructura del CD y por otra parte el contenido en sí del CD. Todo esto se hace con un único comando:

cdrdao read-cd <archivo_toc>

Y después copiaremos el CD con el siguiente comando:

cdrdao write <archivo_toc>

Copiando un CD de Audio usando poco espacio

Bien, un CD estándar de audio (74 minutos) ocupa alrededor de 750 MB cuando es volcado al disco duro. Con el método que explico aquí ocupara sobre 100 MB. Para ello necesitaremos igualmente la TOC, la leemos de la siguiente forma:

cdrdao read-toc --datafile - <archivo_toc>

La TOC quedará guardada en el archivo que le digamos. Después leemos el contenido del CD, pero según lo va leyendo lo convertimos a Ogg Vorbis o MP3 reduciendo por tanto el tamaño que ocupará. A continuación explico como hacerlo dependiendo del programa que usemos.

Vorbis-tools

cdparanoia -d <dispositivo> 1- /dev/stdout | oggenc - -o <archivo_ogg>

Sox

No conseguí crear un Ogg Vorbis con SoX, pero supuestamente sería así:

cdparanoia -d <dispositivo> 1- /dev/stdout | sox -t wav - <archivo_ogg>

LAME

cdparanoia -d <dispositivo> 1- /dev/stdout | lame - <archivo_mp3>

MPLAYER

No estoy seguro de que con MPlayer se pueda convertir de WAV a MP3 porque cuando yo lo intento se produce una violación de segmento, pero en un principio si que se podría si se compiló con soporte para lame y MEncoder y sería así:

cdparanoia -d <dispositivo> 1- /dev/stdout | mencoder -oac mp3lame - -o <archivo_mp3>

Una vez creado el archivo OGG o MP3 ya solo queda grabar el CD a medida que vamos descodificando el susodicho OGG o MP3:

Si es un ogg

Con vorbis-tools:

ogg123 -d raw -f - <archivo_ogg> | sox -t raw -wsc2 -r 44100 - -t cdr - | cdrdao write <archivo_toc>

Con SoX:

Ésto sólo se podrá hacer si SoX fue compilado con soporte para Ogg Vorbis, para saberlo escribe sox -h

sox <archivo_ogg> -wsc2 -r 44100 -t cdr - | cdrdao write <archivo_toc>

Si es un MP3

Con lame:

lame -t --decode <archivo_mp3> - | sox -t raw -wsc2 -r 44100 - -t cdr - | cdrdao write <archivo_toc>

Con mpg123:

mpg123 -s <archivo_mp3> | sox -t raw -wsc2 -r 44100 - -t cdr - | cdrdao write <archivo_toc>

Con mpg321:

mpg321 -w - <archivo_mp3> | sox -t wav -wsc2 -r 44100 - -t cdr - | cdrdao write <archivo_toc>

Con MPlayer se puede convertir a WAV tanto desde MP3 como desde OGG, pero como envía texto a la salida estándar (se puede reducir, pero no eliminar) dicho texto se mezclaría con el archivo.

Copiando cualquier tipo de CD con poco espacio

Bueno, con esto la compresión que conseguiremos es muy probable que sea bastante poca.

Se trata de comprimir el contenido del CD utilizando algún compresor. Empiezo desde el que más comprime al que menos. Todos deberían estar incluidos en tu distribución. Puede que bzip2 no lo tengas si usas un Linux muuuuuy antiguo y puede que gzip no lo tengas si usas un UNIX no Linux muuuuuy muuuuuy antiguo.

Bzip2

cdrdao read-cd --datafile /dev/stdout <archivo_toc> | bzip2 -c9 > <arhivo_bz2>

Gzip

cdrdao read-cd --datafile /dev/stdout <archivo_toc> | gzip -c9 > <archivo_gz>

Compress

cdrdao read-cd --datafile /dev/stdout <archivo_toc> | compress -cb 16 <archivo_Z>

Luego hay que hacer una modificación en el archivo TOC:

sed -ie "s:^DATAFILE \"/dev/stdout.*\":DATAFILE \"-\":" <archivo_toc>

Y ya lo grabamos, dependiendo del programa que hayamos usado será:

Bzip2

bzip2 -cd <archivo_bz2> | cdrdao write <archivo_toc>

Gzip

gzip -cd <archivo_gz> | cdrdao write <archivo.toc>

Compress

compress -cd <archivo_Z> | cdrdao write <archivo.toc>

Notas

  1. De los métodos para grabar CDs ocupando menos espacio sólo he probado suficientemente el método para grabar CDs de audio usando vorbis-tools, así que no puedo garantizar nada con respecto a los demás métodos.
  2. Puede algunos métodos fallen dependiendo de como esté compilado tu sistema.
  3. A no ser que no te importe echar a perder un CD virgen (que tampoco sería tanta pérdida tal y como están los precios, ¿no?), si no estás seguro de lo que haces convendría que primero probases con un CD regrabable si es posible. Si no te es posible probar con un CD regrabable prueba primero a "grabar" el CD pasándole a cdrdao la opción --simulate, esto realizará la grabación pero con el láser apagado, por lo que la grabación no se realizará realmente y te servirá para comprobar si se va a realizar bien.
  4. Si no has creado el enlace /dev/cdrecorder, cada vez que ejecutes cdrdao tendrás que pasarle la opción --device <dispositivo>
  5. Si cdrdao no detecta automáticamente el driver que tiene que usar para tu grabadora puedes especificárselo con --driver para --device y --source-driver para --source-device 

    Ejemplo

    Como lo mejor es verlo siempre con un ejemplo práctico, vamos a verlo. Supongamos que no hago el enlace /dev/cdrecorder porque no sé donde se encuentra mi grabadora, que el driver de mi grabadora es generic-mmc pero cdrdao no lo detecta automáticamente y que quiero copiar un CD usando vorbis tools.
    Primero averiguo donde está mi grabadora:

    cdrdao scanbus

    Y me dice:

    0,0,0: HL-DT-ST, CD-RW GCE-8160B, 1.02

    Se encuentra en 0,0,0. Sabiendo esto, si uso devfs, ya sabré que el dispositivo de mi grabadora es /dev/scsi/host0/bus0/target0/lun0/cd, pero voy a suponer que no uso devfs. Comienzo a leer el TOC:

    cdrdao read-toc --device 0,0,0 --driver generic-mmc --datafile - contenido.toc

    Cuando haya finalizado, leo el contenido del CD de origen, que se encuentra en /dev/hdb, convirtiéndolo a Vorbis:

    cdparanoia -d /dev/hdb 1- /dev/stdout | oggenc - -o data.ogg

    Y por último grabo ya el CD:

    ogg123 -d raw -f - data.ogg | sox -t raw -wsc2 -r 44100 - -t cdr - | cdrdao write --device 0,0,0 --driver generic-mmc contenido.toc

    Espero haberos sido de ayuda ;)