Gravação de cds pela linha de comando Se fizer uma busca no Google atras deste tipo de informação, certamente encontrará vários resultados com as mais variadas receitas de como fazer este tipo de procedimento, para as mais variadas necessidades. Tantos que a principio nem seria necessario escrever-se um novo artigo sobre isso, se é que é possível dizer algo novo agora. A não ser por um pequeno detalhe: nos resultados da busca que fiz, percebi que a maioria dos documentos encontrados estão desatualizados com relacao a uma mudança que houve na sintaxe de uso do cdrecord em suas últimas versões. Isto, mais o fato de que seria interessante ter toda essa informação que tantas pessoas levantaram reunidas num único lugar, me fez escrever este pequeno artigo, onde minha contribuição foi tão somente chamar a atenção para a mudança citada, e revisar todas as dicas interessantes que encontrei citando sempre, claro, a fonte original (relacionados ao texto atraves de numeros entre parênteses), mas algumas vezes modificando-as um pouco devido a uma atualização necessária ou por haver possibilidade de simplificacao de comandos. Também me dei ao trabalho de testar todos os comandos mostrados antes de dar este documento por finalizado, para tanto usando um gravador Creative 8x4x32 e um CDRW que nunca foi tantas vezes sobreescrito em tão pouco tempo. Aliás, aproveito para esclarecer que se usei velocidade 4 em todos os exemplos de gravação foi exatamente porque a mídia que usei para os testes não suporta velocidade maior que essa. O COMANDO cdrecord Para aqueles que nao sabem o cdrecord é um comando que faz parte do pacote cdrtools, e já acompanha o linux hà algum tempo. Programas gráficos de gravação de CDs muitas vezes nao fazem mais do que chamar esse comando para realizar a tarefa de gravação, implementando assim apenas uma interface em forma de janelas para o mesmo. É o caso do popular XCDRoast, que nao funciona se o cdrecord nao estiver presente na máquina. A forma mais simples de se chamar o comando para gravar uma imagem iso de um CD e como no exemplo: cdrecord -dev=0,0,0 speed=4 arquivo.iso O que gravara o arquivo num gravador SCSI. Os numeros 0,0,0 identificam esse gravador, e podem ser determinados via o comando cdrecord -scanbus A maioria dos artigos referenciados ao final deste texto recomendam esse comando para descobrir como identificar o seu gravador, mas acontece que houve uma mudança recente na implementação do cdrecord: Antigamente, o comando acima funcionava não importando se seu gravador era um SCSI ou um IDE usando a emulação de SCSI do Linux (através do modulo ide_scsi). Hoje, entretanto, ele (possivelmente) so vai funcionar com dispositivos SCSI (estou inferindo isso da documentação, infelizmente nao tenho acesso a um gravador SCSI para testar), e se voce tentar usalo com um gravador IDE (que a maioria de nos mortais usa, nao e mesmo?) vai receber uma mensagem de erro do tipo: root@marcos:/tmp# cdrecord -scanbus Cdrecord 2.00.3 (i686-pc-linux-gnu) Copyright (C) 1995-2002 Jörg Schilling cdrecord: No such file or directory. Cannot open '/dev/pg*'. Cannot open SCSI driver. cdrecord: For possible targets try 'cdrecord -scanbus'. Make sure you are root. cdrecord: For possible transport specifiers try 'cdrecord dev=help'. E é aqui que o iniciante, não encontrando maiores explicações, irá desistir de fazer gravações pela linha de comando e tentar algum programa gráfico, quando na verdade é só substituir o comando pelo seguinte: cdrecord dev=ATAPI -scanbus O que resultara numa saida como a que segue: root@marcos:~# cdrecord -dev=ATAPI -scanbus Cdrecord 2.00.3 (i686-pc-linux-gnu) Copyright (C) 1995-2002 Jörg Schilling scsidev: 'ATAPI' devname: 'ATAPI' scsibus: -2 target: -2 lun: -2 Warning: Using ATA Packet interface. Warning: The related libscg interface code is in pre alpha. Warning: There may be fatal problems. Using libscg version 'schily-0.7' scsibus0: 0,0,0 0) * 0,1,0 1) 'LG ' 'CD-ROM CRD-8521B' '2.00' Removable CD-ROM 0,2,0 2) * 0,3,0 3) * 0,4,0 4) * 0,5,0 5) * 0,6,0 6) * 0,7,0 7) * scsibus1: 1,0,0 100) * 1,1,0 101) 'CREATIVE' 'CD-RW RW8432E ' '1.07' Removable CD-ROM 1,2,0 102) * 1,3,0 103) * 1,4,0 104) * 1,5,0 105) * 1,6,0 106) * 1,7,0 107) * E graças a ela, eu já sei que meu gravador está identificado pelos números 1,1,0 que eu posso passar de novo para o cdrecord para gravar a imagem iso, mas de novo com a sintaxe modificada: cdrecord dev=ATAPI:1,1,0 speed=4 arquivo.iso Resumindo o importante aqui, em qualquer documentação mais antiga sobre como gravar CDs pela linha de comando, atente para o uso do comando cdrecord, e substitua: cdrecord -scanbus --> por --> cdrecord dev=ATAPI -scanbus cdrecord dev=X,X,X speed=Y arquivo.iso --> por --> cdrecord dev=ATAPI:X,X,X speed=Y arquivo.iso Podem haver mais flags passadas ao cdrecord, que provavelmente podem ser mantidas. E relembrando, este aviso vale para o caso de voce estar usando um gravador IDE (que é o mais usado por ai, pois eu mesmo ainda nao tive a chance de ter um gravador SCSI nas maos). CRIANDO A IMAGEM ISO Criar uma imagem iso e o primeiro passo para transportar o conteudo de um diretorio qualquer para dentro de uma mídia de CD, e o programa que faz isso e o mkisofs. Não o confunda com programas como mkreiserfs ou mke2fs, pois enquanto aqueles formatam um dispositivo de blocos seguindo a estrutura de um sistema de arquivos que ainda vai ser populado mais tarde (resumindo, o equivalente ao format no mundo windows), o mkisofs cria um arquivo que contem a imagem de um sistema de arquivos iso9660, já populado com arquivos e diretórios que estiverem sob um diretório do seu sistema especificado para o comando. Note que este comando tem muitas opções possiveis de serem utilizadas, entre elas para compatibilizar a leitura do iso criado por outros sistemas, para esconder certos arquivos sob determinados sistemas, para excluir alguns arquivos ou subdiretorios no momento de gerar a imagem (digamos que voce queira deixar de fora algumas coisas dentro do seu diretorio que usara para gerar a imagem), e ate opções para gerar imagens compativeis com DVDs hoje em dia. Uma boa olhada na man page do mkisofs lhe mostrara tudo o que voce tem para escolher, mas tamanha variedade de escolha tambem gera alguma confusão para decidir quais opcoes voce realmente precisa. Numa situação simples de gerar um CD de dados, com todo o conteúdo de um determinado diretório, voce pode usar o seguinte comando: mkisofs -J -L -l -r -T -V VOLUME -o ARQUIVOISO DIRETORIO Onde: VOLUME = nome do volume ARQUIVOISO = nome do arquivo de imagem a ser criado DIRETORIO = diretorio com os arquivos a serem colocados na imagem -J = gera informacao de diretorios Joliet (para compatibilidade com windows) -L = arquivos iso9660 podem comecar com . -l (éle)= permite nomes de arquivos de 32 caracteres -r = gera informacao de diretorios no formato Rock Ridge -V = ajusta o nome do volume (1) UM PEQUENO TESTE PARA A IMAGEM ISO É possivel montar o arquivo iso como se fosse um dispositivo com o comando: mount -t iso9660 ARQUIVOISO DIRETORIO -o loop Sendo: ARQUIVOISO = o arquivo gerado ao se executar mkisofs DIRETORIO = pode ser qualquer diretório, eu normalmente crio um na minha pasta home para esse fim especifico Se o comando for bem sucedido, em DIRETORIO voce podera ver todos os arquivos que estão dentro de sua imagem iso. Se nao for, cheque se voce nao precisa logar como root para fazer isso no seu sistema, e se seu kernel esta compilado com suporte a "loopback device". GRAVANDO EM UM, DOIS... OU TALVEZ JA NO UM :) Depois de gerar e possivelmente testar sua imagem iso, o proximo comando é o de gravação, o qual já foi mostrado mas nao custa repetir: cdrecord -v dev=ATAPI:1,1,0 speed=4 arquivo.iso Estes são os dois passos básicos para gravar um cd de dados via linha de comando. Entretanto, é possivel fazer tudo em um único passo caso se deseje: mkisofs -J -L -l -r -T -V VOLUME DIRETORIO | cdrecord -v fs=32m speed=4 dev=ATAPI:1,1,0 Note que o comando termina com um hífen ( - ); nao e passado o parametro -o para o mkisofs e, assim, tampouco o nome do arquivo, pois agora a saída desse comando será a saída padrão, redirecionada para o cdrecord através do pipe; e o parâmetro novo aqui é fs=X , sendo X o tamanho do fifo usado pelo cdrecord para guardar os bytes que estarão sendo gravados. O valor mostrado no exemplo, equivalente a 32M, foi o menor valor em que eu não tive problemas nos meus testes (abaixo disso testei 8m e 16m, que resultaram numa gravação imperfeita). A documentação do cdrecord diz que esse valor deve ser pelo menos o tamanho da memoria do dispositivo gravador e no máximo metade da memória RAM da máquina. Respeitadas essas regras, pelo que pude perceber, quanto mais melhor. (2) Note que o cdrecord ainda aceita mais tres flags que podem ser usados combinados com aqueles já mostrados: -dummy - "finge" que faz uma gravação, mas nao liga o laser. Útil para fazer um teste antes de realmente queimar a mídia, diminuindo o risco de perde-la por buffer underrun. Nos testes que fiz, este flag não funcionou com o comando que grava ao mesmo tempo que gera a imagem (somente usando imagem a partir de arquivo), mas as mensagens de erro pareceram indicar que isso é uma limitação do meu gravador. -eject - ejeta a midia apos a gravação -overburn - permite gravar uma imagem maior que o tamanho oficial da mídia. Depende entre outros fatores se o gravador suporta este recurso, e há consideráveis chances de resultar em uma gravação defeituosa. Entretanto pode ser útil em situações, por exemplo, em que voce dispões de uma mídia de 700M e uma imagem de 701M. COPIANDO UM CD DE DADOS Finalmente, se você quiser fazer uma cópia de um cd de dados, há duas maneiras de se fazer isso, dependendo se você tem apenas uma unidade de CD que é seu gravador ou se possui um leitor e gravador, o que também é um caso comum. Se você possui apenas o drive do gravador na máquina, terá que criar um arquivo com a imagem do cd a ser gravada, mas não é necessário montar o cd e utilizar o mkisofs no diretório onde voce o montou como se poderia pensar a principio. O linux tem um comando chamado dd muito prático nesse tipo de situação. Se o cd cuja imagem voce quer gerar estiver em /dev/cdrom (que em muitos linuxes e um soft link para /dev/hd? ), apenas faça: dd if=/dev/cdrom of=imagemcd.iso (3) Após esse comando você terá o arquivo imagemcd.iso que será uma imagem iso do cd, e que você pode passar para o comando cdrecord como vem fazendo ate agora com aqueles gerados pelo mkisofs. Se, entretanto, voce tiver dois drives, ha a possibilidade de gerar uma copia 1:1 através do seguinte comando: cdrecord -v dev=ATAPI:1,1,0 speed=4 -isosize /dev/hdd Sendo que /dev/hdd é o dispositivo do leitor onde esta o cd a ser copiado. CDs REGRAVÁVEIS O processo de gravar um CD regravável, no Linux, tem muito pouca coisa de diferente em relacao a CD-Rs. A única diferença, realmente, é que você pode usar o mesmo CD para sobregravar seu conteúdo quantas vezes desejar (até o limite do que a mídia suportar). Primeiro, você terá que limpar o conteúdo do CD-RW usando também o cdrecord: cdrecord dev=ATAPI:1,1,0 blank=fast Depois é só usar os comandos mkisofs e cdrecord como ja explicado nas sessões anteriores. Entretanto, você também pode fazer a "limpeza" e gravação da imagem iso num único passo: cdrecord -v speed=4 dev=ATAPI:1,1,0 blank=fast nome_da_imagem (5) Sendo que nome_da_imagem é o nome e caminho para seu arquivo iso. Aqui algumas pessoas vao me perguntar se nao dá para usar CDRW como se fosse uma unidade de disquete ou algo similar, gravando e apagando diretamente arquivos sem precisar ficar gerando imagens, apagando o disco e gravando de novo. A resposta, infelizmente, é que o linux ainda não suporta nativamente esse tipo de operação devido a uma limitação imposta pelo kernel (6), que entende unidades de CD sempre como dispositivos tipo somente leitura. Há um projeto no source forge que objetiva compensar isso, mas hà tempos ele nao sofre atualização (o ultimo kernel suportado é o 2.4.6), dando a impressão de que foi abandonado(7). Talvez isso seja um indício de que os CDs regraváveis, embora sejam um avanço tecnológico recente, estejam fadados a breve extinção por fatores tais como a popularização das pen-drives usb, muito mais rápidas de gravar e regravar, e ao já bastante reduzido preço dos CDRs, que já faz muita gente os estar usando como mídias descartáveis. Entretanto estou especulando aqui com base no que tenho observado, nao dispondo de dados oficiais, mas é fato que tenho visto muito pouca gente por aí usando CDRWs com frequência no seu dia a dia. CDs de AUDIO Esta aí outra espécie que não vou ficar nem um pouco chateado quando puder dar por extinta. Como hoje muitos aparelhos de som, dos grandos aos pequenos e ai incluídos os automotivos, suportam discos de mp3, que comportam no mesmo tipo de mídia cerca de 10 vezes mais tempo de música que um CD de audio gravado no formato convencional, os únicos interessados em manter o velho padrão, até onde vejo, são as gravadoras mais que preocupadas em manter os seus lucros. E um CD de mp3 nada mais é que um CD de dados, e portanto para gravar esse tipo de CD vale todo o procedimento descrito até aqui sem tirar nem por. Mas vamos lá, digamos que você tenha em um diretório da sua máquina arquivos no formato wav e queira gravar um CD de áudio com eles, um arquivo por faixa. O comando segue: cdrecord fs=4096k -v -useinfo -dao -eject -pad -audio track1.wav ... trackN.wav Onde track1.wav, track2.wav... trackN.wav sao arquivos de som no formato wav, um para cada faixa do CD de audio. Infelizmente o comando cdrecord nao entende nativamente o formato mp3 (uma pena), de forma que os mesmos terão que ser convertidos para wav como segue: mpg123 -v -w outfile.wav infile.mp3 (8) Finalmente, se você quiser gravar a partir de faixas estraédas de outro(s) CD(s) de áudio, terá que primeiro ripar essas faixas do(s) CD(s) de origem. O ripador oficial do linux é um programa chamado cdparanoia, e sua forma mais simples de utilização é o comando que segue, que vai ripar todas as faixas de um CD de audio: cdparanoia -B Note que, para esse comando funcionar, o CD de audio a ser ripado deve estar no dispositivo apontado por /dev/cdrom. OS DEVIDOS CREDITOS Abaixo estão as referências a todos os documentos que consultei para gerar este guia. Muito mais que simplesmente citá-los, quero deixar aqui expresso meu agradecimento a todas as pessoas que, antes de mim, tiveram a iniciativa de disponibilizar seu conhecimento sobre este assunto à comunidade Linux. (1) Essa forma de uso do mkisofs eu retirei de um script chamado make_iso, ainda hoje disponibilizado pela Conectiva em: http://www.conectiva.com.br/~suporte-cl/programas/cdrwtool.tgz Note que aquele script chama tambem a flag -a, hoje obsoleta mas que o comando ainda aceita por questoes de compatibilidade. (2) A dica original de como gravar o cd ao mesmo tempo que cria a imagem eu retirei da man page do cdrecord. (3) Maiores informacoes sobre o dd podem ser encontradas em: http://www.aplinux.com.br/mostraartigo.php?artigoid=107&artigocat=2 (4) A dica original de como fazer uma copia 1:1 de um cd foi retirada do CD-Writing-HOWTO, disponivel em vários lugares, entre eles: http://www.ibiblio.org/pub/Linux/docs/HOWTO/other-formats/html_single/CD-WritingHOWTO.html#ss4.7 Ainda que um pouco desatualizado, é um documento cuja leitura e aconselhavel, pois foi a primeira referencia completa sobre gravação de CDs escrita e muito provavelmente a maioria dos outros documentos aqui referenciados se basearam nele. (5) A dica de como limpar um CDRW e fazer a gravacao num passo so eu tirei de: http://brlinux.linuxsecurity.com.br/artigos/dicas_cdrec2.htm (6) Vide o FAQ do driver, no projeto Linux UDF no sourceforge: http://sourceforge.net/projects/linux-udf/ Segue, entretanto, o texto que esclarece quanto a falta de suporte de udf gravavel no linux: As of this writing, the Linux kernel doesn't support writing to writable CDROMs of any kind - it assumes a CDROM is read only at a low level, which isn't easy to work around. Work is under way to fix this. In the meantime, when you mount a writable CDROM (either CDR or CDRW), you will get a notice saying "block device is write-protected, mounting read-only", even if you specify the "-o rw" option. (7) http://sourceforge.net/projects/packet-cd (8) http://www.linuxquestions.org/questions/history/3904 Fontes: www.aplinux.com.br e slackware-brasil.com.br Marcos Azevedo