-
Alberto LIVIO BECCARIA authored
Added host I/O cache for all disk images attached to this storage controller + limit port number to 4.
Alberto LIVIO BECCARIA authoredAdded host I/O cache for all disk images attached to this storage controller + limit port number to 4.
vm-setup 8.95 KiB
#!/bin/bash
#############################################
# VirtualBox VM Scripts - vm-setup
# by ulisse aka A. Livio Beccaria
#
# vm-setup sets a VM up
#############################################
APP_NAME="vm-setup - VirtualBox VM Scripts"
VERSION="18.5.4"
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 "\tUPDATE = ${UPDATE}"
echo -e "\tDEBUG = ${DEBUG}"
echo
fi
}
###############################################################################
###############################################################################
# Usage
#######
usage () {
if [[ "$@" != "" ]]; then
echo >&2 "$@"
echo
fi
echo "Usage: $0 <vm_id> [-u | --update] [-d | --debug] [-h | --help]"
echo
echo -e "\t-u --update:\tSet VM for update (administrator only)"
echo -e "\t-d --debug:\tPrint some debug information"
echo -e "\t-h --help:\tPrint this help"
echo
print_vm_list
echo
exit 1
}
###############################################################################
# print title
title
###############################################################################
# Parse arguments
#################
[[ "$#" -ge 1 ]] || usage "ERROR: too few arguments."
UPDATE=0
DEBUG=0
VM_ID=""
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
;;
-u | --update)
UPDATE=1
shift
;;
-d | --debug)
DEBUG=1
shift
;;
*)
if [[ "${VM_ID}" == "" ]]; then
VM_ID=${PARAM}
shift
else
usage "ERROR: unknown argument \"${PARAM}\"."
exit 1
fi
;;
esac
done
###############################################################################
# print debug info if needed
debug
# 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."
fi
fi
# import VM settings
. "$SRC_DIR/settings/${VM_ID}.settings"
VM_DIR="${MACHINES_DIR}/${VM_NAME}"
# if registered, unregister it
VBoxManage showvminfo "${VM_NAME}" &> /dev/null
if [ $? -eq 0 ]; then
VBoxManage unregistervm "${VM_NAME}"
fi
# remove VM's folder
rm -rf "${VM_DIR}" &> /dev/null
# create VM
echo -n "Creating VM... "
UUID=`VBoxManage createvm --name "${VM_NAME}" --ostype ${OS_TYPE} --basefolder "${MACHINES_DIR}" | grep -m1 UUID | awk '{print $2}'`
echo "OK"
echo
echo -e "\tName: ${VM_NAME}"
echo -e "\tUUID: ${UUID}"
echo
echo -n "Configuring VM... "
if [[ ${CREATE_VM} == 1 ]]; then
# register VM
VBoxManage registervm "${VM_DIR}/${VM_NAME}.vbox"
# network
VBoxManage modifyvm "${VM_NAME}" --nictype1 ${NIC_TYPE} --nic1 nat --natpf1 "http, tcp, , 80, , 8080"
# hardware UUID
VBoxManage modifyvm "${VM_NAME}" --hardwareuuid ${HARDWARE_UUID}
# USB
VBoxManage modifyvm "${VM_NAME}" --usb on --usbehci off --usbxhci off
# System: Memory, Chipset, Pointing device, I/O APIC, # of CPUs, PAE,
# Paravirtualization interface, Hardware Virtualization, Nested Paging
VBoxManage modifyvm "${VM_NAME}" --memory ${MEMORY} --chipset ${CHIPSET} \
--mouse ${POINTING_DEVICE} --ioapic ${IO_APIC} --cpus ${CPUS} \
--paravirtprovider ${PARAVIRT_PROVIDER} \
--hwvirtex ${HW_VIRTEX} --nestedpaging ${NESTED_PAGING}
# all other things
VBoxManage modifyvm "${VM_NAME}" --vram ${VRAM} --snapshotfolder "${USER_TMP_DIR}" \
--accelerate2dvideo ${ACCEL_2D} --accelerate3d ${ACCEL_3D} \
--clipboard bidirectional --draganddrop bidirectional \
--audio ${AUDIO_DRIVER} --audiocontroller ${AUDIO_CONTROLLER} \
--description "${DESCRIPTION}" \
# not working, bug in VB version >= 5.2
#--audioin on --audioout on
# set storage type to "normal" to allow update, otherwise "immutable"
if [[ ${UPDATE} == 1 ]]; then
if [[ "${DISK_IMAGE_1}" != "" ]]; then
VBoxManage modifyhd "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_1}" --type normal
fi
if [[ "${DISK_IMAGE_2}" != "" ]]; then
VBoxManage modifyhd "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_2}" --type normal
fi
if [[ "${DISK_IMAGE_3}" != "" ]]; then
VBoxManage modifyhd "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_3}" --type normal
fi
if [[ "${DISK_IMAGE_4}" != "" ]]; then
VBoxManage modifyhd "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_4}" --type normal
fi
else
if [[ "${DISK_IMAGE_1}" != "" ]]; then
VBoxManage modifyhd "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_1}" --type immutable
fi
if [[ "${DISK_IMAGE_2}" != "" ]]; then
VBoxManage modifyhd "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_2}" --type immutable
fi
if [[ "${DISK_IMAGE_3}" != "" ]]; then
VBoxManage modifyhd "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_3}" --type immutable
fi
if [[ "${DISK_IMAGE_4}" != "" ]]; then
VBoxManage modifyhd "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_4}" --type immutable
fi
fi
# add storage
VBoxManage storagectl "${VM_NAME}" --name ${STORAGE_CONTROLLER_NAME} --add ${STORAGE_CONTROLLER_TYPE} --hostiocache on --portcount 4
VBoxManage storageattach "${VM_NAME}" --storagectl ${STORAGE_CONTROLLER_NAME} --port 0 --device 0 --type dvddrive --medium emptydrive
if [[ "${DISK_IMAGE_1}" != "" ]]; then
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
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
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
VBoxManage storageattach "${VM_NAME}" --storagectl ${STORAGE_CONTROLLER_NAME} --port 4 --device 0 --type hdd --medium "${IMG_HOME}/${VM_ID}/${DISK_IMAGE_4}"
fi
# shared folders
VBoxManage sharedfolder add "${VM_NAME}" --name "${SF_LINUX_NAME}" --hostpath "${SF_LINUX_TARGET}"
VBoxManage sharedfolder add "${VM_NAME}" --name "${SF_MEDIA_NAME}" --hostpath "${SF_MEDIA_TARGET}"
# TWEAK enableIn and enabledOut audio attributes (5.2.x bug, enableOut does not get properly set)
# we need to wait some time for the configuration to be written on disk before tweaking it
#for i in {1..10}; do echo -ne "$i"'\b'; sleep 1; done; echo -ne '\b'
#sed -i 's@\(AudioAdapter.*enabledIn="\)\([^"]*\)\("\)@\1'"`echo "true"`"'\3@g' "${VM_DIR}/${VM_NAME}.vbox"
#sed -i 's@\(AudioAdapter.*enabledOut="\)\([^"]*\)\("\)@\1'"`echo "true"`"'\3@g' "${VM_DIR}/${VM_NAME}.vbox"
else
# use template
cp "${TEMPLATE_DIR}/${TEMPLATE}.vbox" "${VM_DIR}/${VM_NAME}.vbox"
# se servisse: " = \x22
sed -i 's@\(Machine.*uuid="\)\([^"]*\)\("\)@\1'"`echo "${UUID}"`"'\3@g' "${VM_DIR}/${VM_NAME}.vbox"
sed -i 's@\(Machine.*name="\)\([^"]*\)\("\)@\1'"`echo "${VM_NAME}"`"'\3@g' "${VM_DIR}/${VM_NAME}.vbox"
sed -i 's@\(Machine.*snapshotFolder="\)\([^"]*\)\("\)@\1'"`echo "${USER_TMP_DIR}"`"'\3@g' "${VM_DIR}/${VM_NAME}.vbox"
sed -i 's@\(SharedFolder.*name="'"`echo "${SF_LINUX_NAME}"`"'".*hostPath="\)\([^"]*\)\("\)@\1'"`echo "${SF_LINUX_TARGET}"`"'\3@g' "${VM_DIR}/${VM_NAME}.vbox"
sed -i 's@\(SharedFolder.*name="'"`echo "${SF_MEDIA_NAME}"`"'".*hostPath="\)\([^"]*\)\("\)@\1'"`echo "${SF_MEDIA_TARGET}"`"'\3@g' "${VM_DIR}/${VM_NAME}.vbox"
sed -i 's@\(MACAddress="\)\([^"]*\)\("\)@\1'"`printf '080027%02X%02X%02X' $[RANDOM%256] $[RANDOM%256] $[RANDOM%256]`"'\3@g' "${VM_DIR}/${VM_NAME}.vbox"
if [ "${DIFF_DISK_FILE}" != "" ]; then
sed -i 's@\(HardDisk.*location="\)\([^"]*diff_[^"]*\)\("\)@\1'"`echo "${USER_TMP_DIR}/${DIFF_DISK_FILE}"`"'\3@g' "${VM_DIR}/${VM_NAME}.vbox"
fi
# register VM
VBoxManage registervm "${VM_DIR}/${VM_NAME}.vbox"
fi
echo "OK"
echo
exit 0