Raspberry PI mirroring dei dati

Come creare un sistema di mirroring dei dati tramite Raspberry PI

 

 

1. La storia

Del backup (incrementale) dei dati si è già parlato in altro articolo. Di seguito si tratterà il tema del mirroring dei dati cioè della copia dei medesimi. Questa funzione in passato veniva eseguita attraverso il comando DOS robocopy e successivamente utilizzando Cobian Backup.

Il mirroring viene ora organizzato in modo automatico attraverso il comando rsync che viene eseguito automaticamente e alternativamente su due unità di backup collegate al Raspberry (vedi articolo corrispondente).

Così facendo si avrà una copia settimanale e bisettimanale dei dati con possibilità di recuperare eventuali file erroneamente cancellati o sovrascritti.

Si tratta evidentemente di un sistema funzionale che non è assolutamente equivalente ai sistemi RAID normalmente disponibili nei sistemi professionali ma comunque in grado di garantire un adeguato margine di sicurezza.

2. Sorgente - destinazione - e composizione del comando

Di seguito vengono spiegate le parti di cui si compone il comando in modo da eseguire agevolmente e di seguito il mirroring di alcune sotto-cartelle da sorgente a destinazione.

  • zmrCMA --> parte 1 del comando: "rsync -r -v --progress --delete -u --modify-window=1 "
  • zmrCML --> parte 2 del comando: " --log-file="
  • mntPnt --> punto di mount dei dischi;
  • souDir --> nome della cartella di cui si creerà la copia di mirror;
  • dstDsk --> nome del disco destinazione;
  • dstDir --> nome della cartella all'interno della quale creare la copia di mirror;

3. Ricerca dell'unità su cui fare alternativamente il mirror:

Codice sorgente



#
# controllo e definizione alternata dell'unità su cui effettuare la sincronizzazione (mirroring)
#
if [ -f $flgFil ]
then
  dstUnt="_to_B"
  dstDsk=$dstDsk"_B"
  rm $flgFil
else
  dstUnt="_to_A"
  dstDsk=$dstDsk"_A"
  echo $dateSt$dstUnt" --> "$flgFil" File not exist" >> $flgFil
fi
dstFil="${dstDsk}${dstDir}"

 

4. Controllo montaggio disco sorgente:

  • verifica della presenza di un file nella directory sorgente
  • montaggio del disco corrispondente
  • sudo mount......

#
# controllo mount disco --> verica presenza della cartella /Sys
#
while true; do
  if [ -d "${mntPnt}${souDir}/Sys" ]
  then
    echo $linea                             >> ${logFil}
    echo $linea " Disco "$mntPnt" --> Ok"   >> ${logFil}
    echo $linea                             >> ${logFil}
    break
  else
    echo $linea                             >> ${logFil}
    echo $linea " Disco "$mntPnt" --> noOk" >> ${logFil}
    echo $linea                             >> ${logFil}
    sudo mount -t cifs //192.168.188.20/d -o user=Utente,pass=Password,uid=1000,gid=1000 /mnt/Q500_D
    sleep 30s
  fi
done

 

5. Composizione comando ed esecuzione... :

  • composizione della parte principale del comando
  • composizione successiva dei comandi per le cartelle 1 2 3
  • esecuzione comando

#
zmrCMD="${zmrCMA} ${mntPnt}${souDir}/Cartella1 ${dstDsk}${dstDir}/${souDir} ${zmrCML}${logFil}"
#
echo $linea     >> ${logFil}
echo ${zmrCMD}  >> ${logFil}
echo $linea     >> ${logFil}
eval ${zmrCMD}
zmrCMD="${zmrCMA} ${mntPnt}${souDir}/Appl_dos ${dstDsk}${dstDir}/${souDir} ${zmrCML}${logFil}"
#
echo $linea     >> ${logFil}
echo ${zmrCMD}  >> ${logFil}
echo $linea     >> ${logFil}
eval ${zmrCMD}
zmrCMD="${zmrCMA} ${mntPnt}${souDir}/Cartella2 ${dstDsk}${dstDir}/${souDir} ${zmrCML}${logFil}"
#
echo $linea     >> ${logFil}
echo ${zmrCMD}  >> ${logFil}
echo $linea     >> ${logFil}
eval ${zmrCMD}
zmrCMD="${zmrCMA} ${mntPnt}${souDir}/Cartella3 ${dstDsk}${dstDir}/${souDir} ${zmrCML}${logFil}"
#
echo $linea     >> ${logFil}
echo ${zmrCMD}  >> ${logFil}
echo $linea     >> ${logFil}
eval ${zmrCMD}
cp ${logFil} ${dstDsk}${dstDir}

