Exemplo de script para Backup Raspberry ou outra qualquer distro Linux

1. Exemplo de script para Backup Raspberry ou outra qualquer distro Linux

Cesar Moura
cmoura

(usa Outra)

Enviado em 01/06/2023 - 09:13h

Conforme o tempo foi passando, meu Linux (Raspberry) foi aumentando o numero de atividades, (Servidor DLNA, DNS Interno, Servidor VPN, Zabbix para monitorar ISP entre outros) e o receio de ter algum problema e perder tudo o que eu havia configurado aumentou também. Então criei um script para automatizar o backup e ter uma forma fácil de restaurar tudo de forma rápida e fácil. Após dias de pesquisa e testes cheguei a um nível adequado de funcionalidade e resolvi compartilhar com a comunidade, pois pode ser que outros usuários possam estar passando pela mesma necessidade.}
Para desenvolvimento do script, parti das seguintes premissas:
Possuir um log detalhado da execução, tratando e registrando alguns tipos de falhas comuns e possíveis.
Limpar os logs para nao ter um excessivo volume de registros.
Executar backup mensal e manter as ultimas 4 execuções mensais.
Executar backup semanal e manter as ultimas 4 execuções semanais.
Executar backup diário e manter as ultimas 6 execuções diárias.
Remover os backups antigos fora dos padrões acima estipulados.
Não remover backups antigos se não conseguir rodar na rotina gerando backups novos.
Salvar dados da execução em banco SQL para consulta e relatórios.
Não abordarei a criação do banco de dados e parto do principio que você criará essa parte.
Note que nesse script ha alguns paths informados, voce deve alterá-los conforme a sua estrutura.

*** Atenção: No caso de necessitar o restore, pode rodar por cima da distro atual, mesma que rodou o backup e restaurar por cima, o acesso a máquina será perdido após algum tempo por que o script estará copiando dados por cima da dos dados atuais. No caso de um disaster recovery completo, é necessário instalar a mesma distro e release que o backup foi gerado. Exemplo, se voce tinha a Debian versao xyz quando rodava o backup, é necessário instalar a mesma Debian XYZ e rodar os comandos que existem no final do script. É necessario também ter acesso aos pontos de montagem onde estão salvos os arquivos ex.: mnt/disco1/restore etc.
Espero que tenha ajudado de alguma forma.


===============================================================================================

