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!
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:
# lsmod
Se você não encontrar o módulo, adicione a seguinte linha no fim do arquivo /etc/rc.d/rc.local.
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)
# 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
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.
# 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
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
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