mirror of
https://github.com/xcat2/xcat-dep.git
synced 2024-11-22 01:21:44 +00:00
50 lines
1.1 KiB
Plaintext
50 lines
1.1 KiB
Plaintext
|
#!/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
|