summaryrefslogtreecommitdiffstats
path: root/os-plugins/plugins/virtualbox/files/run-virt.include
diff options
context:
space:
mode:
Diffstat (limited to 'os-plugins/plugins/virtualbox/files/run-virt.include')
-rw-r--r--os-plugins/plugins/virtualbox/files/run-virt.include465
1 files changed, 332 insertions, 133 deletions
diff --git a/os-plugins/plugins/virtualbox/files/run-virt.include b/os-plugins/plugins/virtualbox/files/run-virt.include
index e16e2edf..9dbe47ac 100644
--- a/os-plugins/plugins/virtualbox/files/run-virt.include
+++ b/os-plugins/plugins/virtualbox/files/run-virt.include
@@ -1,6 +1,7 @@
-# run-virtualbox.include
-#
-# Copyright (c) 2009 - OpenSLX GmbH
+# run-virt.include
+# -----------------------------------------------------------------------------
+# Copyright (c) 2009..2010 - RZ Uni Freiburg
+# Copyright (c) 2009..2010 - OpenSLX GmbH
#
# This program/file is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
@@ -9,53 +10,264 @@
# send your feedback to feedback@openslx.org
#
# General information about OpenSLX can be found at http://openslx.org
-#
-# Include script for running the Virtual Box on an OpenSLX client via the
-# run-virt.sh. The stuff is copied to /etc/opt/openslx/run-virtualbox.include
-# during stage3.
+# -----------------------------------------------------------------------------
+# run-virt.include
+# - Include script for running the VirtualBox on an OpenSLX client via the
+# run-virt.sh or run-vmgrid.sh
+################################################################################
-# include general configuration from vmchooser
-. /etc/opt/openslx/run-virt.include
+################################################################################
+### Include general configuration
+################################################################################
+if [ -f ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf ]; then
+ . ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf
+else
+ writelog "Problems reading config file of ${self} plugin"
+ exit 1
+fi
-# memory part equal to vmware plugin
-# percentage of memory to use for virtualbox in standard case
-permem=30
-if [ "${totalmem}" -ge "1600" ]; then
- permem=40
+################################################################################
+### Declaration of default variables
+################################################################################
+
+PLUGINCONFVIRTUALBOX="${PLUGINCONFROOT}/${self}"
+PLUGINDIRVIRTUALBOX="${OPENSLX_DEFAULT_DIR}/plugin-repo/${self}"
+# create TMPDIR for all users
+TMPDIR=/tmp/${self}
+mkdir -m 1777 ${TMPDIR} 2>/dev/null
+# dir for configs
+confdir="/tmp/${self}/${USER}/${VM_ID}"
+# use alternate configuration directory instead of $HOME/.VirtualBox
+export VBOX_USER_HOME=${confdir}
+# define dirs and files which can be removed after exit, be carefull!
+RMDIRS="${snapshotdir} ${confdir} /tmp/.vbox-${USER}-ipc"
+rm -rf ${RMDIRS} 2>/dev/null
+machfolder="${confdir}/Machines"
+# use vm_shortname for dir and config names since vm_name can be very long
+machconfig="${machfolder}/${vm_shortname}/${vm_shortname}.xml"
+diskfolder="${confdir}/HardDisks"
+snapshotdir=${machfolder}/${vm_shortname}/Snapshots
+mkdir -p ${diskfolder} ${snapshotdir} 2>/dev/null
+# check if diskless var empty?
+[ -z "${diskless}" ] && diskless=0
+
+# configure our own rwimg, empty image which we support
+if [ "${imgmode}" = "rwimg" ]; then
+ # what is our rwimg called?
+ imgname="${vm_shortname}.vdi"
+ vmpath=${imgpath}/${imgname}
+ if ! [ -e "${vmpath}" ]; then
+ cat ${PLUGINDIRVIRTUALBOX}/rwimg.vdi.gz | gunzip > "${vmpath}"
+ fi
fi
-# check if /tmp is on harddisk
-if grep -qe "/dev/.* /tmp " /proc/mounts ; then
- permem=60
- id44="1"
- # Hack, if more than 2,5G RAM use 40% of Ram and write vmem into Ram as well
- # (40% vmware | 40% confdir(vmem...) | 20% host
- # VMplayer 2+ issue
- if [ "${totalmem}" -ge "2500" ]; then
- permem=40
- mkdir /dev/shm/vbox/${USER}
- snapshotdir=/dev/shm/vbox/$USER
+
+# link to image
+diskfile="${diskfolder}/${imgname}"
+[ ${diskless} -eq 0 ] && ln -sf ${vmpath} ${diskfile}
+
+# check the file type
+if echo ${imgname} | grep -qiE "vdi|vmdk|vhd" && [ ${diskless} -eq 0 ]; then
+ imgfmt=$(echo ${imgname##*.} | tr [a-z] [A-Z])
+elif [ ${diskless} -eq 0 ]; then
+ writelog "${imgname} is not a valid image format (vdi|vmdk|vhd), exiting!"
+ cleanexit 1
+fi
+
+# TODO: maybe rewrite, to reduce checks, merge it with network option,
+# so we can have a "compatibility to vmware config" section
+case "${vmostype}" in
+ winxp*|windowsxp*)
+ vmostype="WindowsXP"
+ ;;
+ winvista*|windowsvista*)
+ vmostype="WindowsVista"
+ ;;
+ windows7*)
+ vmostype="Windows7"
+ ;;
+ linux*|*ubuntu*|*suse*|debian*|*sci*)
+ if echo "${vmostype}" | grep -q "64"; then
+ vmostype="Linux26_64"
+ # check for vtflag
+ if [ ${vtflag} -ne 1 ]; then
+ writelog "You are trying to boot a 64 bit OS without a VT enabled CPU"
+ writelog "This is not supported, exiting!"
+ cleanexit 1
+ fi
+ # check if host is only 32 bit, then use only 1 cpu (only 1 supported)
+ if echo "${host_arch}" | grep -qE "i.86"; then
+ cpu_cores=1
+ fi
+ else
+ vmostype="Linux26"
+ fi
+ ;;
+esac
+
+writelog "Directories:"
+writelog "\tConfig dir:\t\t$confdir"
+writelog "\tMachines dir:\t\t$machfolder"
+writelog "\tMachine config:\t\t$machconfig"
+[ ${diskless} -eq 0 ] && writelog "\tHardDisks dir:\t\t$diskfolder"
+
+################################################################################
+### Hardware checks
+################################################################################
+
+# remove ':' from MAC addr for vbox
+macaddr=$(echo ${macaddr} | sed 's/://g')
+
+# machine UUID, MAC addr part of it
+machineuuid="00000000-0000-0000-0000-${macaddr}"
+# cosmetical, since UUID in lower case
+machineuuid=$(echo ${machineuuid} | tr [A-Z] [a-z])
+# get UUID of VBox image, if not diskless
+[ ${diskless} -eq 0 ] && diskuuid=$(VBoxManage -q showvdiinfo ${diskfile} \
+ | grep UUID | awk '{print $2}')
+# make disk immutable
+imgtype="Immutable"
+# snapshot UUID is static
+snapshotuuid="88bc8b6d-f248-468a-95fe-318084904f8b"
+# imageuuid in machine.include, dafault snapshotuuid
+imageuuid=${snapshotuuid}
+
+# check if rw image
+# remove disk and add rwimg if set
+if echo "${imgmode}" | grep -q rw; then
+ # lock existing?
+ if [ -e "${vmpath}.lock" ]; then
+ writelog "This rw image is already in use."
+ writelog "Found lock: ${vmpath}.lock, exiting!"
+ writelog "Remove lock if you are sure that this is not the case"
+ cleanexit 1
+ # image rw?
+ elif ! [ -w ${vmpath} ]; then
+ writelog "You defined mode rw, but image ${vmpath} is not rw! \c"
+ writelog "Please correct, exiting!"
+ cleanexit 1
fi
+ # add lock
+ touch "${vmpath}.lock"
+ # remove lock after VM stopped
+ RMDIRS="${RMDIRS} ${vmpath}.lock"
+ imgtype="Normal"
+ # replace image uuid in machine config
+ imageuuid=${diskuuid}
+elif [ ${diskless} -eq 0 ]; then
+ # use temp disk as snapshot
+ cat ${PLUGINDIRVIRTUALBOX}/empty-diff.vdi.gz \
+ | gunzip > "${snapshotdir}/{${snapshotuuid}}.vdi"
fi
-mem=$(expr ${totalmem} / 100 \* ${permem})
-if [ "${id44}" = "1" ]; then
- memhost=$(expr ${totalmem} - ${mem})
+
+# TODO: MEM muss noch angepasst werden. Maschine crasht wenn nehr als 50% MEM
+# memory part equal to vmware plugin
+# percentage of memory to use for virtualbox in standard case
+if [ -n "${forcemem}" ]; then
+ mem="${forcemem}"
else
- memhost=$(expr ${totalmem} - ${mem} - ${mem})
+ permem=30
+ if [ "${totalmem}" -ge "1600" ]; then
+ permem=40
+ fi
+ # check if /tmp is on harddisk
+ if grep -qe "/dev/.* /tmp " /proc/mounts ; then
+ permem=60
+ id44="1"
+ # Hack, if more than 2,5G RAM use 40% of Ram and write vmem into Ram as well
+ # (40% vmware | 40% confdir(vmem...) | 20% host
+ # VMplayer 2+ issue
+ # TODO: makes this sense for vbox?
+ #if [ "${totalmem}" -ge "2500" ]; then
+ #permem=40
+ #rmdir ${snapshotdir}
+ #snapshotdirold=${snapshotdir}
+ #snapshotdir=/dev/shm/${self}/${USER}/${VM_ID}
+ #mkdir -p ${snapshotdir}
+ #ln -sf ${snapshotdir} ${snapshotdirold}
+ #fi
+ fi
+ mem=$(expr ${totalmem} / 100 \* ${permem})
+ if [ "${id44}" = "1" ]; then
+ hostmem=$(expr ${totalmem} - ${mem})
+ else
+ hostmem=$(expr ${totalmem} - ${mem} - ${mem})
+ fi
+ #permem=40
+ #mem=$(expr ${totalmem} * ${permem})
+ if [ "${mem}" -lt "256" ] || [ "${hostmem}" -lt "256" ]; then
+ writelog "Memory out of range: ${mem} MB (guest) / ${hostmem} MB (host)!"
+ writelog "Min. 256 MB for host and guest!"
+ cleanexit 1
+ fi
fi
-#permem=40
-#mem=$(expr ${totalmem} * ${permem})
+# translate network cards
+case "${network_card}" in
+ e1000)
+ vb_network_card="82540EM"
+ ;;
+ virtio)
+ vb_network_card="virtio"
+ ;;
+ *)
+ network_card="pcnet"
+ vb_network_card="Am79C973"
+esac
-if [ "${mem}" -lt "256" ] || [ "${memhost}" -lt "256" ]; then
- writelog "\tMemory out of range: ${mem} MB (guest) / ${memhost} MB (host)!"
- writelog "\tMin. 256 MB for host and guest!"
- exit 1
-fi
+# translate network kinds (nat, bridged, host-only)
+case "${network_kind}" in
+ bridge*)
+ network_kind='BridgedInterface name="br0"'
+ ;;
+ host*)
+ network_kind='HostOnlyInterface name="vboxnet0"'
+ ;;
+ *)
+ network_kind="NAT"
+esac
+# translate boot, use if set else set to HardDisk
+# usually support for a,c,d,n, stands for Floppy, HD, CD-ROM, Network
+# support nfs and tftp as well
+case ${boot} in
+ n*|tftp)
+ boot="Network"
+ if [ "${network_kind}" = "NAT" ] && [ -n "${virtualbox_tftpdir}" ]; then
+ # use vm_shortname to avoid Problems /w TFTP in NAT
+ vm_name=${vm_shortname}
+ # link TFTP dir for NAT TFTP boots
+ mkdir -p ${confdir}/TFTP
+ if [ -e ${virtualbox_tftpdir}/pxelinux.0 ]; then
+ cp ${virtualbox_tftpdir}/pxelinux.0 ${confdir}/TFTP/${vm_name}.pxe
+ else
+ writelog "${virtualbox_tftpdir}/pxelinux.0 not found!"
+ writelog "Network boot won't work, exiting!"
+ cleanexit 1
+ fi
+ for i in $(ls ${virtualbox_tftpdir}); do
+ ln -sf ${virtualbox_tftpdir}/${i} ${confdir}/TFTP/${i}
+ done
+ fi
+ ;;
+ # later maybe c|disk|hd*|sd*) for HD and d|cd*) for CD-ROM
+ *)
+ boot="HardDisk"
+ ;;
+esac
+# nested paging
+npaging="false"
+# enable VT
+enablevt="false"
+# check for VT, if not available use only 1 cpu (only 1 supported)
+[ ${vtflag} -eq 0 ] && cpu_cores=1
+[ ${vtflag} -eq 1 ] && enablevt="true"
-# most of the following does not make much sense yet ...
-#
+# external GUI
+vrdpport=${remotedesktopport}
+
+# TODO: nur bei vmchooser
+# TODO: most of the following does not make much sense yet ...
# virtual fd/cd/dvd and drive devices, floppy b: for configuration
# if $floppy_0 from run-virt.include set then fdtest="TRUE"
fdtest=
@@ -78,115 +290,102 @@ cdrom1=${cdtest:-"FALSE"}
# be done while creating the runscripts ...
ide="TRUE"
hddrv="ide"
+audio=${audio:-"true"}
+[ ${diskless} -eq 0 ] && writelog "\tSnapshots dir:\t\t$snapshotdir"
+writelog "Diskimage:"
+[ ${diskless} -eq 0 ] && writelog "\tDisk file:\t\t$diskfile"
+[ ${diskless} -eq 0 ] && writelog "\tDisk format:\t\t$imgfmt"
+[ ${diskless} -eq 0 ] && writelog "\tDisk type:\t\t$imgtype"
+ writelog "\tVMostype:\t\t$vmostype"
+ writelog "\tMachine UUID:\t\t$machineuuid"
+[ ${diskless} -eq 0 ] && writelog "\tDisk UUID:\t\t$diskuuid"
+writelog "Virtual Hardware:"
+writelog "\tCPU cores:\t\t${cpu_cores}\c"
+[ ${vtflag} -eq 0 ] && writelog ""
+[ ${vtflag} -eq 1 ] && writelog " (VT enabled CPU)"
+writelog "\tGuest RAM:\t\t${mem} MB"
+# echo nur wenn hostmem gesetzt
+[ -n "${hostmem}" ] && writelog "\tHost RAM:\t\t${hostmem} MB"
+writelog "\tMAC address:\t\t$macaddr"
+writelog "\tNetwork card:\t\t${vb_network_card}"
+writelog "\tNetwork kind:\t\t${network_kind}"
+writelog "\tBooting from:\t\t${boot}\c"
+[ ${diskless} -eq 0 ] && writelog ""
+[ ${diskless} -eq 1 ] && writelog " 'diskless'"
+# TODO: server start activate via xml, etc...
+#writelog "\tGuest VRDP port:\t${vrdpport}"
+#writelog "\tCD-ROM1:\t${cdrom0}"
+#writelog "\tCD-ROM2:\t${cdrom1}"
+#writelog "\tFloppy_A:\t${floppy0}"
+#writelog "\tFloppy_B:\t${floppy1}"
+# defined in run-virt.sh and run-vmgrid.sh
+writelog "\tShared Folders '${sharename}':\t${sharepath}"
################################################################################
-### Pepare env and and configure Image
+### Pepare and configure virtual machine and disk image
################################################################################
-# Current ID, to make sure it won't run into conflicts if started more
-# as once at the same time, else delete would make the trick...
-ID=$$
-# Don't use $HOME/.VirtualBox!
-export VBOX_USER_HOME="/tmp/vbox-${USER}-${ID}"
-
-# Import Image to VirtualBox, which won't get changed
-VBoxManage -nologo registerimage disk ${diskfile} -type immutable
-
-# Get ID of VBox Image...
-diskuid="$(VBoxManage -nologo showvdiinfo ${diskfile} |grep UUID|awk '{ print $2; }')"
-# Create Image and register it, so we are able to modify and start it
-VBoxManage -nologo createvm -name "${ID}" -register
-
-################################################################################
-###
-### Modify VM
-###
-################################################################################
-
-## Add harddisk
-VBoxManage -nologo modifyvm "${ID}" -hda ${diskuid}
-
-## Configure VM memory
-VBoxManage -nologo modifyvm "${ID}" -memory ${mem}
+# create Virtualbox.xml
+. ${PLUGINCONFVIRTUALBOX}/virtualbox.include
-## Add cddrives
-## TODO: merge to new version, where run-virt.include has our drives
-#VBoxManage -nologo modifyvm "${ID}" -dvd host:${cdrs}
-
-# Enable hardware virtualization
-# TODO: check if CPU supports hw virtualization
-#VBoxManage -nologo modifyvm "${ID}" -hwvirtex on
-
-# HDD as boot device
-VBoxManage -nologo modifyvm "${ID}" -boot1 disk
-
-# enable audio (oss|null|none|alsa|pulse). OSS is backwardcompatible to v2.0
-VBoxManage -nologo modifyvm "${ID}" -audio oss
-
-# supress License and Message
-# TODO: Not clear if we are allowed to do this
-VBoxManage -nologo setextradata global "GUI/LicenseAgreed" "7"
-VBoxManage -nologo setextradata global "GUI/SuppressMessages" ",remindAboutAutoCapture"
-VBoxManage -nologo setextradata global "GUI/RegistrationData" "triesLeft=0"
-
-# if we have enough memory, we can put the snapshots (changes on immutable
-# disk) there
-if [ -n ${snapshotdir} ]; then
- VBoxManage -nologo modifyvm "${ID}" -snapshotfolder "${snapshotdir}"
+# remove snapshot disk when using rw images
+if [ "${imgtype}" != "Immutable" ]; then
+ sed -i "/${snapshotuuid}/d" "${confdir}/VirtualBox.xml"
fi
-# Operating system. Possible: VBoxManage -nologo list ostypes
-# WindowsXP, WindowsVista, Windows7, Linux26 etc.
-# keep compatibility to VMware
-# Todo: maybe rewrite, to reduce checks, merge it with network option,
-# so we can have a "compatibility to vmware config" section. Or include
-# it into vmchooser?
-if [ "${vmostype}" = "winxppro" -o "${vmostype}" = "WindowsXP" ]; then
- VBoxManage -nologo modifyvm "${ID}" -ostype "WindowsXP"
-elif [ "${vmostype}" = "winvista" -o "${vmostype}" = "WindowsVista" ]; then
- VBoxManage -nologo modifyvm "${ID}" -ostype "WindowsVista"
-elif [ "${vmostype}" = "Windows7" ]; then
- VBoxManage -nologo modifyvm "${ID}" -ostype "Windows7"
-elif [ "${vmostype}" = "linux" -o "${vmostype}" = "Linux26" ]; then
- VBoxManage -nologo modifyvm "${ID}" -ostype "Linux26"
-elif [ -n "${vmostype}" ]; then
- VBoxManage -nologo modifyvm "${ID}" -ostype "${vmostype}"
-fi
+# TODO: add rawdisk if requested
+#"raw.vmdk" format="VMDK" type="Writethrough"/>
+# create machine.xml
+. ${PLUGINCONFVIRTUALBOX}/machine.include
-# Network Configuration
-# only bridge differes to vmware. Compatibility option
-if [ "${network_kind}" = "bridge" ]; then
- network_kind="bridged"
-fi
-VBoxManage -nologo modifyvm "${ID}" -nic1 "${network_kind}"
-if [ "${network_kind}" = "bridged" ]; then
- VBoxManage -nologo modifyvm "${ID}" -bridgeadapter1 "eth1"
+# if diskless remove all disks
+if [ ${diskless} -eq 1 ]; then
+ sed -i "/<HardDisk/d;/<\/HardDisk/d" "${confdir}/VirtualBox.xml"
+ sed -i "/${imageuuid}/d" ${machconfig}
+ sed -i '/AttachedDevice type="HardDisk"/d' ${machconfig}
+ sed -i "/<!-- PLEASE DO NOT REMOVE THIS COMMENT!!! -->/d" ${machconfig}
fi
-if [ "${network_kind}" = "hostonly" ]; then
- VBoxManage -nologo modifyvm "${ID}" -hostonlyadapter1 "vboxnet0"
-fi
-
-# modify macaddress
-mac=$(echo ${mac}|sed 's/://') # ${mac/:/}
-VBoxManage -nologo modifyvm "${ID}" -macaddress1 "0050560D${mac}"
-
-
-# usb configuration
-# not available in free -ose version
-#VBoxManage -nologo modifyvm "${ID}" -usb on
-#VBoxManage -nologo modifyvm "${ID}" -usbehci on
+# define redirects
+if [ ${redirects} -ge 1 ]; then
+ (( i=1 ))
+ writelog "\tGuest redirects:\t\c"
+ while [ ${i} -le ${redirects} ]; do
+ extradataitem='<ExtraDataItem name="VBoxInternal/Devices'
+ extradataitem="${extradataitem}/${network_card}/0/LUN#0/Config"
+ extradataitem="${extradataitem}/${redirect_name[$i]}/"
+ extradataprotocol="Protocol\" value=\"${redirect_proto[$i]}\"/>"
+ extradatahostport="HostPort\" value=\"${redirect_hport[$i]}\"/>"
+ extradataguestport="GuestPort\" value=\"${redirect_gport[$i]}\"/>"
+ sed -i "s,</ExtraData>, ${extradataitem}${extradataguestport}\n\
+ ${extradataitem}${extradatahostport}\n\
+ ${extradataitem}${extradataprotocol}\n\
+ </ExtraData>," "${machconfig}"
+ writelog "${tabspace}${redirect_name[$i]} port: ${redirect_hport[$i]}"
+ tabspace='\t\t\t\t'
+ (( i=$i+1 ))
+ done
+fi
-# finally set env for run-virt.sh
################################################################################
+### finally set env for run-virt.sh
+################################################################################
+
+# wait for a certain command to settle
+# get the PID of the right process
+# kill PID, seems to work
+VBMANPID=$(pstree -p | grep VBoxXPCOMIPCD | grep -ivE "VirtualBox|VBoxHeadless"\
+ | sed -e "s/.*VBoxXPCOMIPCD(\(.*\)).*/\1/")
+for i in $(echo ${VBMANPID}); do
+ kill -9 ${VBMANPID} >/dev/null 2>&1
+done
# set the variables appropriately (several interfaces with different names)
-#VIRTCMD=$(which virtualbox 2>/dev/null)
-VIRTCMD=$(which VBoxManage -nologo 2>/dev/null)
-VIRTCMDOPTS="startvm ${ID} -type gui"
+VIRTCMD=$(which VirtualBox 2>/dev/null)
+VIRTCMDOPTS="--startvm ${machineuuid} --start-running"
-# todo: for debugging purpose during development
-echo "\n export VBOX_USER_HOME=\"/tmp/vbox-${USER}-${ID}\""
-echo " VBoxManage -nologo $VIRTCMDOPTS\n\n"
+# set headless mode (-v off to disable vrdp)
+VIRTCMDHL=$(which VBoxHeadless 2>/dev/null)
+VIRTCMDOPTSHL="-s ${machineuuid}"