Tips en Trucs 2017

Btrfs partitie back-uppen met rsync

Rechtzetting: de wekelijkse overbelasting van mijn schijf was niet te wijten aan Btrfs snapshots, maar aan de trim opdracht die elke week wordt uitgevoerd.

OpenSUSE werkt al lang standaard met het btrfs bestandssysteem voor de systeempartitie. Dit moderne bestandssysteem heeft vele voordelen, maar ook wel een paar zaken waarmee je moet leren leven. Maar zoals steeds kan je de scherpe kantjes wat afronden om de voordelen van het btrfs bestandssysteem ten volle te benutten, zonder opgescheept te zitten met wat minder geslaagde functies ervan.

Btrfs kan zelfstandig back-ups maken, maar bij het maken van de back-ups wordt het bestandssysteem en dus uw harde schijf dusdanig belast, dat je nauwelijks nog kunt werken. Het is alsof je computer opeens hangt, om dan even later zijn werk terug te hervatten, en dit herhaalt zicht regelmatig. Daarenboven duurt het maken van een btrfs back-up (snapshot) verschrikkelijk lang (uren). En zolang dit duurt, werkt de computer allesbehalve vlot.

Ik maak al zeer lang dagelijkse back-ups van mijn systeem via een script gebaseerd op rsync. Rsync vergelijkt daarbij de inhoud van enkele partities met de inhoud van enkele mappen op een oude computer die dienst doet als back-up systeem.

Waarschuwing: Btrfs snapshots zijn wel degelijk een prachtige manier om uw systeem werkende te houden, en dit zonder extra configuratie (met dank aan het openSUSE team). Back-ups zijn nog beter. Maar een maar half werkend back-up systeem zonder Btrfs snapshots kan ernstige gevolgen hebben.

Btrfs en subvolumes

Hoewel openSUSE enkel op de systeempartitie btrfs gebruikt, lijkt het voor het systeem alsof er vele kleine partities aanwezig zijn. Btrfs kan één partitie namelijk indelen in subvolumes die door het besturingssysteem elk apart aan een map gekoppeld moeten worden. Dit kunnen we als volgt nagaan:

dany@main:~> mount | grep btrfs
/dev/sdc2 on / type btrfs (rw,relatime,ssd,space_cache,subvolid=259,subvol=/@/.snapshots/1/snapshot)
/dev/sdc2 on /boot/grub2/i386-pc type btrfs (rw,relatime,ssd,space_cache,subvolid=260,subvol=/@/boot/grub2/i386-pc)
/dev/sdc2 on /var/cache type btrfs (rw,relatime,ssd,space_cache,subvolid=267,subvol=/@/var/cache)
/dev/sdc2 on /boot/grub2/x86_64-efi type btrfs (rw,relatime,ssd,space_cache,subvolid=261,subvol=/@/boot/grub2/x86_64-efi)
/dev/sdc2 on /var/lib/machines type btrfs (rw,relatime,ssd,space_cache,subvolid=270,subvol=/@/var/lib/machines)
/dev/sdc2 on /var/lib/mariadb type btrfs (rw,relatime,ssd,space_cache,subvolid=272,subvol=/@/var/lib/mariadb)
/dev/sdc2 on /var/lib/mailman type btrfs (rw,relatime,ssd,space_cache,subvolid=271,subvol=/@/var/lib/mailman)
/dev/sdc2 on /var/log type btrfs (rw,relatime,ssd,space_cache,subvolid=276,subvol=/@/var/log)
/dev/sdc2 on /var/lib/named type btrfs (rw,relatime,ssd,space_cache,subvolid=274,subvol=/@/var/lib/named)
/dev/sdc2 on /var/opt type btrfs (rw,relatime,ssd,space_cache,subvolid=277,subvol=/@/var/opt)
/dev/sdc2 on /home type btrfs (rw,relatime,ssd,space_cache,subvolid=262,subvol=/@/home)
/dev/sdc2 on /var/tmp type btrfs (rw,relatime,ssd,space_cache,subvolid=279,subvol=/@/var/tmp)
/dev/sdc2 on /.snapshots type btrfs (rw,relatime,ssd,space_cache,subvolid=258,subvol=/@/.snapshots)
/dev/sdc2 on /var/lib/libvirt/images type btrfs (rw,relatime,ssd,space_cache,subvolid=269,subvol=/@/var/lib/libvirt/images)
/dev/sdc2 on /tmp type btrfs (rw,relatime,ssd,space_cache,subvolid=265,subvol=/@/tmp)
/dev/sdc2 on /var/spool type btrfs (rw,relatime,ssd,space_cache,subvolid=278,subvol=/@/var/spool)
/dev/sdc2 on /var/lib/mysql type btrfs (rw,relatime,ssd,space_cache,subvolid=273,subvol=/@/var/lib/mysql)
/dev/sdc2 on /var/lib/pgsql type btrfs (rw,relatime,ssd,space_cache,subvolid=275,subvol=/@/var/lib/pgsql)
/dev/sdc2 on /opt type btrfs (rw,relatime,ssd,space_cache,subvolid=263,subvol=/@/opt)
/dev/sdc2 on /srv type btrfs (rw,relatime,ssd,space_cache,subvolid=264,subvol=/@/srv)
/dev/sdc2 on /var/crash type btrfs (rw,relatime,ssd,space_cache,subvolid=268,subvol=/@/var/crash)
/dev/sdc2 on /usr/local type btrfs (rw,relatime,ssd,space_cache,subvolid=266,subvol=/@/usr/local)

