diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 16:49:04 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 16:49:04 +0000 |
commit | 16f504a9dca3fe3b70568f67b7d41241ae485288 (patch) | |
tree | c60f36ada0496ba928b7161059ba5ab1ab224f9d /src/VBox/Devices/PC/ipxe/contrib/vm/cow | |
parent | Initial commit. (diff) | |
download | virtualbox-upstream.tar.xz virtualbox-upstream.zip |
Adding upstream version 7.0.6-dfsg.upstream/7.0.6-dfsgupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/VBox/Devices/PC/ipxe/contrib/vm/cow')
-rwxr-xr-x | src/VBox/Devices/PC/ipxe/contrib/vm/cow | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/VBox/Devices/PC/ipxe/contrib/vm/cow b/src/VBox/Devices/PC/ipxe/contrib/vm/cow new file mode 100755 index 00000000..054ffdde --- /dev/null +++ b/src/VBox/Devices/PC/ipxe/contrib/vm/cow @@ -0,0 +1,49 @@ +#!/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 |