zfs/zynk
author Tomas Zeman <tzeman@volny.cz>
Mon, 23 May 2011 09:32:12 +0200
changeset 14 1de92b1b5cf3
permissions -rw-r--r--
zfs/zynk: ZFS replication script
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     1
#!/bin/sh -e
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     2
# Based on: http://www.cuddletech.com/blog/pivot/entry.php?id=989
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     3
#
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     4
# This script differs from original Zynk that uses -R and destination dataset,
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     5
# not filesystem.
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     6
#
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     7
## ZYNK: The Zuper Zimple ZFS Sync (Replication) Tool
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     8
## Form: zynk local/dataset root@remote.host destination/dataset
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     9
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    10
# Please note: The reason this is so simple is because there is no error
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    11
# checking, reporting, or cleanup.
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    12
#
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    13
# In the event that something goes wonkey, you'll manually need to fix the
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    14
# snapshots and modify or remove the run datafile which contains the most
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    15
# recent snapshot name.
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    16
#
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    17
# Furthermore, this absolutely relies on the GNU version of 'date' in order to
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    18
# get epoch time.
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    19
#
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    20
# Before using, make sure you've:
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    21
#   1. distributed your SSH key to the remote host and can ssh without
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    22
#      password;
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    23
#   2. delegated zfs rights to the user performing zynk.
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    24
#
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    25
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    26
if [ -z "$3" ]; then
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    27
        echo "Usage: zynk local/dataset remote.host destination/dataset"
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    28
        exit 1
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    29
fi
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    30
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    31
DATE=`date +%s`
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    32
if [ "$DATE" = "%s" ]; then
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    33
        echo "Must use GNU Date, please install and modify script."
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    34
        exit 2
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    35
fi
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    36
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    37
LOCALFS=$1
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    38
HOST=$2
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    39
REMOTEFS=$3
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    40
RUNF=`echo $LOCALFS-$HOST-$REMOTEFS|sed -e 's{[@/]{-{g'`
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    41
CUR=`date '+%F-%H%M'`
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    42
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    43
TYPE="Full"
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    44
SEND_OPTS=""
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    45
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    46
if [ -e $RUNF ]; then
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    47
	TYPE="Incremental"
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    48
	SEND_OPTS="-i $LOCALFS@`cat $RUNF`"
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    49
fi
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    50
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    51
echo "$TYPE started at `date`"
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    52
zfs snapshot -r $LOCALFS@$CUR
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    53
zfs send -v -R $SEND_OPTS $LOCALFS@$CUR | ssh $HOST zfs recv -F -d $REMOTEFS
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    54
echo $CUR > $RUNF
1de92b1b5cf3 zfs/zynk: ZFS replication script
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    55
echo "$TYPE complete at `date`"