#!/usr/bin/env bash
clear
#--DB Variables --------------------------------------------------------------------------------------------------------------------
DB_USER=SEU_USER_AQUI;
DB_PASSWD=SEU_PASSWORD_AQUI;
DB_NAME=backup_raspbian;
TABLE=job_bkp;
DBHOST=rasp1
#--Scrit Global Variables ----------------------------------------------------------------------------------------------------------
host=$(hostname)
part1=mmcblk0p1
part2=mmcblk0p2
weekday=$(date +"%u")
today=$(date +"%d")
logfile=" "
d=$(date +"%y.%m.%d-%I:%M%p")
workpath=/mnt/wd1tb/bkp.raspbian
logpath=/home/pi/script/log.bkprasp
echo Checking environemnt info...
echo Full Date...: "$(date +"%Y.%m.%d-%I:%M:%S%p")"
echo Weekday.....: "$(date +"%A")"
echo Weekday.....: $weekday
echo Today is....: $today
#--Funcion Section ------------------------------------------------------------------------------------------------------------------
function func_bkp () {
bkptype=$1
retain=$2
logfile=$logpath/$bkptype.rasp_"$(date +"%Y.%m.%d-%I:%M%p").log"
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - Starting Raspberry PI $bkptype Image Backup Routine... | tee -a $logfile
for partition in mmcblk0p1 mmcblk0p2
do
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - Starting backup for partition $partition... | tee -a $logfile
filename=$partition"_"$bkptype"_$(date +"%Y.%m.%d-%I:%M%p").img.gz"
dt_begin="$(date +"%Y.%m.%d-%I:%M:%S%p")"
sudo dd bs=4M if=/dev/$partition | sudo gzip > $workpath/$filename | tee -a $logfile
file=$workpath/$filename
if [ ! -f "$file" ]; then
echo "[ ]" - "ERROR!!!! $file does not exist."
echo "[ ]" - "The backup file was NOT created."
dt_end=Error
file_s=0.0
filename=NULL
else
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - Created the file $workpath/$partition_$filename | tee -a $logfile
echo "[ ]" - "$filename successfully created, working..."
dt_end="$(date +"%Y.%m.%d-%I:%M:%S%p")"
file=$(ls -l $workpath/$partition_$filename | awk '{print $5}')
file_s=$(bc <<< "scale=2; $file.$partition_s/1024/1024")
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - Size: $file_s MB | tee -a $logfile
fi
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - Ending backup for partition $partition... | tee -a $logfile
mysql --host=$DBHOST --user=$DB_USER --password=$DB_PASSWD $DB_NAME <<EOF
INSERT INTO $TABLE (\`job_id\`, \`host_name\`, \`type_bkp\`, \`dt_begin\`, \`dt_end\`, \`total_time\`, \`file_name\`, \`file_size\`, \`part\`) VALUES (NULL, "$host", "$bkptype", "$dt_begin", "$dt_end", "NULL", "$filename", "$file_s" ,"$partition");
EOF
done
}
#--Main Section Function Call --------------------------------------------------------------------------------------------------------
if [ "$today" -eq 1 ];
then
func_bkp monthly 8
dayr=140
retain=8
logr=140
else
if [ "$weekday" -eq 6 ];
then
func_bkp weekly 8
dayr=26
retain=8
logr=60
else
func_bkp daily 12
dayr=5
retain=12
logr=30
fi
fi
#--Legacy files and logs cleaning --------------------------------------------------------------------------------------------------
count=$(find $workpath/mmcblk0p?_$bkptype* -type f | wc -l)
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - "There are "$count" backup files retained. (only "$bkptype")." | tee -a $logfile
if [[ "$count" -gt $retain ]];
then
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - The number of legacy files is bigger than $retain, creating array of files... | tee -a $logfile
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - Listing archived files... | tee -a $logfile
declare -A count
array=($(ls -ltrh $workpath/mmcblk0p?_$bkptype* | awk -F/ '{print $NF}'))
for filename in ${array[*]}
{
i=$((i+1))
echo "[ ]" - $i. $filename | tee -a $logfile
fileName=${filename[@]:9}
}
i=0
echo "[ ]" - Array Size: ${#array[@]} | tee -a $logfile
i=0;
i=$((i))
end=$(( "${#array[@]}"-"$retain"))
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - Initial Array pointer position: $i | tee -a $logfile
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - Target position end: $end | tee -a $logfile
sum=0
sumGB=0
while [ "$i" -lt "$end" ];
do
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - Array Index: $i | tee -a $logfile
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - Checking if the file ${array[$i]} is older than $dayr days. | tee -a $logfile
if [[ $(find $workpath/${array[$i]} -mtime +$dayr -print) ]];
then
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - Older, ready to delete. | tee -a $logfile
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - Deleting the file...: ${array[$i]} | tee -a $logfile
outputsz=($(wc -c $workpath/${array[$i]} | awk '{print $1}'))
size=$(($outputsz / 1024 / 1024))
output=$(sudo rm -v $workpath/${array[$i]})
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - $output | tee -a $logfile
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - Deallocated $size MB of disk space. | tee -a $logfile
i=$((i+1))
sum=$((sum+size))
else
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - NOT older, skipping it...
i=$((i+1))
fi
done
sumGB=$(bc <<< "scale=2; $sum / 1024")
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - Total of free space allocated: $sumGB GB. | tee -a $logfile
else
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - There are no files to be deleted. Skipping... | tee -a $logfile
fi
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - Cleaning log files older than $logr days... | tee -a $logfile
sudo find $logpath/$bkptype*.log -mtime +$logr -exec rm -v {} \; | tee -a $logfile
echo ["$(date +"%Y.%m.%d-%I:%M:%S%p")"] - End of Script. | tee -a $logfile
#----------------------------------------------------------------------------------------------------------------------------------
#end of scritp
#restore:
#sudo gzip -dc /mnt/wd1tb/bkp.raspbian/default.mmcblk0p1_backup_2022.10.25-11:10AM.img.gz | dd bs=4M of=/dev/mmcblk0p1
#sudo gzip -dc /mnt/wd1tb/bkp.raspbian/default.mmcblk0p2_backup_2022.10.25-11:10AM.img.gz | dd bs=4M of=/dev/mmcblk0p2





  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts