Criando um invejável serviço de backup em CD-R com gravação multi-sessão

Com este tutorial, você criará um serviço de backup em CD-R que efetua a gravação no modo multi-sessão. Outro processo interessante neste artigo são as rotinas que avisam o usuario com uma voz gravada em mp3, se a unidade está com o CD lotado ou sem nenhum disco na unidade!

[ Hits: 33.970 ]

Por: Alessandro de Oliveira Faria (A.K.A. CABELO) em 26/08/2003 | Blog: http://assuntonerd.com.br


Instalação do CDRW e conceito de funcionamento



Neste tutorial, explico apenas a instalação e configuração de drivers CDRW ATAPI, pois os drives SCSI funcionam sem muito problemas. Para elaborar este texto, usei um gravador LG.

Em primeiro lugar, vamos verificar se a sua BIOS identificou a unidade de CD corretamente digitando o seguinte comando:

# dmesg | grep ATAPI
hdc: HL-DT-ST GCE-8520B, ATAPI CD/DVD-ROM drive
scsi0 : SCSI host adapter emulation for IDE ATAPI devices


Memorize o nome do dispositivo que o sistema atribuiu a sua unidade de cd, pois esta informação será imprescindível mais tarde. Outro detalhe importante são os pacotes (relacionados logo abaixo) que devem estarem instalados para este tutorial ser concluído com êxito.

Pacotes obrigatórios:
  • cdrecord
  • mkisofs
  • mpg123 (vou partir do princípio que a placa de som está instalada e configurada)
Agora um ponto muito importante é ter carregado os módulos dos drivers apropriados para que todo o hardware funcione corretamente. Em algumas distribuições este módulo é carregado automaticamente, já em outras não. Em todo caso verifique se o módulo ide-scsi está carregado com o comando abaixo:

# lsmod

Se você não encontrar o módulo, adicione a seguinte linha no fim do arquivo /etc/rc.d/rc.local.

/sbin/insmod ide-scsi

Agora vamos configurar os módulos para funcionarem corretamente adicionando as seguintes linhas no final do arquivo /etc/modules.conf:

alias scd0 srmod
alias scsi_hostadapter ide-scsi
options ide-cd ignore=hdc

Observe que na última linha inseri o nome do dispositivo do meu gravador LG, troque o hdc pelo nome do dispositivo atribuído pelo Linux.

Agora salve tudo e reinicie a sua máquina, e após o login, digite o seguinte comando:

# dmesg

Se estiver correto, as ultimas linhas deverão ser semelhantes com a mensagens abaixo:

SCSI subsystem driver Revision: 1.00
scsi0 : SCSI host adapter emulation for IDE ATAPI devices
  Vendor: HL-DT-ST  Model: CD-RW GCE-8520B   Rev: 1.03
  Type:   CD-ROM                             ANSI SCSI revision: 02
scsi : 0 hosts left.

Vamos testar se o seu cdrom continua funcionando corretamente. Insira um disco de dados na unidade de cd e digite:

# mount /dev/sr0 /mnt/cdrom
# cd /mnt/cdrom
# ls


Se o conteúdo do seu cd de dados aparecer corretamente, implica que tudo está indo muito bem. Agora vamos continuar, e não esqueça de desmontar o cd:

# umount /mnt/cdrom

Trocaremos o link da unidade de cd-rom para o dispositivo scsi:

# ln -sf /dev/sr0 cdrom

Agora vamos identificar o seu gravador de CD no programa cdrecord. Este programa será responsável pela gravação de um arquivo .iso em um CD-R.

# cdrecord -scanbus
Cdrecord 2.0 (i686-pc-linux-gnu) Copyright (C) 1995-2002 Jörg Schilling
Linux sg driver version: 3.1.24
Using libscg version 'schily-0.7'
scsibus0:
        0,0,0     0) 'HL-DT-ST' 'CD-RW GCE-8520B ' '1.03' Removable CD-ROM
        0,1,0     1) *
        0,2,0     2) *
        0,3,0     3) *
        0,4,0     4) *
        0,5,0     5) *
        0,6,0     6) *
        0,7,0     7) *

