-
Alberto LIVIO BECCARIA authored
(it did not find the differencing disk image and was not able to discard it automatically).
Alberto LIVIO BECCARIA authored(it did not find the differencing disk image and was not able to discard it automatically).
vm-start 12.42 KiB
#!/bin/bash
#############################################
# VirtualBox VM Scripts - vm-start
# by ulisse aka A. Livio Beccaria
#
# vm-start starts a VM :)
#############################################
APP_NAME="vm-start - VirtualBox VM Scripts"
VERSION="18.5.8"
AUTHOR="DiSIT"
# source folder
SRC_DIR="$(dirname $(readlink -f $0))"
#include common code
. "${SRC_DIR}/settings/common"
###############################################################################
# Title
##############
title () {
echo -e "$APP_NAME by $AUTHOR"
echo "v.$VERSION"
echo
}
###############################################################################
###############################################################################
# Debug info
##################
debug() {
if [[ ${DEBUG} == 1 ]]; then
echo "Debug info:"
echo -e "\tvm_id = $VM_ID"
echo -e "\tfullscreen = $FULLSCREEN"
echo -e "\tno-init = $NO_INIT"
echo -e "\tno-run = $NO_RUN"
echo -e "\tdiscard-state = $DISCARD_STATE"
echo -e "\thd-autoreset = $HD_AUTORESET"
echo
fi
}
###############################################################################
###############################################################################
# Usage
#######
usage () {
if [[ "$@" != "" ]]; then
echo >&2 "$@"
echo
fi
echo "Usage: $0 <vm_id | vm_name> [--gui | --fullscreen] [--no-init] [--no-run] [--discard-state] [--debug] [--hd-autoreset=on|off]"
echo
print_vm_list
echo
exit 1
}
###############################################################################
###############################################################################
# vbox_remove_media
###################
vbox_remove_media () {
if [[ "${DISK_IMAGE_1}" != "" ]]; then
echo "Removing disk 1..."
vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port 1 --device 0 --medium none
sleep 1
TMP_DIFF=`vboxmanage showhdinfo "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_1}" | grep -m1 "Child UUIDs:" | awk '{print $3}'`
if [ "${TMP_DIFF}" != "" ]; then
vboxmanage closemedium disk "${TMP_DIFF}" --delete
fi
vboxmanage closemedium disk "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_1}"
fi
if [[ "${DISK_IMAGE_2}" != "" ]]; then
echo "Removing disk 2..."
vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port 2 --device 0 --medium none
vboxmanage closemedium disk "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_2}"
fi
if [[ "${DISK_IMAGE_3}" != "" ]]; then
echo "Removing disk 3..."
vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port 3 --device 0 --medium none
vboxmanage closemedium disk "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_3}"
fi
if [[ "${DISK_IMAGE_4}" != "" ]]; then
echo "Removing disk 4..."
vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port 4 --device 0 --medium none
vboxmanage closemedium disk "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_4}"
fi
}
###############################################################################
###############################################################################
# vbox_attach_media
###################
vbox_attach_media () {
if [[ "${DISK_IMAGE_1}" != "" ]]; then
echo "Attaching disk 1..."
VBoxManage modifyhd "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_1}" --type immutable
vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port 1 --device 0 --type hdd --medium "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_1}"
fi
if [[ "${DISK_IMAGE_2}" != "" ]]; then
echo "Attaching disk 2..."
vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port 2 --device 0 --type hdd --medium "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_2}"
fi
if [[ "${DISK_IMAGE_3}" != "" ]]; then
echo "Attaching disk 3..."
vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port 3 --device 0 --type hdd --medium "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_3}"
fi
if [[ "${DISK_IMAGE_4}" != "" ]]; then
echo "Attaching disk 4..."
vboxmanage storageattach "${VM_NAME}" --storagectl "${STORAGE_CONTROLLER_NAME}" --port 4 --device 0 --type hdd --medium "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_4}"
fi
}
###############################################################################
###############################################################################
# vm_start_init
###############
vm_start_init () {
# create temporary folder
if [ ! -d $USER_TMP_DIR ]; then
mkdir $USER_TMP_DIR
fi
# remove files older than 12 hours
#find ${USER_TMP_DIR} -name "*" -type f -mmin +720 -delete
# copy diff file (if needed)
if [ "${DIFF_DISK_FILE}" != "" ]; then
echo -n "Setting up differential disk... "
cp "${TEMPLATE_DIR}/${DIFF_DISK_FILE}" "${USER_TMP_DIR}"
chmod 755 "${USER_TMP_DIR}/${DIFF_DISK_FILE}"
echo "OK"
fi
echo -n "Setting up media folder... "
# create local media folder and symlink if not existing
if [ ! -d "${SF_MEDIA_TARGET}" ]; then
mkdir -p "${SF_MEDIA_TARGET}"
fi
if [ ! -e "${SF_MEDIA_TARGET}/${USER}" ]; then
if [ ! -h "${SF_MEDIA_TARGET}/${USER}" ]; then
ln -s "${SYSTEM_MEDIA_FOLDER}" "${SF_MEDIA_TARGET}/${USER}"
fi
fi
echo "OK"
# create network interface
echo -n "Removing network interface: "
VBoxManage hostonlyif remove vboxnet0
echo -n "Creating network interface: "
VBoxManage hostonlyif create
# >/dev/null 2>&1
# restore snapshot if needed
if [ "${SNAPSHOT_NAME}" != "" ]; then
VBoxManage snapshot "${VM_NAME}" restore "${SNAPSHOT_NAME}"
fi
if [ "${HD_AUTORESET}" == "off" ]; then
if [ "${DISK_IMAGE_1}" != "" ]; then
TMP_DIFF=`vboxmanage showhdinfo "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_1}" | grep -m1 "Child UUIDs:" | awk '{print $3}'`
if [ "${TMP_DIFF}" != "" ]; then
echo "Setting differential disk ${TMP_DIFF}: autoreset=${HD_AUTORESET}"
VBoxManage modifyhd ${TMP_DIFF} --autoreset ${HD_AUTORESET}
fi
fi
if [ "${DISK_IMAGE_2}" != "" ]; then
TMP_DIFF=`vboxmanage showhdinfo "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_2}" | grep -m1 "Child UUIDs:" | awk '{print $3}'`
if [ "${TMP_DIFF}" != "" ]; then
echo "Setting differential disk ${TMP_DIFF}: autoreset=${HD_AUTORESET}"
VBoxManage modifyhd ${TMP_DIFF} --autoreset ${HD_AUTORESET}
fi
fi
if [ "${DISK_IMAGE_3}" != "" ]; then
TMP_DIFF=`vboxmanage showhdinfo "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_3}" | grep -m1 "Child UUIDs:" | awk '{print $3}'`
if [ "${TMP_DIFF}" != "" ]; then
echo "Setting differential disk ${TMP_DIFF}: autoreset=${HD_AUTORESET}"
VBoxManage modifyhd ${TMP_DIFF} --autoreset ${HD_AUTORESET}
fi
fi
if [ "${DISK_IMAGE_4}" != "" ]; then
TMP_DIFF=`vboxmanage showhdinfo "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_4}" | grep -m1 "Child UUIDs:" | awk '{print $3}'`
if [ "${TMP_DIFF}" != "" ]; then
echo "Setting differential disk ${TMP_DIFF}: autoreset=${HD_AUTORESET}"
VBoxManage modifyhd ${TMP_DIFF} --autoreset ${HD_AUTORESET}
fi
fi
else
#if [ "${HD_AUTORESET}" == "on" ]; then
vbox_remove_media
vbox_attach_media
#fi
fi
if [ "${LAST_HD_UUID}" != "" ]; then
TMP_DIFF=`vboxmanage showhdinfo "${LAST_HD_UUID}" | grep -m1 "Child UUIDs:" | awk '{print $3}'`
if [ "${TMP_DIFF}" != "" ]; then
if [ "${AUTORESET}" -eq 0 ]; then
echo "Differential disk ${TMP_DIFF}: autoreset=off"
VBoxManage modifyhd ${TMP_DIFF} --autoreset off
else
echo "Differential disk ${TMP_DIFF}: autoreset=on"
fi
fi
fi
if [ "${LAST_HD2_UUID}" != "" ]; then
TMP_DIFF=`vboxmanage showhdinfo "${LAST_HD2_UUID}" | grep -m1 "Child UUIDs:" | awk '{print $3}'`
if [ "${TMP_DIFF}" != "" ]; then
if [ "${AUTORESET}" -eq 0 ]; then
echo "Differential disk ${TMP_DIFF}: autoreset=off"
VBoxManage modifyhd ${TMP_DIFF} --autoreset off
else
echo "Differential disk ${TMP_DIFF}: autoreset=on"
fi
fi
fi
}
###############################################################################
###############################################################################
# discard_state
###############
vm_discard_state() {
echo -n "Discard state... "
VBoxManage discardstate "${VM_NAME}"
echo "OK."
}
###############################################################################
###############################################################################
# vm_start_run
##############
vm_start_run() {
# --fullscreen?
if [[ ${FULLSCREEN} == 1 ]]; then
# VBoxManage has no option for fullscreen mode, use VBoxSDL (no menu available in fullscreen)
# VBoxSDL --startvm "${VM_NAME}" --fullscreen
# options below could be useful in setting the fullscreen resolution, when known
# --fullscreenresize --fixedmode 1152 864 32
#
# the following command can also be used to start the VM in fullscreen (GUI mode)
/usr/bin/VirtualBox --startvm "${VM_NAME}" --fullscreen
else
VBoxManage startvm "${VM_NAME}"
fi
}
###############################################################################
# print title
title
###############################################################################
# Parse arguments
#################
[[ "$#" -ge 1 ]] || usage "ERROR: one argument required ($# provided)."
VM_ID=""
DEBUG=0
FULLSCREEN_CL=-1
FULLSCREEN=0
NO_RUN=0
NO_INIT=0
DISCARD_STATE=0
HD_AUTORESET=on
while [ "$1" != "" ]; do
PARAM=`echo $1 | awk -F= '{print $1}'`
VALUE=`echo $1 | awk -F= '{print $2}'`
case ${PARAM} in
-h | --help)
usage ""
exit 0
;;
-g | --gui)
FULLSCREEN_CL=0
shift
;;
-f | --fullscreen)
FULLSCREEN_CL=1
shift
;;
-i |--no-init)
NO_INIT=1
shift
;;
-r |--no-run)
NO_RUN=1
shift
;;
-s | --discard-state)
DISCARD_STATE=1
shift
;;
-d | --debug)
DEBUG=1
shift
;;
-a | --hd-autoreset)
HD_AUTORESET=$VALUE
shift
shift
;;
*)
if [[ "${VM_ID}" == "" ]]; then
VM_ID=${PARAM}
shift
else
usage "ERROR: unknown argument \"${PARAM}\"."
exit 1
fi
;;
esac
done
###############################################################################
# include global settings
. "${SRC_DIR}/settings/settings"
# VM_ID lookup in settings files by ID or NAME
if [ ! -f "$SRC_DIR/settings/${VM_ID}.settings" ]; then
result=`get_vm_id_by_name "${VM_ID}"`
VM_ID=$result
if [ ! -f "$SRC_DIR/settings/${VM_ID}.settings" ]; then
usage "ERROR: wrong vm_id or name."
fi
fi
# include VM settings
. "${SRC_DIR}/settings/${VM_ID}.settings"
# override VM fullscreen setting if set on command line
if [[ ${FULLSCREEN_CL} != -1 ]]; then
FULLSCREEN=${FULLSCREEN_CL}
fi
# print debug info if needed
debug
# check if VM exists
VBoxManage showvminfo "${VM_NAME}" &> /dev/null
[ "$?" -eq 0 ] || die "ERROR: VM not configured. Run 'vm-setup ${VM_ID}' and try again."
# check if snapstot folder is the one defined by us
current_snapshot_folder=`VBoxManage showvminfo "${VM_NAME}" | grep -m1 "Snapshot folder" | awk '{print $3}'`
if [ "$current_snapshot_folder" != "${USER_TMP_DIR}" ]; then
# non si può cambiare al volo se ci sono degli snapshot...
#VBoxManage modifyvm "${VM_NAME}" --snapshotfolder "${USER_TMP_DIR}"
echo "Configurazione obsoleta. Per favore riesegui:"
echo "${SRC_DIR}/vm-setup ${VM_ID}"
exit 1
fi
# --no-init?
if [[ ${NO_INIT} == 0 ]]; then
vm_start_init
fi
# --discard-state?
if [[ ${DISCARD_STATE} == 1 ]]; then
vm_discard_state
fi
# --no-run?
if [[ ${NO_RUN} == 0 ]]; then
vm_start_run
fi
exit 0