Deze opdracht geeft de btrfs gekoppelde mappen weer. Zo merk je dat het btrfs bestandssysteem enkel op de /dev/sdc2 partitie gebruikt wordt.

Rsync back-up server opzetten

Volledig btrfs rsync script

#!/bin/bash

snt="(C) PindaNet, Dany Pinoy, `date -r "$0" +'%d %B %Y'`"
titel="RSync backup"

# Root wachtwoord opvragen en testen
read -p "Wachtwoord: " -s Wachtwoord
echo
beheerder=`echo $Wachtwoord | su - -c 'echo $USER'`
if [ "$beheerder" != 'root' ] ; then 
  echo "Script onderbroken wegens foutief wachtwoord."
  exit
fi

# In plaats van te werken met de hostnaam van de back-up server,
# wordt gebruik gemaakt van het MAC adres van de netwerkaart in de back-up server.
# bepalen met ip -a
macadres=4c:72:b9:62:8f:c4
backupip=`/sbin/arp -an | grep $macadres | head -1 | awk '{print $2}' | sed 's/[()]//g'`
if [ ${#backupip} -eq 0 ]; then
  for i in {2..255}
  do
    ping -c 1 192.168.1.$i
    if [ $? == 0 ]; then
      backupip=`/sbin/arp -an | grep $macadres | head -1 | awk '{print $2}' | sed 's/[()]//g'`
      if [ ${#backupip} -ne 0 ]; then
	break
      fi
    fi
  done
fi

printf '\033[0m'; clear # Kleuren standaard
echo "Uitvoeren RSync backup:"
printf '=======================\n'

# Test of rsync op de back-up computer draait
rsync $backupip::
if [ $? -ne 0 ]; then
  printf '\033[1;31;40m Kon geen verbinding met backupserver opbouwen.\033[0m\n' # Rode letters
  printf '\033[1;32;40m Druk Return om door te gaan.' # Groene letters op zwarte achtergrond
  read Keypress
  exit 2
else
  # Verzamel alle aan mappen gekoppelde btrfs subvolumes in de variabele rsyncSource 
  rsyncSource=""
  for subvolume in `mount | grep btrfs | awk '{print $3}'`; do
    rsyncSource+="$subvolume "
  done
  # Voer de back-up uit
  echo $Wachtwoord | su -c "rsync -avHxh --numeric-ids --progress --delete --exclude=\"/home/dany/vmware/\" $rsyncSource $backupip::backup/phoenix/root 2>>/tmp/rsync.error | tee -a /tmp/rsync.log"
  # Geef eventuele foutmeldingen weer
  printf '\033[1;31;40mRsyncbackup gaf de volgende foutmeldingen:\033[0m\n' # Rode letters
  more /tmp/rsync.error
  printf '\033[1;32;40mDe backup is voltooid.\033[0m\n' # Groene letters op zwarte achtergrond
fi
# verwijder het logboek met foutmeldingen
echo $Wachtwoord | su -c "rm /tmp/rsync.error"

# Na het maken van de back-up kan je zaken opruimen.
# Hieronder worden in een map alle mappen die ouder zijn dan 30 dagen verwijderd
echo
echo "Opruimen VMware Drag & Drop:"
printf '============================\n'
find /home/dany/.cache/vmware/drag_and_drop/ -mindepth 1 -maxdepth 1 -type d -mtime +30 -exec rm -r {} \;
Btrfs Rsync Script

Btrfs snapshots deactiveren/activeren

Als je het bovenstaande script regelmatig uitvoert, kan je het tijdrovende, systeembelastende en dus storende snapshot systeem uitschakelen. Dit gebeurt op drie niveaus: