Backup para CD-R/RW e DVD+/- R/RW
Publicado por Rui Costa 12/04/2006
[ Hits: 7.847 ]
Este é um script que elaborei para a criação de backups em CD's e DVD's, iniciado pelo utilizador.
Detecta automaticamente o tipo de disco inserido no gravador, se já tem dados gravados ou não e permite fazer cópias com ou sem compressão de dados.
#!/bin/sh
#Script de Backup para CD's e DVD's - Versao Novembro 2005
#Variáveis a adaptar
#origens -> Lista de directorias para fazer backup, separadas por espaços
#backups -> Correspondencia entre as directorias de backup e as directorias no CD/DVD
#device="/dev/sr0" -> Link para o dispositivo de gravação
#deviceid="0,0,0" -> ID SCSI do dispositivo de gravação
#cdr_speed=8 -> Velocidade de gravação em CD-R
#cdrw_speed=4 -> Velocidade de gravação em CD-RW
#dvdr_speed=2 -> Velocidade de gravação em DVD-R e DVD+R
#dvdrw_speed=2 -> Velocidade de gravação em DVD-R e DVD+RW
#Nestas últimas 4 variáveis é ecessário ver as especifica?es do hardware
#formato -> Formato das cópias ("normal" ou "targz")
clear
#_________________________________________________________
#Vari?eis que devemos definir para que tudo funcione bem
#---------------------------------------------------------
#Relativas ao hardware
device="/dev/dvd"
deviceid="/dev/dvd"
cdr_speed=16
cdrw_speed=8
dvdr_speed=4
dvdrw_speed=2
data=`date +%Y-%m-%d`
#Relatórios
dirrelat="/copias/relatorios"
fichlog="$dirrelat"/backup_cd_dvd_"$data".txt
#Imagem que vai ser gravada para CD/DVD
fich_imagem="/tmp/backges$data.img"
#Definição do formato da cópia - Alterar para "normal" caso não se queira cópias comprimidas
formato="targz"
if [ "$formato" = "normal" ]; then
backups="basedados=/basedados definicoes=/var/defs samba=/etc/samba apache=/etc/apache2 sysconfig=/etc/sysconfig hosts=/etc/hosts"
else
backups="backup=/tmp/backups"
fi
#Para o caso de cópias comprimidas
origens="/basedados /var/defs /etc/samba /etc/apache2 /etc/sysconfig /etc/hosts"
fichbase="backup_diario"
fichtar="/tmp/backups/$fichbase"_"$data.tar.gz"
echo " " >>$fichlog
echo " " >>$fichlog
echo "Início de Backup em $(date +%A", "%d"/"%m"/"%Y" ? "%H":"%M)" >>$fichlog
if [ "$formato" = "normal" ]; then
echo "Backup de $backups no formato $formato"
echo "Backup de $backups no formato $formato" >>$fichlog
else
echo "Backup de $origens no formato tar.gz"
echo "Backup de $origens no formato tar.gz" >>$fichlog
fi
if [ -d /tmp/backups ]; then
rm -rf /tmp/backups/* >/dev/null 2>&1
fi
if [ -f /tmp/atipcd.txt ]; then
rm -rf /tmp/atipcd.txt
fi
if [ -f /tmp/toccd.txt ]; then
rm -rf /tmp/toccd.txt
fi
if [ -f /tmp/dvdrelat ]; then
rm -rf /tmp/dvdrelat
fi
if [ -f /tmp/dvderros ]; then
rm -rf /tmp/dvderros
fi
#Vamos ver o tipo de disco inserido no gravador e o tipo de unidade
echo
echo "A verificar o tipo de disco inserido"
echo " " >>$fichlog
echo "A verificar o tipo de disco inserido" >>$fichlog
#cdrecord -debug=0 -s -eject dev=$deviceid >/dev/null 2>&1
cdrecord -debug=0 -s -eject dev=$deviceid #>/dev/null 2>&1
cdrecord -debug=0 -s -load dev=$deviceid >/dev/null 2>&1
dvd+rw-mediainfo $device >/tmp/dvdrelat 2>/tmp/dvderros
#Vamos ver se temos um gravador de CD's ou DVD's
grep "not a DVD unit" /tmp/dvderros >/dev/null 2>&1
dvdunit=$?
if [ $dvdunit -eq 0 ]; then #É um gravador de CD's
tipodisco="CD"
else
#teste=`more /tmp/dvderros|fgrep -i "mounted"|cut -d "[" -f 2|cut -d " " -f 1,2`
grep -i "no media" /tmp/dvderros >/dev/null 2>&1
naotemdisco=$?
grep -i "non-DVD" /tmp/dvderros >/dev/null 2>&1
temcd=$?
tipodvd=`grep -i "Mounted Media" /tmp/dvdrelat|cut -d "," -f 2|cut -d " " -f 2` >/dev/null 2>&1
if [ $naotemdisco -eq 0 ]; then #Não tem nada la dentro
echo " -> Por favor, insira um CD ou DVD no gravador"
echo " -> Não encontrei nenhum disco no gravador" >>$fichlog
cdrecord dev=$deviceid -eject >/dev/null 2>&1
exit
elif [ $temcd -eq 0 ]; then #Tem um CD inserido
tipodisco="CD"
echo " -> Inseriu um $tipodisco"
elif [ "$tipodvd" = "DVD-R" -o "$tipodvd" = "DVD-RW" -o "$tipodvd" = "DVD+R" -o "$tipodvd" = "DVD+RW" ]; then
tipodisco="$tipodvd"
echo " -> Inseriu um DVD do tipo $tipodisco"
echo " -> Inseriu um DVD do tipo $tipodisco" >>$fichlog
else
echo " -> Não foi possível fazer a detecção do tipo de disco"
echo " -> Mensagem de erro: $teste"
echo " -> Não foi possível fazer a detecção do tipo de disco" >>$fichlog
echo " -> Mensagem de erro: $teste" >>$fichlog
cdrecord dev=$deviceid -eject >/dev/null 2>&1
exit
fi
fi
#Se for um CD vamos verificar o tipo de CD
if [ "$tipodisco" = "CD" ]; then #Ou ?um CD ou não tem nada l?dentro
cdrecord -s debug=0 dev=$deviceid -atip >/tmp/atipcd.txt 2>/dev/null
atipcd=`more /tmp/atipcd.txt|fgrep -i "erasable"|tr -d " "|tr '[:upper:]' '[:lower:]'`
if [ -z "$atipcd" ]; then #CD não grav?el
echo " -> O CD inserido não é válido para gravação" >>$fichlog
echo " -> O CD inserido não é válido para gravação"
echo " -> Insira um CD ou DVD v?ido para gravação"
cdrecord dev=$deviceid -eject >/dev/null 2>&1
exit
elif [ "$atipcd" = "iserasable" ]; then #?um CD-RW
tipodisco="CD-RW"
echo " -> Foi encontrado um CD do tipo $tipodisco"
echo " -> Foi encontrado um CD do tipo $tipodisco" >>$fichlog
else
tipodisco="CD-R"
cdrecord -s debug=0 dev=$deviceid -toc >/tmp/toccd.txt 2>/dev/null
toccd=`more /tmp/toccd.txt|fgrep -i "first:"|tr '[:upper:]' '[:lower:]'|cut -d " " -f 1`
if [ -z "$toccd" ]; then #?um CD-R Limpo)
echo " -> Foi encontrado um CD virgem do tipo $tipodisco"
echo " -> Foi encontrado um CD virgem do tipo $tipodisco" >>$fichlog
else #?um CD-R multisess? ou j?fechado
mscd=`cdrecord -s debug=0 dev=$deviceid -msinfo|fgrep -i "0," 2>/dev/null`
if [ -z $mscd ]; then #J?fechado
echo " -> Foi encontrado um disco do tipo $tipodisco já fechado" >>$fichlog
echo " -> Não é possível gravar neste CD" >>$fichlog
echo " -> Foi encontrado um disco do tipo $tipodisco já fechado"
echo " -> Não e possível gravar neste CD"
echo " -> Insira um CD-R virgem, um CD-RW ou um DVD"
cdrecord dev=$deviceid -eject >/dev/null 2>&1
exit
else #CD-R Multisess? ainda aberto
echo " -> Foi encontrado um CD do tipo $tipodisco em multisessão" >>$fichlog
echo " -> Não é aconselhável efectuar backups em CD-R's multisessão" >>$fichlog
echo " -> Foi encontrado um CD do tipo $tipodisco em multisessão"
echo " -> Não é aconselhável efectuar backups em CD-R's multisessão"
echo " -> Insira um CD-R virgem, um CD-RW ou um DVD"
cdrecord dev=$deviceid -eject >/dev/null 2>&1
exit
fi
fi
fi
fi
echo "Suporte seleccionado: $tipodisco" >>$fichlog
#Verificar o espaçoem disco
echo " " >>$fichlog
echo "A verificar espaço necessário em disco" >>$fichlog
echo
echo "A verificar espaço necessário em disco"
freespace=`df -l --sync -BM /|fgrep -i "/dev"|tr -s " "|cut -d " " -f 4|tr -d "M"`
tamanho=`mkisofs -quiet -print-size -D -U -J -r -graft-points $origens 2>/dev/null|tr -d " "`
tamanhotargz=`echo "scale=0; $tamanho*2.048/1024*0.3"|bc -l`
tamanho=`echo "scale=0; $tamanho*2.048/1024"|bc -l`
echo " -> Espaço disponível em disco: $freespace MB"
echo " -> Dimensão em formato normal: $tamanho MB"
echo " -> Dimensão estimada em formato targz: $tamanhotargz MB"
echo " -> Espaço disponível em disco: $freespace MB" >>$fichlog
echo " -> Dimensão em formato normal: $tamanho MB" >>$fichlog
echo " -> Dimensão estimada em formato targz: $tamanhotargz MB" >>$fichlog
if [ "$formato" = "targz" ]; then
if [ $(echo "$freespace<$tamanhotargz"|bc -l) -eq 1 ]; then
echo " -> O espaço disponível pode ser insuficiente para criar os ficheiros targz"
echo " -> O espaço disponível pode ser insuficiente para criar os ficheiros targz" >>$fichlog
fi
fi
if [ "$formato" = "normal" ]; then
if [ $(echo "$freespace<300"|bc -l) -eq 1 ]; then
echo " -> O espaço disponível pode ser insuficiente para criar ficheiros temporários"
echo " -> O espaço disponível pode ser insuficiente para criar ficheiros temporários" >>$fichlog
fi
fi
#Caso se escolha cópias comprimidas
if [ $formato = "targz" ]; then
echo
echo " " >>$fichlog
if [ ! -d "/tmp/backups" ]; then
echo "A directoria /tmp/backups não existe. Vou criar."
echo "A directoria /tmp/backups não existe. Vou criar." >>$fichlog
mkdir /tmp/backups
chmod 777 /tmp/backups
fi
if [ ! -d "/tmp/backups" ]; then
echo " -> Não foi possível criar a directoria /tmp/backups"
echo " -> Tente criar a directoria manualmente e dar-lhe permissões"
echo " -> Não foi possível criar a directoria /tmp/backups. A Sair" >>$fichlog
exit
else
echo "Foi encontrada a directoria /tmp/backups."
echo "Foi encontrada a directoria /tmp/backups." >>$fichlog
fi
#Vamos criar os ficheiros comprimidos
echo
echo " " >>$fichlog
echo "A criar o backup comprimido em /tmp/backups/" >>$fichlog
echo "A criar o backup comprimido em /tmp/backups/"
echo "A criação do ficheiro poderá demorar alguns minutos"
echo " -> Aguarde um pouco, por favor"
tar cvzf $fichtar $origens >> $fichlog
#if [ $? -ne 0 ]; then
if [ ! -f "$fichtar" ]; then
echo " Não foi possível criar o ficheiro comprimido!"
echo " Houve um erro ao criar o ficheiro!"
echo " Não foi possível criar o ficheiro comprimido!" >> $fichlog
echo " Houve um erro ao criar o ficheiro!" >> $fichlog
exit
fi
echo " -> Aguarde um momento, por favor"
sleep 10
sync
sleep 5
fi
#Vamos verificar o espaço necessário
echo
echo " " >>$fichlog
echo "A calcular o espaço necessário no $tipodisco"
echo "A calcular o espaço necessário no $tipodisco" >> $fichlog
tamanho=`mkisofs -quiet -print-size -D -U -J -r -graft-points $backups 2>/dev/null`
tamanho=`echo "scale=0; $tamanho*2.048/1024"|bc -l`
echo " -> Espaço necessário: $tamanho"
echo " -> Espaço necessário: $tamanho" >> $fichlog
if [ "$tipodisco" = "CD-R" -o "$tipodisco" = "CD-RW" ]; then
if [ $(echo "$tamanho>640"|bc -l) -eq 1 ]; then
echo " -> O conteúdo poderá não caber num CD"
echo " ->Demasiado grande para um $tipodisco em formato $formato" >>$fichlog
echo "A sair"
if [ "$formato" = "normal" ]; then
echo " -> Opte por fazer cópias comprimidas ou utilizar DVD's"
exit
else
if [ -f /tmp/backups/*.tar.gz ]; then
echo " -> Opte por utilizar DVD's"
echo " -> A remover os ficheiros tar.gz"
rm -rf /tmp/backups/*.tar.gz
exit
fi
fi
fi
fi
if [ "$tipodisco" = "DVD-R" -o "$tipodisco" = "DVD-RW" -o "$tipodisco" = "DVD+R" -o "$tipodisco" = "DVD+RW" ]; then
if [ $(echo "$tamanho>=4450"|bc -l) -eq 1 ]; then
echo " -> O conteúdo poderá não caber num DVD"
echo " ->Demasiado grande para um $tipodisco em formato $formato" >>$fichlog
echo "A sair" >>$fichlog
if [ "$formato" = "normal" ]; then
echo " -> Opte por fazer cópias comprimidas"
exit
else
if [ -f /tmp/backups/*.tar.gz ]; then
echo " -> A remover os ficheiros tar.gz"
rm -rf /tmp/backups/*.tar.gz
exit
fi
fi
fi
fi
#GRAVACAO EM CD
if [ "$tipodisco" = "CD-R" -o "$tipodisco" = "CD-RW" ]; then
echo
echo " " >>$fichlog
if [ "$tipodisco" = "CD-R" ]; then
echo "A efectuar a gravação"
echo "A efectuar a gravação em $tipodisco" >>$fichlog
nice --5 mkisofs -V "backges$data" -D -U -J -r -graft-points $backups | cdrecord dev=$deviceid speed=$cdr_speed -fs=8m -driveropts=burnfree -
if [ $? -eq 0 ]; then
echo " -> Gravação terminada com sucesso"
echo "Gravação terminada com sucesso" >>$fichlog
else
echo " -> Podem ter ocorrido erros na gravação"
echo "Podem ter ocorrido erros na gravação" >>$fichlog
fi
elif [ "$tipodisco" = "CD-RW" ]; then
echo "A limpar o CD"
echo "A limpar o CD" >>$fichlog
cdrecord dev=$deviceid speed=$cdrw_speed blank=fast
echo "A efectuar a gravação"
echo "A efectuar a gravação em $tipodisco" >>$fichlog
nice --5 mkisofs -V "backges$data" -D -U -J -r -graft-points $backups | cdrecord dev=$deviceid speed=$cdrw_speed -fs=8m -driveropts=burnfree -
if [ $? -eq 0 ]; then
echo " -> Gravação terminada com sucesso"
echo " -> Gravação terminada com sucesso" >>$fichlog
else
echo " -> Podem ter ocorrido erros na gravação"
echo " -> Podem ter ocorrido erros na gravação" >>$fichlog
fi
fi
fi #Fim da sec?o CD
#GRAVACAO EM DVD-R/-RW
if [ "$tipodisco" = "DVD-RW" -o "$tipodisco" = "DVD-R" ]; then
echo
echo " " >>$fichlog
if [ "$tipodisco" = "DVD-R" ]; then
echo "A efectuar a gravação em DVD-R"
echo "A efectuar a gravação em DVD-R" >>$fichlog
echo " -> Não utilize o servidor enquanto estiver em gravação"
nice --5 growisofs -dvd-compat -speed=$dvdr_speed -Z $device -DUJrT -graft-points $backups 2>/dev/null
if [ $? -eq 0 ]; then
echo " -> Gravação terminada com sucesso"
echo " -> Gravação terminada com sucesso" >>$fichlog
else
echo " -> Podem ter ocorrido erros na gravação"
echo " -> Podem ter ocorrido erros na gravação" >>$fichlog
fi
elif [ "$tipodisco" = "DVD-RW" ]; then
formdvd=`dvd+rw-mediainfo $device|fgrep -i "Mounted Media"|cut -d "W" -f 2|tr -d " "|tr '[:upper:]' '[:lower:]'`
if [ ! "$formdvd" = "restrictedoverwrite" ]; then
echo " -> Primeira utiliza?o do DVD-RW, a formatar"
echo " -> Primeira utiliza?o do DVD-RW, a formatar" >>$fichlog
echo " -> Este processo demorar?entre 30 a 60 minutos"
dvd+rw-format -force=full $device
fi
formdvd=`dvd+rw-mediainfo $device|fgrep -i "Mounted Media"|cut -d "W" -f 2|tr -d " "|tr '[:upper:]' '[:lower:]'`
if [ "$formdvd" = "restrictedoverwrite" ]; then
echo " -> A efectuar a gravação do DVD-RW"
echo " -> A efectuar a gravação do DVD-RW" >>$fichlog
echo " -> Não utilize o servidor enquanto estiver em gravação"
nice --5 growisofs -dvd-compat -speed=$dvdrw_speed -Z $device -DUJrT -graft-points $backups 2>/dev/null
if [ $? -eq 0 ]; then
echo " -> Gravação terminada com sucesso"
echo " -> Gravação terminada com sucesso" >>$fichlog
else
echo " -> Podem ter ocorrido erros na gravação"
echo " -> Podem ter ocorrido erros na gravação" >>$fichlog
fi
else
echo " -> Não foi possível formatar devidamente o $tipodisco"
echo " -> Utilize outro DVD"
echo " -> A formatação do $tipodisco correu mal" >>$fichlog
exit
fi
fi
fi #Fim da sec?o DVD-
#GRAVACAO EM DVD+R/+RW
if [ "$tipodisco" = "DVD+RW" -o "$tipodisco" = "DVD+R" ]; then
echo
echo " " >>$fichlog
echo "A efectuar a gravação"
echo "A efectuar a gravação em $tipodisco" >>$fichlog
echo " -> Não utilize o servidor enquanto estiver em gravação"
if [ "$tipodisco" = "DVD+R" ]; then
nice --5 growisofs -dvd-compat -speed=$dvdr_speed -Z $device -DUJrT -graft-points $backups 2>/dev/null
elif [ "$tipodisco" = "DVD+RW" ]; then
nice --5 growisofs -dvd-compat -speed=$dvdrw_speed -Z $device -DUJrT -graft-points $backups 2>/dev/null
fi
if [ $? -eq 0 ]; then
echo " -> Gravação terminada com sucesso"
echo " -> Gravação terminada com sucesso" >>$fichlog
else
echo " -> Podem ter ocorrido erros na gravação"
echo " -> Podem ter ocorrido erros na gravação" >>$fichlog
fi
fi #Fim da sec?o DVD+
#ELIMINAR FICHEIROS DESNECESSÁRIOS
echo
echo " " >>$fichlog
if [ "$formato" = "targz" ]; then
if [ -d /tmp/backups ]; then
echo " -> A remover os ficheiros tar.gz"
echo " -> A remover os ficheiros tar.gz" >>$fichlog
rm -rf /tmp/backups/*.tar.gz >/dev/null 2>&1
fi
fi
if [ -f /tmp/atipcd.txt ]; then
rm -rf /tmp/atipcd.txt
fi
if [ -f /tmp/toccd.txt ]; then
rm -rf /tmp/toccd.txt
fi
echo "Fim de Backup em $(date +%A", "%d"/"%m"/"%Y" ? "%H":"%M)" >>$fichlog
Configuraçao da rede wireless no slackware
Bloquear Facebook no Linux Educacional 3
zsh: Validar IPv4 utilizando PCRE
Criação de Usuarios , Grupo e instalação do servidor de arquivos samba
Nenhum comentário foi encontrado.
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
[Resolvido] VirtualBox can't enable the AMD-V extension
Como verificar a saúde dos discos no Linux
Como instalar , particionar, formatar e montar um HD adicional no Linux?
Como automatizar sua instalação do Ubuntu para desenvolvimento de software.
Fiz uma pergunta no fórum mas não consigo localizar (13)
Quais os códigos mais dificeis que vcs sabem fazer? (2)
Não consigo instalar distro antiga no virtualbox nem direto no hd (7)
Servidor Ubuntu 24.04 HD 500 não tenho espaço na \home\adminis... [RES... (8)
Dá para criar um bom jogo usando a linguagem de programação C? [RESOLV... (1)









