summarylogtreecommitdiffstats
path: root/dattobd_create_filesystem_snapshot
diff options
context:
space:
mode:
authork0n24d2016-06-20 16:57:19 +0200
committerk0n24d2016-06-20 16:57:19 +0200
commit9f97eab5feb840f1a6c6aa77d5ca28578119ae4b (patch)
treea84340982b0effcc65cbed792edbc04a354c45cc /dattobd_create_filesystem_snapshot
downloadaur-9f97eab5feb840f1a6c6aa77d5ca28578119ae4b.tar.gz
Initial version
Diffstat (limited to 'dattobd_create_filesystem_snapshot')
-rw-r--r--dattobd_create_filesystem_snapshot87
1 files changed, 87 insertions, 0 deletions
diff --git a/dattobd_create_filesystem_snapshot b/dattobd_create_filesystem_snapshot
new file mode 100644
index 000000000000..c4faa3612ddf
--- /dev/null
+++ b/dattobd_create_filesystem_snapshot
@@ -0,0 +1,87 @@
+#!/bin/sh
+
+set -e
+
+mkdir -p /mnt/urbackup_snaps
+
+SNAP_ID=$1
+SNAP_MOUNTPOINT="$2"
+SNAP_DEST=/mnt/urbackup_snaps/$SNAP_ID
+
+DEVICE=$(df -T -P | egrep " ${SNAP_MOUNTPOINT}\$" | head -n 1 | tr -s " " | cut -d" " -f1)
+TYPE=$(df -T -P | egrep " ${SNAP_MOUNTPOINT}\$" | head -n 1 | tr -s " " | cut -d" " -f2)
+
+if [ "x$DEVICE" = "x" ]
+then
+ echo "Cannot get device for filesystem $SNAP_MOUNTPOINT"
+ exit 1
+fi
+
+echo "Snapshotting device $DEVICE via dattobd..."
+
+NUM=0
+
+while [ -e "/dev/datto$NUM" ]
+do
+ NUM=`expr $NUM + 1`
+done
+
+if ! modprobe dattobd
+then
+ echo "Dattobd kernel module not available"
+ exit 1
+fi
+
+echo "Using /dev/datto$NUM..."
+
+sync
+
+dbdctl setup-snapshot "$DEVICE" "$SNAP_MOUNTPOINT/.datto_$SNAP_ID" $NUM
+
+echo $NUM > ${SNAP_DEST}-num
+
+DEV_SIZE=`blockdev --getsize /dev/datto$NUM`
+
+truncate -s100M $SNAP_MOUNTPOINT/.overlay_$SNAP_ID
+
+LODEV=`losetup -f`
+
+if [ "x$LODEV" = x ]
+then
+ rm "${SNAP_DEST}-num"
+ rm $SNAP_MOUNTPOINT/.overlay_$SNAP_ID
+ dbdctl destroy $NUM
+ exit 1
+fi
+
+
+losetup $LODEV $SNAP_MOUNTPOINT/.overlay_$SNAP_ID
+
+echo "0 $DEV_SIZE snapshot /dev/datto$NUM $LODEV N 8" | dmsetup create "wsnap-$SNAP_ID"
+
+echo "Mounting /dev/mapper/wsnap-$SNAP_ID..."
+
+mkdir -p $SNAP_DEST
+
+MOUNTOPTS="ro"
+
+if [ $TYPE = "xfs" ]
+then
+ MOUNTOPTS="ro,nouuid"
+fi
+
+if ! mount -o $MOUNTOPTS /dev/mapper/wsnap-$SNAP_ID $SNAP_DEST
+then
+ echo "Mounting filesystem failed"
+ rmdir "$SNAP_DEST"
+ rm "${SNAP_DEST}-num"
+ dmsetup remove "wsnap-$SNAP_ID"
+ losetup -d $LODEV
+ rm $SNAP_MOUNTPOINT/.overlay_$SNAP_ID
+ dbdctl destroy $NUM
+ exit 1
+fi
+
+echo "SNAPSHOT=$SNAP_DEST"
+
+exit 0 \ No newline at end of file