[Linux] [Rsync] mes backups à moi (daily && column quand y en n'a pas)

Antoine Delaporte adlp@::1
Jeu 29 Juin 21:57:36 CEST 2023


Salut tous,


Ce bazar est juste pour partager un chti truc qui je pense peut-être 
utile… ou pas.

Oui, j'ai envie de faire du bruit avec un peu de signal...


Un peu de partage a la hache d'extrait de 2 scripts, mais tout d'abord 
un peu de contexte

     - Je fais mes backup avec borg backup (j'ai remplacé mon regretté 
backuppc avec ca, car moins relou sur les hardlink, meme si...)

     - Mes backups sont faits en local (mais vraiment local :/ sur les 
memes disques :_/ )

     - Et là interviennent mes scripts : je viens tirer mes backups sûr 
un autre filer, un syno qui n'a pas toutes les commandes (column)

     - Et évidement, je pars du principe que si je pourris mon backup, 
c'est dommage que le machin rsynké  soit mort par là même...


Donc je me suis fait 2 scripts sur la machine qui tire

     - rsync_borg qui me rsync les backups tous les jours, avec chaque 
jour dans une arbo distante

         - mais évidement synchronisé sur une semaine complète ça me 
coûte cher en temps (si si, le secours est au bout d'un lien adsl)

         - et comme le secours est plus mal loti : il y a moins d'espace 
disque

         - évidement, il me fait des microstats journalières, en _début_ 
de son dump (plus facile pour lire les mails... )

         → il est hors de questions que j'alloue 7 * plus d'espaces et 
bcp plus de données à transférer

         → j'ai donc remis la main sur l'option --link-dest de rsync qui 
fera des hardlink pour les fichiers déjà présents et identiques

     - rsync_stats

         - ce script me permet de faire des statistiques sur une semaine 
de ces backups, en mode résumé

         - et évidement, même en ascii c'est bien de présenter de façon 
lisible, sauf que là, columns, je n'avais pas le droit

         * Tiens d'ailleurs il faudrait que je pousse une alerte lorsque 
les stats de 2 jours se ressemblent, ou qu'un jour a n'a plus que du 1 
liens....

         * Je m'interroge comment conserver ces stats....


Quelques retours de mes bricolages sur l'un des volumes de backup :

*rsync_borg:*

Today     Thursday
Yesterday Wednesday


real	3m38.596s
user	1m5.733s
sys	0m32.281s

1 Liens 2.0G	41
2 Liens 1.1G	8
3 Liens 2.2G	9
4 Liens 1011M	6
5 Liens 1.1G	10
6 Liens 1.2G	7
7 Liens 103G	451
New     Files   40
Deleted Files   76
All     Files   532
sent 872 bytes received 2.08G bytes 9.53M bytes/sec
total size is 118.75G speedup is 57.03
Filesystem        Type  Size  Used Avail Use% Mounted on
/dev/vg1/volume_9 ext4  709G  691G   19G  98% /volume9

receiving file list ... done
Felix/
[...]

*rsync_stat*

Monday---------32/107M -------1/494M --------5/475M --------13/2.6G -------15/2.2G -------12/2.2G -------451/103G ------
Tuesday--------33/124M -------0/0o-----------13/2.6G -------6/1011M -------15/2.2G -------12/2.2G -------451/103G ------
Wednesday------34/388M -------8/1.1G --------11/2.6G -------6/1011M -------10/1.1G -------12/2.2G -------451/103G ------
Thursday-------41/2.0G -------8/1.1G --------9/2.2G --------6/1011M -------10/1.1G -------7/1.2G --------451/103G ------
Friday---------38/1.5G -------19/1.6G -------6/1.1G --------7/1.6G --------5/1.2G --------5/998M --------451/103G ------
Saturday-------30/90M --------20/1.8G -------7/1.2G --------7/1.6G --------5/1.2G --------12/2.2G -------451/103G ------
Sunday---------32/99M --------2/745M --------9/1.2G --------7/1.6G --------15/2.2G -------12/2.2G -------451/103G ------


Alors pour le colonage, oui le nom du jour, ensuite les colonnes pour 
les fichiers avec un seul hardlink, puis 2, etc.

Et, c'est amusant que le mardi, d'ailleurs, n'ait maintenant plus aucun 
fichier a 2 hardlink (ils ont dû tous tombent à cause du mercredi puis 
jeudi dans les 1 hardlink...)

Ce phénomène est plus perceptible sur un autre de mes backups:

Monday---------42/352M -------0/0o-----------0/0o-----------10/1.5G -------10/1.4G -------6/663M --------1583/560G -----
Tuesday--------42/655M -------0/0o-----------6/691M --------6/526M --------10/1.4G -------6/663M --------1583/560G -----
Wednesday------40/128M -------9/1.3G --------6/691M --------6/526M --------6/680M --------6/663M --------1583/560G -----
Thursday-------47/923M -------9/1.3G --------6/691M --------6/526M --------6/680M --------5/629M --------1583/560G -----
Friday---------39/639M -------4/699M --------4/851M --------4/945M --------4/672M --------1/34M ---------1583/560G -----
Saturday-------38/180M -------4/699M --------4/851M --------4/945M --------4/672M --------6/663M --------1583/560G -----
Sunday---------55/564M -------0/0o-----------4/851M --------4/945M --------10/1.4G -------6/663M --------1583/560G -----

c'est d'ailleurs en pressentant ce phénomène entre autres que j'ai 
rajouté ces stats (d'ailleurs, regardez dans le retour de l'autre script 
: New Files et 1 Liens ne coïncident pas forcément non plus...)

(oui ces 2 stats sont sans le passage du sed qui remplace les - du 
padding, qu'à l'arrache je n'ai pu remplacer par des espaces)


Voici donc mes bricolages :

*rsync_borg*

#!/bin/bash

#set -x

DISRC=borg
DISRC=borg-ext00
DISRC=$1

RSSRC=loanetborg@[2a01:acdc:cafe:dead::beef]::borg/
DAYW=$(date +%A)
DAYB=$(date +%A --date '1 days ago')

NTFY_LOPA=bot@::1:oulala
NTFY_HTTP=https://ntfy.adlp.org/adlp-org_info

CIBLE="/volume9/"

RSYPA="--dry-run"
RSYPA=""

### Creation forcée des repertoires de backup de la veille et d'aujourdhui
BACKUP_DIR="${CIBLE}${DISRC}"
BACKUP_PATH="${BACKUP_DIR}/${DAYW}"
LATEST_LINK="${BACKUP_DIR}/${DAYB}"

if [ ! -d ${BACKUP_DIR} ]; then
     echo This backup destination does not exist, Sorry
     exit 1
     fi

mkdir -p ${BACKUP_PATH} ${LATEST_LINK}

echo "Today     ${DAYW}"
echo "Yesterday ${DAYB}"

### Creation du backup
/bin/curl -u ${NTFY_LOPA} ${NTFY_HTTP} -k -d "$HOSTNAME Debut rsync" -H 
"Title: Rsync ${DISRC}" -H "Tag: rsync" -s >/dev/null
cont=1

# La boucle c'est pour forcer le backup a cas ou ... mais dans le cas ou 
les stats sont mortes...
while [ ${cont} -ne 0 ]; do
     DAYN=$(date +%A)
     if [ ${DAYN} != ${DAYW} ]; then
         echo On a fait un tour d horloge on est foutu
         rm "${BACKUP_DIR}/latest"
         exit 0
         fi
     echo ""
     time rsync ${RSYPA} -av --delete-after \
         --human-readable \
         --exclude wrk.cache \
         --exclude lock.exclusive \
         -e ssh ${RSSRC}${DISRC}/ \
         --link-dest "${LATEST_LINK}/" \
         "${BACKUP_PATH}/" > /tmp/rapport-rsync-deleting.$$
     cont=$?
     if [ ${cont} -ne 0 ]; then
         echo On va devoir attendre : return code etait $cont
         sleep 300
         fi
     done
/bin/curl -u ${NTFY_LOPA} ${NTFY_HTTP} -k -d "$HOSTNAME Fin rsync" -H 
"Title: Rsync ${DISRC}" -H "Tag: rsync,+1" -s >/dev/null

### Creation du lien latest
# Alors n'allez pas croire que je ne connais pas ln -f, juste que je 
n'arrive pas a m'en servir
echo ""
rm "${BACKUP_DIR}/latest"
ln -s "${BACKUP_PATH}" "${BACKUP_DIR}/latest"
cd "${BACKUP_DIR}/latest"
for i in $(seq 7); do
     echo -e "$i Liens $(du -ch $(find -type f -links $i | tee 
/tmp/rapport-rsync-$i.$$) | grep "total$" | sed -s s/total$//g)$(wc -l 
/tmp/rapport-rsync-$i.$$)" | sed -s "s=\(.*\)/tmp.*=\1=g"
     rm /tmp/rapport-rsync-$i.$$
     done
echo "New     Files  " $(cat /tmp/rapport-rsync-deleting.$$ | while test 
-z $b ; do read a; echo $a ;echo $a | grep "^$" && b=c; done | grep -Ev 
"^(deleting |$|receiving |.*/$)" | wc -l )
echo "Deleted Files  " $(grep "^deleting " 
/tmp/rapport-rsync-deleting.$$ | wc -l)
echo "All     Files  " $(find -type f | wc -l)
cat /tmp/rapport-rsync-deleting.$$ | while read ligne; do
     if [ -n "$lili" ]; then
         echo $ligne
         fi
     if [ -z "$ligne" ]; then
         lili=go
         fi
     done
df -Th .
echo ""
cat /tmp/rapport-rsync-deleting.$$
rm /tmp/rapport-rsync-deleting.$$

*
*

*
*

*
*

*
*

*rsync_stat*

#!/bin/bash

#set -x

DISRC=borg
DISRC=borg-ext00
DISRC=$1

CIBLE="/volume9/"

RSYPA="--dry-run"
RSYPA=""

### Creation forcée des repertoires de backup de la veille et d'aujourdhui
BACKUP_DIR="${CIBLE}${DISRC}"

pad=$(printf '%0.1s' "-"{1..15})
padlength=15
cd "${BACKUP_DIR}"
for day in Monday Tuesday Wednesday Thursday Friday Saturday Sunday; do
     cd "${BACKUP_DIR}/$day"
     days=$days$day$(printf '%*.*s' 0 $((padlength - ${#day} )) "$pad")
     for i in $(seq 7); do
         size=$(du -ch $(find -type f -links $i | tee 
/tmp/rapport-rsync-$i.$$) | grep "total$" | sed -s s/total$//g)
         files=$(wc -l /tmp/rapport-rsync-$i.$$| sed -s "s=\(.*\) 
/tmp.*=\1/=g")
         test $files = "0/" && size="0o"
         days=$days$files$size$(printf '%*.*s' 0 $((padlength - 
${#files} - ${#size} )) "$pad")
         rm /tmp/rapport-rsync-$i.$$
         done
     days="$days\n"
     done
echo -e $days | sed -s "s/-/ /g"
-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: <https://strasbourg.linuxfr.org/pipermail/linux/attachments/20230629/d2537b16/attachment-0001.htm>


Plus d'informations sur la liste de diffusion linux