Backup med ZFS som lagring (linux)

Skript for kopi av ekstern server, med versjonskontroll og lagring til tredjepart-sted.

Hensikten er å ha en oppdatert kopi av ekstern server lokalt for raskt å kunne kjøre “restore” av alt fra enkeltfiler til større mengder data, men da med “snapshots” som gir muligheten for versjonskontroll.

For å kjøre dette trenger man å installere zfs og rsync(server og klient), fordel å ha opprettet en “authorized_keys” fra backupserveren på klientserveren for å unngå bruk av passord. Samt opprette en “nøkkel”(hva som helst av data) som brukes mht kryptering (vi vil ikke at om noen får tak i eksterne kopien, at de også får tak i dataene!).

 

zfs-mappe som brukt (zfs create ..)

root@bkup:~# zfs list
NAME                                USED  AVAIL  REFER  MOUNTPOINT
z                                  42.9G  51.1G   256K  /z
z/servernavn.no                    2.32G  51.1G  2.32G  /servernavn.no

bkup.exclude (eksempel)

/z
/dev
/proc
/tmp
/nfs
/sys
/run
/var/lib/amavis/virusmails
/var/backup
/var/spool/squid
/var/www/clients/client2/web2/tmp
/var/www/clients/client2/web2/web/var/cache
*.bak
*.rar
*.zip
*.exe
swap.dsk
disk*.zfs

bkup_servernavn.no (hent med rsync)

NAVN=servernavn.no
rsync=/usr/bin/rsync
zfs=/sbin/zfs

if [ "`cat /root/.bkup_state`" == "1" ]
  then echo "BACKUP IS RUNNING FROM BEFORE !" ; exit 1;
  fi

echo "1" >/root/.bkup_state

$rsync \
  --progress --stats --compress --recursive --times --perms --links --delete \
  --checksum --exclude-from '/root/bkup.exclude' \
  $NAVN:/* /z/$NAVN/ \
   |grep -v "skipping non-regular"

echo "";
dato=$(date +%Y%m%d%H%M%S) ;echo -n z/$NAVN@$dato
$zfs snapshot z/$NAVN@$dato ;echo "  - snap done"
echo "";

echo "0" >/root/.bkup_state

zfs_send_nas (opprett ekstern kopi)

root@bkup:~# cat zfs_send_nas
clear

echo
echo
echo -n "Sleeping for 1sec "; for i in $(seq 1 9); do echo -n "."; sleep 0.1; done ;echo "done!"
echo

dato=$(date +%Y%m%d%H%M%S)

if [ "$1" == "" ] ;then echo "Hay, you gotta search for something.." ;exit ;fi

echo
echo "Searching for: $1"
echo "Found the following:"; for NAVN in $(ls /z |grep -v old |grep $1 |head -1 ); do echo $NAVN; done
echo "Mounting /nas" ;mount /nas
echo "Now starting...... date of snapshot: $dato";
echo

for NAVN in $(ls /z |grep -v backup |grep -v old |grep $1 |head -1 ); do
  zfs snapshot z/$NAVN@$dato ;echo Snapshot of $NAVN done, now starting snap to gzip at /nas/..
  mkdir /nas/$NAVN@$dato
  zfs send z/$NAVN@$dato |gzip |openssl enc -aes-256-cbc -salt -pass file:/root/key.bin |split -a 5 -d -b 100m  - /nas/$NAVN@$dato/$NAVN@$dato.enc
done

echo
echo "Unmounting /nas" ;umount /nas
echo "......DONE:)"
echo

root@bkup:~# cat zfs_send_nas_restore
clear
echo
echo
echo "-----------------------------------------------------"
echo "RESTORE FROM BACKUP/NAS BACK TO BKUP -SERVER !"
echo "---------------------------------------"
echo
echo

#echo -n "Sleeping for 1sec "; for i in $(seq 1 9); do echo -n "."; sleep 0.1; done ;echo "done!"
echo


echo "Mounting /nas" ;mount /nas ;echo


ls -lh /nas/ |grep \@ ;echo
echo -n "Select backup to restore: "; read torestore ;echo

if [ "$torestore" == "" ] ;then echo "exiting.." ;umount /nas ;exit ;fi


torestorename="`echo $torestore |tr \@ \_`"
echo "Restoring to: z/$torestorename"

time cat /nas/$torestore/*enc* |openssl aes-256-cbc -d -kfile /root/key.bin |gunzip |zfs recv z/$torestorename


echo
echo "Unmounting /nas" ;umount /nas
echo "......DONE:)"

zfs_send_nas_restore (hente fra “nas”)

clear
echo
echo
echo "-----------------------------------------------------"
echo "RESTORE FROM BACKUP/NAS BACK TO BKUP -SERVER !"
echo "---------------------------------------"
echo
echo

#echo -n "Sleeping for 1sec "; for i in $(seq 1 9); do echo -n "."; sleep 0.1; done ;echo "done!"
echo

echo "Mounting /nas" ;mount /nas ;echo

ls -lh /nas/ |grep \@ ;echo
echo -n "Select backup to restore: "; read torestore ;echo

if [ "$torestore" == "" ] ;then echo "exiting.." ;umount /nas ;exit ;fi

torestorename="`echo $torestore |tr \@ \_`"
echo "Restoring to: z/$torestorename"

time cat /nas/$torestore/*enc* |openssl aes-256-cbc -d -kfile /root/key.bin |gunzip |zfs recv z/$torestorename


echo
echo "Unmounting /nas" ;umount /nas
echo "......DONE:)"

zfs_destroy (rense snapshots)

if [ "$1" == "" ] ;then echo no input ;exit ;fi

for f in $(zfs list -t snapshot -o name |grep $1 ) ;do echo $f ;zfs destroy $f ;done