]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[contrib] Add script to easily create copy-on-write SAN images
authorMichael Brown <mcb30@ipxe.org>
Wed, 22 Sep 2010 15:14:09 +0000 (16:14 +0100)
committerMichael Brown <mcb30@ipxe.org>
Wed, 22 Sep 2010 15:26:18 +0000 (16:26 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
contrib/vm/cow [new file with mode: 0755]

diff --git a/contrib/vm/cow b/contrib/vm/cow
new file mode 100755 (executable)
index 0000000..4abb8b8
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+set -e
+
+imgloop=
+tmpfile=
+tmploop=
+dmname=
+cowlink=
+
+function cleanup () {
+    set +e
+    [ -n "$cowlink" ] && rm $cowlink
+    [ -n "$dmname" ] && dmsetup remove $dmname
+    [ -n "$tmploop" ] && losetup -d $tmploop
+    [ -n "$tmpfile" ] && rm $tmpfile
+    [ -n "$imgloop" ] && losetup -d $imgloop
+}
+
+trap cleanup EXIT
+
+imgfile=$1
+if [ -z "$imgfile" ] ; then
+    echo Syntax: $0 /path/to/image/file
+    exit 1
+fi
+
+# Set up image loop device
+x=`losetup -f` ; losetup -r $x $imgfile ; imgloop=$x
+
+# Create temporary file and set up temporary loop device
+tmpfile=`mktemp $imgfile.XXXXXXXXXX`
+truncate -r $imgfile $tmpfile
+x=`losetup -f` ; losetup $x $tmpfile ; tmploop=$x
+
+# Create snapshot device
+imgsize=`blockdev --getsz $imgloop`
+x=`basename $imgfile` ; echo 0 $imgsize snapshot $imgloop $tmploop N 16 | \
+    dmsetup create $x ; dmname=$x
+chown --reference=$imgfile /dev/mapper/$dmname
+chmod --reference=$imgfile /dev/mapper/$dmname
+
+# Create symlink
+x=$imgfile.cow ; ln -s /dev/mapper/$dmname $x ; cowlink=$x
+
+# Wait until killed
+echo "Created $cowlink"
+while : ; do sleep 2147483647 ; done