diff options
Diffstat (limited to 'os-plugins/plugins/virtualbox/files/run-virt.include')
| -rw-r--r-- | os-plugins/plugins/virtualbox/files/run-virt.include | 465 |
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}" |
