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.978 ]

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


Criando o serviço



Antes de colocar a mão na massa, vamos entender como o script trabalha:
  1. verifica se tem cd na unidade, caso contrário o script fica buzinando o usuário, reproduzindo uma mensagem de alerta em mp3. Só após este teste, o serviço continua com as suas instruções operações.
  2. verifica se já foi efetuada alguma gravação no cd, pois na primeira gravação o script não precisa procurar a próxima posição disponível para gravação.
  3. verifica se o espaço no cd é suficiente para gravar as informações especificadas. Caso o disco tenha pouco espaço, o script fica novamente buzinando o usuário para trocar o cd (reproduzindo um mp3 que avisa estar com espaço insuficiente).
Vamos criar uma pasta /rede/script para armazenar todos os arquivos deste serviço:

# mkdir -p /rede/script
# cd /rede/script


O arquivos .mp3 você poder baixar em:

# wget http://cabelo.neti.vila.bol.com.br/cdrwcheio.mp3
# wget http://cabelo.neti.vila.bol.com.br/cdrw.mp3


Obs: você pode criar sua própria mensagem de voz em mp3!

Criando o script que verifica se existe disco na unidade de CD:

# vi temcd

cdrw=true
while  $cdrw = true; do            # Este loop termina quando for inserido um disco na unidade
   cdrecord -msinfo -s dev=0,0,0   # Verifica o que tem na unidade de CD
   if [ "$?" = "0" ];              # Existe CD?
      then                        
       cdrw=false                  # Se existir, sai do loop    
      else
         echo "sem cd"             # Se não existir, então reproduz o .mp3
         mpg123 -q -r 48000 /rede/script/cdrw.mp3
         sleep 10                  # Espera 10 segundos
   fi
done

Criando o script que verifica se o usuário retirou o CD da unidade (quando estiver cheio):

# vi semcd

cdrw=true
while  $cdrw = true; do            # Este loop termina quando for inserido um disco na unidade
   cdrecord -msinfo -s dev=0,0,0   # Verifica o que tem na unidade de CD
   if [ "$?" != "0" ];             # Tirou o CD?
      then                        
       cdrw=false                  # Se tirou, sai do loop    
      else
         echo "com cd"             # Se existir cd na unidade, então reproduz o .mp3
         mpg123 -q -r 48000 /rede/script/cdrwcheio.mp3
         sleep 10                  # Espera 10 segundos
   fi
done

Criando as regras de backup:

Em meu caso, deveria copiar um Banco de dados Interbase/Firebird e o conteúdo da pasta /rede/meusdoc.

Cada usuário terá que adaptar o script para a sua real necessidade, na verdade isto implica em trocar o path da informação a serem gravada e comentar a linha que faz o backup do banco de dados.

Se existir dificuldade em entender os script, me envie um e-mail para esclarecer as dúvidas.

Resolvi deixar 7 versões do backup no HD (uma versão para cada dia da semana). Assim se eu precisar voltar um backup de até uma semana atrás, não precisarei recorrer ao CD. Além disto, se o CD falhar, eu tenho uma semana para constatar o erro! :)

Vamos gerar 8 pastas: uma para cada dia da semana e outra para gerar a imagem a ser gravada:

# cd /rede
# mkdir iso
# cd iso
# mkdir Mon Sun Tue Wed Thu Fri Sat tmp


Cada pasta representa um dia da semana e a pasta tmp será usada para gerar o arquivo .iso (imagem).

Criando o script que gera a imagem e grava o CD:

# cd /rede/script
# vi geraiso


/rede/script/temcd                             # chama o script que verificar se existe cd na unidade
/bin/rm -rf /rede/iso/tmp/*                    # apaga o lixo da ultima gravação
HOJE=`/bin/date | /bin/cut -c 1-3`             # grava na variável o dia da semana
POSCD=`/usr/bin/cdrecord -s -msinfo dev=0,0,0` # grava na variável a próxima posição disponível do cd
echo $POSCD | /bin/grep , > /dev/null          # aqui o script verificar se será a 1a gravação no cd
if [ "$?" = "1" ]; then
   TESTE='VIRGEM'
else
   TESTE='USADO'
fi

cd /rede/iso/$HOJE                             # entra na para do dia atual
# a linha abaixo efetua o backup do banco Interbase.
/opt/interbase/bin/gbak -b -v /servdad/FARMAVIDA.GDB /rede/iso/$HOJE/bcodados.gdk -user SYSDBA -pass masterkey

/bin/cp -rp /rede/meusdoc/* /rede/iso/$HOJE    # copia os dados para o dia atual
/bin/mkdir /rede/iso/tmp/"`date +%Y%m%d`"      # cria uma pasta ano-mes-dia para gravar na raiz do cd
/bin/cp -rp /rede/iso/$HOJE/* /rede/iso/tmp/"`date +%Y%m%d`"   # copia novamente os dados para tmp
if [ $TESTE = 'VIRGEM' ];  then                # se for a primeira gravação, gera um imagem normal
#  echo "Primeira Trilha"
   /usr/bin/mkisofs -o /rede/iso/data.iso -JrT /rede/iso/tmp
else
#  echo "Segunda Trilha"                       # gera uma imagem informando a próxima posição livre
   /usr/bin/mkisofs -o /rede/iso/data.iso -JrT -C $POSCD -M /dev/cdrom /rede/iso/tmp
fi
/bin/rm -rf /rede/iso/tmp/"`date +%Y%m%d`"     # apaga o lixo
# finalmente grava o cd.
/usr/bin/cdrecord dev=0,0,0 -v speed=8 -eject -multi -data /rede/iso/data.iso
if [ "$?" != "0" ]; then                       # se o disco estiver cheio
    /rede/script/semcd                         # ficar buzinado até que o cd seja trocado
    /rede/script/geraiso                       # começa tudo de novo.
fi

Não vamos esquecer de dar o direito de execução nos arquivos:

# chmod 770 *

Adicionando o script no crontab:

# vi /etc/crontab

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
# 01 * * * * root run-parts /etc/cron.hourly
# 02 4 * * * root run-parts /etc/cron.daily
# 22 4 * * 0 root run-parts /etc/cron.weekly
# 42 4 1 * * root run-parts /etc/cron.monthly

10 19 * * * root /rede/script/geraiso %

Tentei ser o mais claro possível. É claro que podemos aprimorar muito estes scripts, porém os mesmos estão funcionando.

Qualquer sugestão, favor me envie um e-mail para que eu também possa incrementar as melhorias em meus servidores.

Página anterior    

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

Dia: O Editor de diagrama (Microsoft Visio) para Linux

LINCE - A biblioteca de visão artificial open source

FreePascal + Lazarus: Desenvolvedores em Delphi podem começar a migrar para o Linux!

Xtraceroute: O traceroute tridimensional

Compilador Clipper open-source, compile sem problemas os sistemas .PRG no Linux!

Leitura recomendada

Pequena solução para backup em redes mistas

Clonando HDs pela rede com UDP-CAST (parte 2)

Instalando Redmine 2.x no Debian Wheezy com Apache Passenger

TerminatorX: Linux nas discotecas para os DJs!

Virtualização com Proxmox VE

  
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