6. Codice completo


#! /bin/bash
#
# 2017 04 28 ZappocoS --> versione 001
# 2017 04 30 ZappocoS --> versione 003 aggiunto montaggio disco con do while
# 2017 05 28 ZappocoS --> versione 005 rivistazione aggionamento log file
#
# comando rsync
#         
zmrCMA="rsync -r -v --progress --delete -u --modify-window=1 "
zmrCML=" --log-file="
linea="----------"
#
#La sorgente che voglio sincronizzare
#
mntPnt="/mnt/"                 #punto di mount
souDir="Q500_D"
logPnt="/home/pi/Z_LOG/"       #posizione file log
dateSt=`date +%Y%m%d_%H%M%S`   #rappresentazione completa della data
souFil="${mntPnt}${souDir}"
#
#Dove mettero' la sincronizzazione
#
dstDsk="/mnt/S4TB"
dstDir="/Mirror"
#
#Variabili contenenti la data
#
flgFil="${logPnt}${souDir}.flg"
echo $linea
echo "Creazione del mirror (zmr) by Zappoco 1.03"
echo "Data           --> ${dateSt}"
echo $linea
#
# controllo e definizione alternata dell'unità su cui effettuare la sincronizzazione (mirroring)
#
if [ -f $flgFil ]
then
  dstUnt="_to_B"
  dstDsk=$dstDsk"_B"
  rm $flgFil
else
  dstUnt="_to_A"
  dstDsk=$dstDsk"_A"
  echo $dateSt$dstUnt" --> "$flgFil" File not exist" >> $flgFil
fi
dstFil="${dstDsk}${dstDir}"
#
#File di log
#
logFil="${logPnt}${dateSt}_ZMR_${souDir}${dstUnt}.log"
#
echo $linea                                           >> ${logFil}
echo "Creazione del mirror (zmr) by Zappoco 1.03"     >> ${logFil}
echo "Data           --> ${dateSt}"                   >> ${logFil}
echo $linea                                           >> ${logFil}
echo "Sorgente       --> ${souFil}"    	              >> ${logFil}
echo "Destinazione   --> ${dstFil}"                   >> ${logFil}
echo ""                                        	      >> ${logFil}
#
# controllo mount disco --> verica presenza della cartella /Sys
#
while true; do
  if [ -d "${mntPnt}${souDir}/Sys" ]
  then
    echo $linea                             >> ${logFil}
    echo $linea " Disco "$mntPnt" --> Ok"   >> ${logFil}
    echo $linea                             >> ${logFil}
    break
  else
    echo $linea                             >> ${logFil}
    echo $linea " Disco "$mntPnt" --> noOk" >> ${logFil}
    echo $linea                             >> ${logFil}
    sudo mount -t cifs //192.168.188.20/d -o user=Utente,pass=Password,uid=1000,gid=1000 /mnt/Q500_D
    sleep 30s
  fi
done
#
zmrCMD="${zmrCMA} ${mntPnt}${souDir}/cartella1 ${dstDsk}${dstDir}/${souDir} ${zmrCML}${logFil}"
#
echo $linea     >> ${logFil}
echo ${zmrCMD}  >> ${logFil}
echo $linea     >> ${logFil}
eval ${zmrCMD}
zmrCMD="${zmrCMA} ${mntPnt}${souDir}/cartella2 ${dstDsk}${dstDir}/${souDir} ${zmrCML}${logFil}"
#
echo $linea     >> ${logFil}
echo ${zmrCMD}  >> ${logFil}
echo $linea     >> ${logFil}
eval ${zmrCMD}
zmrCMD="${zmrCMA} ${mntPnt}${souDir}/cartella3 ${dstDsk}${dstDir}/${souDir} ${zmrCML}${logFil}"
cp ${logFil} ${dstDsk}${dstDir}


ZappocoS, aprile maggio 2017