mirror of
https://github.com/xcat2/xNBA.git
synced 2024-11-23 01:51:58 +00:00
d052efb254
Allow for an invocation pattern such as: ./cow /path/to/image/file vblade 1 2 eth0 Signed-off-by: Michael Brown <mcb30@ipxe.org>
50 lines
1.1 KiB
Bash
Executable File
50 lines
1.1 KiB
Bash
Executable File
#!/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 ; shift
|
|
command=$1 ; shift
|
|
if [ -z "$imgfile" -o -z "$command" ] ; then
|
|
echo Syntax: $0 /path/to/image/file command [args..]
|
|
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"
|
|
$command "$@" $cowlink
|