Os três primeiros números à esquerda separados por vírgula, são os números que representam o nosso gravador de cd para o programa cdrecord. No exemplo acima referenciamos ao CDRW através dos números 0,0,0.

Para gravar um cd no linux, existem 2 etapas. A primeira consiste em gerar uma imagem dos dados a serem gravados no cd, a segunda é a gravação da imagem no cd virgem.

Mkisofs é o programa que gera a imagem a ser gravada, sua sintaxe é:

# mkisofs -o nome_da_imagem.iso -JrT /nome/do/diretorio/

  • -o nome_da_imagem.iso: este parâmetro informa o nome do arquivo .iso, que contem a imagem a ser gravada no cd.
  • -JrT: torna os nome longos de arquivos compatível com outros sistemas operacionais.
Veja no exemplo abaixo, estou gerando um arquivo sierra.iso que se encontra na pasta gerarcd:

# mkisofs -o /rede/iso/sierra.iso -JrT /rede/public/gerarcd/
Using CAL_D000.BMP;1 for /rede/public/gerarcd/SIERRA/PRTARTST/16BIT/CAL_DN.BMP
(CAL-DN.BMP)
4.88% done, estimate finish Mon Aug 11 21:47:26 2003
9.75% done, estimate finish Mon Aug 11 21:47:36 2003
...
82.83% done, estimate finish Mon Aug 11 21:47:27 2003
87.71% done, estimate finish Mon Aug 11 21:47:23 2003
92.58% done, estimate finish Mon Aug 11 21:47:26 2003
97.45% done, estimate finish Mon Aug 11 21:47:23 2003
Total translation table size: 100031
Total rockridge attributes bytes: 158561
Total directory bytes: 262144
Path table size(bytes): 66
Max brk space used 1254a4
102624 extents written (200 Mb)


Agora só nos resta efetuarmos a gravação do CD, para isto usamos o programa cdrecord que se encarrega de gravar a imagem no disco virgem:

# cdrecord dev=0,0,0 -v speed=8 -eject -data /rede/iso/sierra.iso

Parâmetros:
  • dev=0,0,0: dispositivo indicado pelo cdrecord -scanbus
  • -v speed=8: efetua a gravação na velocidade 8x
  • -eject: abre a gaveta do cd-rom após o término da gravação
  • -data nome_do_arq: nome e caminho do arquivo .iso (imagem) a ser gravado
Com o exemplo acima, não conseguiremos gravar mais nenhuma outra informação no disco, pois o mesmo foi finalizado. Para utilizarmos o espaço livre no cd, teremo que efetuar uma gravação multi-sessão.

Não existe segredo para fazermos gravação multi-sessão. Apenas temos que verificar qual é a próxima posição disponível (espaço livre) no cd, para continuarmo a gravação apartir desde ponto.

Obtendo esta informação, precisamos avisar ao programa cdrecord que a imagem a ser gravada será multi-sessão e ao programa mkisofs qual será a sua posição em que a .iso será gravada no cd.

Vou dar um breve exemplo, para este texto não ficar muito extenso.

Gerando a primeira imagem:

# mkisofs -o nome_da_imagem.iso -JrT /nome/do/diretorio/

Gravando a primeira sessão:

# cdrecord dev=0,0,0 -v speed=8 -eject -multi -data nome_da_imagem.iso

Obtendo a próxima posição livre:

# cdrecord -msinfo dev=0,0,0
0,34093

Gerando as próximas imagens:

# mkisofs -o nome_da_imagem.iso -JrT -C 0,34093 -M /dev/cdrom /nome/do/diretorio/

Gravando as próximas seções:

# cdrecord dev=0,0,0 -v speed=8 -eject -multi -data nome_da_imagem.iso

    Próxima página

Páginas do artigo
   1. Instalação do CDRW e conceito de funcionamento
   2. Criando o serviço
Outros artigos deste autor

Transmitindo dados para relógios Timex Datalink no GNU/Linux

TerminatorX: Linux nas discotecas para os DJs!

Babytrans, o Babylon for Linux

Festival: O sintetizador de voz para Linux

