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