87 lines
2.1 KiB
Bash
Executable file
87 lines
2.1 KiB
Bash
Executable file
#!/usr/bin/bash
|
|
# Rebase one level down
|
|
set -eu
|
|
|
|
show_help() {
|
|
cat << EOF >&2
|
|
Usage: $(basename "$0") [-n newname] vmname"
|
|
This script takes as input the name of the VM to rebase one level down
|
|
-n new name of the rebased image
|
|
EOF
|
|
}
|
|
|
|
while getopts ':n:' OPTION; do
|
|
case "$OPTION" in
|
|
n)
|
|
NEWNAME=$OPTARG
|
|
;;
|
|
?)
|
|
show_help
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
shift "$((OPTIND -1))"
|
|
|
|
# if less or more than one arguments supplied, display usage
|
|
if [[ $# -ne 1 ]]; then
|
|
show_help
|
|
exit 1
|
|
fi
|
|
|
|
# change to Images directory
|
|
VM_DIR="/tmp/${UID}/vm"
|
|
cd "${VM_DIR}"
|
|
|
|
VM_NAME="$1"
|
|
|
|
# check if VM-Diskimage exists
|
|
if [[ ! -f "${VM_NAME}.qcow2" ]]; then
|
|
echo "File not found ${VM_NAME}.qcow2" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# check if new VM-Diskimage exists
|
|
if [[ -v NEWNAME ]] && [[ -f "${NEWNAME}.qcow2" ]]; then
|
|
echo "New Base already exists: ${NEWNAME}.qcow2" >&2
|
|
exit 1
|
|
fi
|
|
|
|
NUMBASES=$(qemu-img info --backing-chain "${VM_NAME}.qcow2" | grep -c image)
|
|
NEWBASE=$(qemu-img info --backing-chain "${VM_NAME}.qcow2" | grep image | head -n 3 | tail -n 1 | cut -d' ' -f2)
|
|
CURRENTBASE=$(qemu-img info --backing-chain "${VM_NAME}.qcow2" | grep image | head -n 2 | tail -n 1 | cut -d' ' -f2)
|
|
|
|
if [[ ! "${NUMBASES}" -ge 3 ]]; then
|
|
echo "Image must have at least 2 backing-files" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# check if base Diskimage exists
|
|
if [[ ! -f "${NEWBASE}" ]] || [[ ! -f "${CURRENTBASE}" ]]; then
|
|
echo "Backingfiles not found ${CURRENTBASE}, ${NEWBASE}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# rebasing disk image
|
|
qemu-img rebase -f qcow2 -b "${NEWBASE}" -F qcow2 "${VM_NAME}.qcow2"
|
|
if [[ -v NEWNAME ]]; then
|
|
# copy and adapt machine definition file
|
|
CURRENTNAME="${CURRENTBASE/.qcow2/}"
|
|
if [[ -f "${CURRENTNAME}.xml" ]]; then
|
|
cp "${CURRENTNAME}.xml" "${NEWNAME}.xml"
|
|
elif [[ -f "/lmn/vm/${CURRENTNAME}.xml" ]]; then
|
|
cp "/lmn/vm/${CURRENTNAME}.xml" "${NEWNAME}.xml"
|
|
else
|
|
echo "no machine definition file found" >&2
|
|
exit 1
|
|
fi
|
|
sed -i "s/${CURRENTNAME}/${NEWNAME}/" "${NEWNAME}.xml"
|
|
NEWNAME="${NEWNAME}.qcow2"
|
|
else
|
|
rm "${CURRENTBASE}"
|
|
NEWNAME="${CURRENTBASE}"
|
|
fi
|
|
|
|
mv "${VM_NAME}.qcow2" "${NEWNAME}"
|
|
chmod a-w "${NEWNAME}"
|