Apache Cassandra NoSQL, uma tecnologia emergente

Leitura recomendada

Utilizando o X-Deep32 para rodar programas Linux em máquina Windows

Instalando programas no Linux - Completo e total

Weta Digital + Linux = Avatar - Um case de sucesso

Entendendo os codecs, os containers formats e por que o Ogg é tão bom

XFree86 - Um pouco da história deste poderoso ambiente gráfico para UNIX

  
Comentários
[1] Comentário enviado por machadodaniel em 01/10/2003 - 17:42h

Oi Alessandro, eu estou fazendo um script para uma maquina com 5 cdr e um dvd, o problema
e que nao estou conseguindo gravar + de 2 cds por vez, o que pode ser, e limitacao de hardware ou tenho como burlar isso?
Athon 2200
Mem 1024 ddr 133
hd ultra ata 133
Placa Mae ASUS
Meu script funciona via hotfolder publicado para uma rede mac e windows e so o usuario
jogar o arquivo e pronto

tenho cinco scripts desse, um para cada device:
#!/bin/sh
i=0
while [ $i = 0 ]
do
x=$(ls -1 cd1 | head -1)
if [ -z $x ] ; then
sleep 1
else
y=$(du -k cd1/$x | tail -1)
echo $y
sleep 5
z=$(du -k cd1/$x | tail -1)
echo $z
if [ "$y" = "$z" ] ; then
y=$(du -h cd1/$x | tail -1)
date > log/$x.log
echo "Arquivos do CD: $x" >> log/$x.log
echo "O tamanho do arquivo $x e de $y" >> log/$x.log
find cd1/$x/ -type f -exec du -h {} \; >> log/$x.log
find cd1/$x/*/imagens -type f -exec mv {} {}.psd \;
find cd1/$x/*/saida -type f -exec mv {} {}.tiff \;
mkhybrid -V $x -o buffer/$x.iso cd1/$x
mount /mnt/cdrom2
w=$(du -k /mnt/cdrom2/ | cut -d/ -f1 | tail -1)
echo $w
if [ $w = 4 ] ; then
echo "O cd e virgem!"
a=$(cat cd1.log)
b=$(cat cd2.log)
c=$(cat cd3.log)
d=$(cat cd4.log)
e=$(cat cd5.log)
f=$(cat dvd.log)
while [ "$a" = "1" -o "$b" = "1" -o "$c" = "1" -o "$d" = "1" -o "$e" = "1" -o "$f" = "1" ] ; do
sleep 1
a=$(cat cd1.log)
b=$(cat cd2.log)
c=$(cat cd3.log)
d=$(cat cd4.log)
e=$(cat cd5.log)
f=$(cat dvd.log)
done
echo 1 > cd1.log
cdrecord -v speed=24 dev=0,2,0 -data buffer/$x.iso
echo 0 > cd1.log
else
echo "O cd nao e virgem!"
eject /mnt/cdrom2
sleep 120
mount /mnt/cdrom2
w=$(du -k /mnt/cdrom2/ | cut -d/ -f1 | tail -1)
echo $w
if [ $w = 4 ] ; then
echo "O cd e virgem!"
a=$(cat cd1.log)
b=$(cat cd2.log)
c=$(cat cd3.log)
d=$(cat cd4.log)
e=$(cat cd5.log)
f=$(cat dvd.log)
while [ "$a" = "1" -o "$b" = "1" -o "$c" = "1" -o "$d" = "1" -o "$e" = "1" -o "$f" = "1" ] ; do
sleep 1
a=$(cat cd1.log)
b=$(cat cd2.log)
c=$(cat cd3.log)
d=$(cat cd4.log)
e=$(cat cd5.log)
f=$(cat dvd.log)
done
echo 1 > cd1.log
cdrecord -v speed=24 dev=0,2,0 -data buffer/$x.iso
echo 0 > cd1.log
else
echo "O cd nao e virgem!"
eject /mnt/cdrom2
sleep 120
mount /mnt/cdrom2
w=$(du -k /mnt/cdrom2/ | cut -d/ -f1 | tail -1)
echo $w
if [ $w = 4 ] ; then
echo "O cd e virgem!"
a=$(cat cd1.log)
b=$(cat cd2.log)
c=$(cat cd3.log)
d=$(cat cd4.log)
e=$(cat cd5.log)
f=$(cat dvd.log)
while [ "$a" = "1" -o "$b" = "1" -o "$c" = "1" -o "$d" = "1" -o "$e" = "1" -o "$f" = "1" ] ; do
sleep 1
a=$(cat cd1.log)
b=$(cat cd2.log)
c=$(cat cd3.log)
d=$(cat cd4.log)
e=$(cat cd5.log)
f=$(cat dvd.log)
done
echo 1 > cd1.log
cdrecord -v speed=24 dev=0,2,0 -data buffer/$x.iso
echo 0 > cd1.log
else
echo "O cd nao e virgem!"
mv cd1/$x rejeitados/$x
echo "Nao havia cd virgem no cd1" >> log/$x.log
dos2unix log/$x.log
chmod 666 log/$x.log
fi
fi
fi
rm -rf cd1/:2eDS_Store
rm -rf cd1/$x
rm -f buffer/$x.iso
eject /mnt/cdrom2
else
echo "O arquivo $x esta sendo copiado para o disco..."
fi
fi
done

