#!/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