diff --git a/zfsync.sh b/zfsync.sh index 5147404..8bbcd9d 100755 --- a/zfsync.sh +++ b/zfsync.sh @@ -2,7 +2,7 @@ # zfsync: sync zfs pool(s) between two servers -# before first use, or in case of failure, unexpected reboot while syncing, etc.: +# in case of failure, unexpected reboot while syncing, etc.: # # launch "zfsync.sh init" # @@ -13,9 +13,6 @@ # - for i in ftp web mail; do zfs send servers/$i/home@newsync | ssh ${bro} zfs receive -vFd servers ;done # - for i in ftp web mail; do zfs rename servers/$i/home@newsync servers/$i/home@prevsync ;done # - ssh ${bro} 'for i in ftp web mail; do zfs rename servers/$i/home@newsync servers/$i/home@prevsync ;done' -# -# once init is done, call it using crontab: -# */10 * * * * root nice -n 19 /usr/local/bin/zfsync.sh >/tmp/zfsync.log bro="small" @@ -29,6 +26,7 @@ LOCKFILE=/tmp/zfsync.lock ZROOT=zdata/servers sync_success=1 +echo "`date`: ZFSync starting." if [ -e $LOCKFILE ] then echo "ERROR: $0 is already running with pid `cat $LOCKFILE`, check $LOCKFILE" @@ -46,38 +44,38 @@ if [ $1 ] then if [ $1 = "init" ] then -echo "`date`: ZFSync INIT starting." echo "wiping previous syncs" for snapshot in `zfs list -t snapshot -o name | grep -e prevsync -e newsync`; do zfs destroy $snapshot ; done ssh -q ${bro} 'for snapshot in `zfs list -t snapshot -o name | grep -e prevsync -e newsync`; do zfs destroy $snapshot ; done' echo "making full snapshots" for jail in $pools; do zfs snapshot $ZROOT/$jail/home@newsync;done echo "sending full snapshots" - for jail in $pools; do zfs send $ZROOT/$jail/home@newsync | ssh -q ${bro} 'zfs receive -vFd zdata' ;done + for jail in $pools; do zfs send $ZROOT/$jail/home@newsync | ssh -q ${bro} 'zfs receive -vFdu zdata' ;done echo "renaming them to use them as a base for diff snapshots" for jail in $pools; do zfs rename $ZROOT/$jail/home@newsync $ZROOT/$jail/home@prevsync ;done ssh -q ${bro} 'for jail in ftp mail web; do zfs rename zdata/servers/$jail/home@newsync zdata/servers/$jail/home@prevsync ;done' -echo "`date`: ZFSync INIT ending." exit $? fi fi -echo "`date`: ZFSync starting." for pool in $pools do dataset="$ZROOT/${pool}/home" echo "making new snapshot for ${pool}" zfs snapshot ${dataset}@newsync || alert echo "sending snapshot" - zfs send -i @prevsync ${dataset}@newsync | ssh -q ${bro} "zfs receive -vFd zdata" || alert + ssh -q ${bro} "zfs set readonly=on ${dataset}" || alert + sleep 2 + zfs send -i @prevsync ${dataset}@newsync | ssh -q ${bro} "zfs receive -vFdu zdata" || alert + ssh -q ${bro} "zfs set readonly=off ${dataset}" || alert echo "cleaning" zfs destroy ${dataset}@prevsync || alert zfs rename ${dataset}@newsync ${dataset}@prevsync || alert ssh -q ${bro} "zfs destroy ${dataset}@prevsync && zfs rename ${dataset}@newsync ${dataset}@prevsync" || alert done -echo "`date`: ZFSync ending." echo echo "${HOSTNAME};;${SERVICENAME};;0;OK - ZFS Sync succeeded at `date`" | ${SENDNSCA} >/dev/null rm -f $LOCKFILE +echo "`date`: ZFSync ending."