Backup para CD-R/RW e DVD+/- R/RW
Publicado por Rui Costa 12/04/2006
[ Hits: 7.794 ]
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
Instalando e Integrando o SWATCH com SNORT
WallpaperID - papel de parede com IP e kernel do usuário
Scritp de Firewall com Iptables
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
VOL já não é mais como antes? (6)
É normal não gostar de KDE? (12)
E aí? O Warsaw já está funcionando no Debian 13? [RESOLVIDO] (15)
Secure boot, artigo interessante, nada técnico. (4)
copiar library para diretorio /usr/share/..... su com Falha na a... (1)









