|
|
1.1 ! root 1: #!/bin/sh ! 2: ! 3: set -e ! 4: ! 5: imgloop= ! 6: tmpfile= ! 7: tmploop= ! 8: dmname= ! 9: cowlink= ! 10: ! 11: function cleanup () { ! 12: set +e ! 13: [ -n "$cowlink" ] && rm $cowlink ! 14: [ -n "$dmname" ] && dmsetup remove $dmname ! 15: [ -n "$tmploop" ] && losetup -d $tmploop ! 16: [ -n "$tmpfile" ] && rm $tmpfile ! 17: [ -n "$imgloop" ] && losetup -d $imgloop ! 18: } ! 19: ! 20: trap cleanup EXIT ! 21: ! 22: imgfile=$1 ; shift ! 23: command=$1 ; shift ! 24: if [ -z "$imgfile" -o -z "$command" ] ; then ! 25: echo Syntax: $0 /path/to/image/file command [args..] ! 26: exit 1 ! 27: fi ! 28: ! 29: # Set up image loop device ! 30: x=`losetup -f` ; losetup -r $x $imgfile ; imgloop=$x ! 31: ! 32: # Create temporary file and set up temporary loop device ! 33: tmpfile=`mktemp $imgfile.XXXXXXXXXX` ! 34: truncate -r $imgfile $tmpfile ! 35: x=`losetup -f` ; losetup $x $tmpfile ; tmploop=$x ! 36: ! 37: # Create snapshot device ! 38: imgsize=`blockdev --getsz $imgloop` ! 39: x=`basename $imgfile` ; echo 0 $imgsize snapshot $imgloop $tmploop N 16 | \ ! 40: dmsetup create $x ; dmname=$x ! 41: chown --reference=$imgfile /dev/mapper/$dmname ! 42: chmod --reference=$imgfile /dev/mapper/$dmname ! 43: ! 44: # Create symlink ! 45: x=$imgfile.cow ; ln -s /dev/mapper/$dmname $x ; cowlink=$x ! 46: ! 47: # Wait until killed ! 48: echo "Created $cowlink" ! 49: $command "$@" $cowlink
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.