[2] Comentário enviado por elexandroo em 02/06/2004 - 21:49h

Boa noite.
uma duvida , como fazer tudo isto em dvd+rw?

[3] Comentário enviado por F4xl em 28/07/2006 - 02:46h

Alessandro, muito bom os scripts, mas posso dar uma sugestão? Por vc, juntamente com algumas pessoas aqui do VOL que já estão pondo a sua dica em prática não juntam todos esses procedimentos e criam um programa, com uma interface simples, pode ser em phyton, sei lá... Ficaria mas prático e fácil de disceminar entre os usuários. E daria um futuro... Que acham? Vlw

[4] Comentário enviado por uiliangurjon em 03/12/2006 - 17:58h

pessoal estou usando o debian com o kernel 2.6.8 e não estou conseguindo gravar e nem ler as secões do cd, não consigo fazer a emulação scsi

[5] Comentário enviado por Credmann em 15/02/2007 - 05:28h

O ketnel 2.6 não precisa de emulação SCSI.
Use o `dev=/dev/hd[a,b,c,d]'.

[6] Comentário enviado por durvalino em 05/04/2007 - 11:49h

Cabelo vc pode me ajudar o meu drive não corresponde ao meu gravador.

------------------------------------------------------------------------------------
dmesg | grep ATAPI
[17179575.320000] hdc: HL-DT-STDVD-RAM GSA-H20N, ATAPI CD/DVD-ROM drive
[17179575.676000] hdc: ATAPI 48X DVD-ROM DVD-R-RAM CD-R/RW drive, 2048kB Cache, UDMA(33)

------------------------------------------------------------------------------------

sudo cdrecord -scanbus
Cdrecord-Clone 2.01.01a01 (i686-pc-linux-gnu) Copyright (C) 1995-2004 Joerg Schilling
NOTE: this version of cdrecord is an inofficial (modified) release of cdrecord
and thus may have bugs that are not present in the original version.
Please send bug reports and support requests to <cdrtools@packages.debian.org>.
The original author should not be bothered with problems of this version.

cdrecord: Warning: Running on Linux-2.6.15-28-386
cdrecord: There are unsettled issues with Linux-2.5 and newer.
cdrecord: If you have unexpected problems, please try Linux-2.4 or Solaris.
Linux sg driver version: 3.5.33
Using libscg version 'debian-0.8debian2'.
cdrecord: Warning: using inofficial version of libscg (debian-0.8debian2 '@(#)scsitransp.c 1.91 04/06/17 Copyright 1988,1995,2000-2004 J. Schilling').
scsibus0:
0,0,0 0) 'ATA ' 'SAMSUNG SP2504C ' 'VT10' Disk
0,1,0 1) *
0,2,0 2) *
0,3,0 3) *
0,4,0 4) *
0,5,0 5) *
0,6,0 6) *
0,7,0 7) *


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts