# run-virt.include
# -----------------------------------------------------------------------------
# Copyright (c) 2009..2012 - RZ Uni Freiburg
# Copyright (c) 2009..2013 - OpenSLX GmbH
#
# This program is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
#
# If you have any feedback please consult http://openslx.org/feedback and
# send your suggestions, praise, or complaints to feedback@openslx.org
#
# General information about OpenSLX can be found at http://openslx.org/
# -----------------------------------------------------------------------------
# run-virt.include
# - component for vmware/player of the vmchooser plugin run-virt.sh
################################################################################
# configuration writer functions
################################################################################
function clean_string ()
{
if [ "$#" -ge 1 ]; then
echo "$@" | tr '[A-Z]' '[a-z]' | tr -d '\t _./'
else
cat - | tr '[A-Z]' '[a-z]' | tr -d '\t _./'
fi
}
vmostype=$(clean_string "$vmostype")
runvmwareconfheader ()
{
echo "# This configuration file was generated by $0" > "$conffile"
# does this makes sense? Depends on the VMworkstation in use
MAXMEM="9999999"
MAXCORES="4"
# check for the ostype
# 1) memory limits
case "$vmostype" in
win31*|windows31*)
MAXMEM="32"
vmostype="win31"
;;
winnt*|windowsnt*)
MAXMEM="1000"
vmostype="winnt"
;;
win95*|windows95*)
MAXMEM="96"
vmostype="win95"
;;
win98*|windows98*)
MAXMEM="384"
vmostype="win98"
;;
winme*|windowsme*)
MAXMEM="384"
vmostype="winme"
;;
win2000|windows2000|win2000pro*)
MAXMEM="4000"
vmostype="win2000pro"
;;
win2000srv*|windows2000srv*|win2000serv*|windows2000serv*)
MAXMEM="4000"
vmostype="win2000serv"
;;
win2000adv*|windows2000adv*|win2000dat*|windows2000dat*)
MAXMEM="8000"
vmostype="win2000advserv"
;;
winnet*64|win*2003*64|windowsnet*64)
MAXMEM="8000"
vmostype="winnetstandard-64"
;;
winnet*|win*2003*|windowsnet*)
MAXMEM="4000"
vmostype="winnetstandard"
;;
winxphome*|windowsxphome*)
MAXMEM="4000"
vmostype="winxphome"
;;
winxp*64|windowsxp*64)
MAXMEM="8000"
vmostype="winxppro-64"
;;
winxp*|windowsxp*)
MAXMEM="4000"
vmostype="winxppro"
;;
winvista*64|windowsvista*64)
MAXMEM="16000"
vmostype="winvista-64"
;;
winvista*|windowsvista*)
MAXMEM="8000"
vmostype="winvista"
;;
win7*64|windows7*64)
MAXMEM="32000"
vmostype="windows7-64"
;;
win7*|windows7*)
MAXMEM="8000"
vmostype="windows7"
;;
win*64)
MAXMEM="16000"
;;
win*)
MAXMEM="8000"
;;
dos|msdos*|ms-dos*)
MAXMEM="128"
vmostype="dos"
;;
*64)
MAXMEM="123456"
;;
*)
MAXMEM="8000"
;;
esac
# 2) other hardware + capabilities
shfolders="FALSE"
case "$vmostype" in
win31)
MAXCORES="1"
sound="sb16"
;;
winnt)
MAXCORES="2"
sound="sb16"
;;
win95|win98|winme)
MAXCORES="1"
;;
win2000pro) # Don't know if Win 2000 supports shared folders, disabled to be safe
MAXCORES="2"
;;
win2000serv)
MAXCORES="4"
;;
win2000advserv)
MAXCORES="8"
;;
winxphome)
MAXCORES="1"
shfolders="TRUE"
;;
winxp*|winvista*|windows7*)
MAXCORES="4"
shfolders="TRUE"
;;
winnet*)
shfolders="TRUE"
;;
linux*|ubuntu*|suse*|debian*)
shfolders="TRUE"
;;
macos*64)
MAXCORES="2"
vmostype="freebsd-64"
;;
macos*)
MAXCORES="1"
vmostype="freebsd"
;;
beos*)
vmostype="other"
;;
# Unknown guestOS setting in .xml - use conservative defaults
*64)
vmostype="other-64"
;;
*)
vmostype="other"
;;
esac
svga_autodetect="TRUE"
real_core_count="$cpu_cores"
[ "$cpu_cores" -gt "$MAXCORES" ] && cpu_cores="$MAXCORES"
# It currently makes no sense to set the virtual number of cores
# to a different value than the virtual number of cores per virtual CPU.
cores_per_socket="$cpu_cores"
if [ "x$shfolders" != "xFALSE" ]; then
ENABLE_SHARE='sharedFolder.option = "alwaysEnabled"'
else
ENABLE_SHARE=''
fi
[ "$mem" -ge "$MAXMEM" ] && mem="$MAXMEM"
[ "$hwver" -lt "7" -a "$mem" -gt "3500" ] && mem="3500"
cap3d="WHAT IS THIS VAR USED FOR?" # helper var for loging output
cat >> "$conffile" <<HEREEND
.encoding = "UTF-8"
config.version = "8"
# general hardware (ehci, 3d accel)
ehci.present = "TRUE"
$FORCE3D
mks.enable3d = "$enable3d"
monitor.virtual_mmu = "automatic"
monitor.virtual_exec = "automatic"
floppy1.clientDevice = "FALSE"
floppy1.readonly = "TRUE"
# id
virtualHW.version = "$hwver"
displayName = "$displayname"
guestOS = "$vmostype"
# CPU/MEM
numvcpus = "$cpu_cores"
cpuid.coresPerSocket = "$cores_per_socket"
maxvcpus = "$real_core_count"
memsize = "$mem"
MemAllowAutoScaleDown = "FALSE"
MemTrimRate = "-1"
# ide-disks
ide0:0.present = "$ide"
ide0:0.fileName = "$vm_diskfile"
## Edited for persistent mode.
ide0:0.mode = "independent-${diskmode}"
##
ide1:0.present = "$cdrom0"
ide1:0.autodetect = "TRUE"
ide1:0.fileName = "auto detect"
ide1:0.deviceType = "cdrom-raw"
ide1:1.present = "$cdrom1"
ide1:1.autodetect = "TRUE"
ide1:1.fileName = "auto detect"
ide1:1.deviceType = "cdrom-raw"
# scsi-disks
scsi0.present = "$scsi"
scsi0:0.present = "$scsi"
scsi0:0.fileName = "$vm_diskfile"
scsi0.virtualDev = "$hddrv"
## Edited for persistent mode.
scsi0:0.mode = "independent-${diskmode}"$stateFileConfiguration
##
# floppies
floppy0.present = "$floppy0"
floppy0.startConnected = "FALSE"
floppy0.autodetect = "TRUE"
floppy0.fileName = "auto detect"
# we need floppy b: for our windows client configuration
floppy1.present = "$floppy1"
floppy1.startConnected = "TRUE"
floppy1.fileType = "file"
floppy1.fileName = "$floppy1name"
# nics
ethernet0.present = "TRUE"
ethernet0.addressType = "static"
$network_virtualDev
ethernet0.connectionType = "$network_kind"
#ethernet1.connectionType = "custom"
#ethernet1.vnet = "/dev/vmnet2"
ethernet0.address = "00:50:56:$macaddrsuffix"
ethernet0.wakeOnPcktRcv = "FALSE"
# sound
sound.present = "TRUE"
sound.fileName = "-1"
sound.autodetect = "TRUE"
sound.virtualdev = "$sound"
# svga
svga.autodetect = "$svga_autodetect"
# usb
usb.present = "TRUE"
usb.generic.autoconnect = "TRUE"
# pci configuration
usb.pciSlotNumber = "16"
ethernet0.pciSlotNumber = "17"
sound.pciSlotNumber = "18"
ehci.pciSlotNumber = "19"
scsi0.pciSlotNumber = "20"
# shared folders
$ENABLE_SHARE
sharedFolder0.present = "$shfolders"
sharedFolder0.enabled = "$shfolders"
sharedFolder0.expiration = "never"
sharedFolder0.guestName = "$sharename"
sharedFolder0.hostPath = "$sharepath"
sharedFolder0.readAccess = "TRUE"
sharedFolder0.writeAccess = "TRUE"
sharedFolder.maxNum = "1"
# dirs/configs
tmpDirectory = "$redodir"
redoLogDir = "$redodir"
mainMem.useNamedFile = "TRUE"
snapshot.disabled = "TRUE"
tools.syncTime = "TRUE"
isolation.tools.hgfs.disable = "FALSE"
hgfs.mapRootShare = "TRUE"
isolation.tools.dnd.disable = "FALSE"
isolation.tools.copy.enable = "TRUE"
isolation.tools.paste.enabled = "TRUE"
# serial port
serial0.present = "$serial"
$serialdev
# parallel port
parallel0.present = "$parallel"
parallel0.bidirectional = "$paralbidi"
$paraldev
HEREEND
# set the appropriate permissions for the vmware config file
chmod u+rwx "${conffile}" >/dev/null 2>&1
}
preferencesheader ()
{
cat > "$vmhome/preferences" <<HEREEND
.encoding = "UTF-8"
# This configuration file was generated by $0
# updates/tips
webUpdate.enabled = "FALSE"
pref.downloadPermission = "deny"
pref.vmplayer.downloadPermission = "deny"
pref.vmplayer.webUpdateOnStartup = "FALSE"
pref.tip.startup = "FALSE"
hints.hideAll = "TRUE"
hint.vmui.showAllUSBDevs = "FALSE"
# configs
prefvmx.defaultVMPath = "$vmhome"
prefvmx.mru.config = "$conffile:"
# hot keys
pref.hotkey.control = "true"
pref.hotkey.alt = "true"
pref.hotkey.shift = "true"
pref.hotkey.gui = "true"
gui.restricted = "true"
# fullscreen/mouse/keyboard
pref.fullscreen.toolbarPixels = "0"
pref.vmplayer.fullscreen.autohide = "TRUE"
pref.grabOnMouseClick = "TRUE"
pref.grabOnKeyPress = "FALSE"
pref.motionGrab = "TRUE"
pref.motionUngrab = "TRUE"
pref.hideCursorOnUngrab = "TRUE"
pref.autoFit = "TRUE"
pref.autoFitFullScreen = "fitGuestToHost"
pref.vmplayer.exit.vmAction = "poweroff"
pref.vmplayer.confirmOnExit = "TRUE"
# shared folders
pref.enableAllSharedFolders = "TRUE"
# eula
HEREEND
# different eula parameters from Workstation 9+/ Player 5+
case "$vmversion" in
3.*|4.*|7.*|8.*)
cat >> "$vmhome/preferences" <<HEREEND
pref.eula.size = "2"
pref.eula.0.appName = "VMware Player"
pref.eula.0.buildNumber = "$vmbuild"
pref.eula.1.appName = "VMware Workstation"
pref.eula.1.buildNumber = "$vmbuild"
HEREEND
;;
5.*|9.*)
# code
cat >> "$vmhome/preferences" <<HEREEND
pref.eula.count = "2"
pref.eula0.product = "VMware Player"
pref.eula0.build = "$vmbuild"
pref.eula1.product = "VMware Workstation"
pref.eula1.build = "$vmbuild"
HEREEND
;;
esac
}
# declaration of default variables
################################################################################
[ "$mem" -gt 3800 -a "$(uname -m)" != "x86_64" ] && mem=3800
# VM-ID static (0D), remove if changed to 00
VM_ID="0D"
# should be dynamic
if [ "x$(which bc)" != "x" ]; then
VM_ID=$(echo "obase=16; $$" | bc)
VM_ID=$(expr substr $VM_ID $(expr ${#VM_ID} - 1) 2)
else
VM_ID=$[ $$ % 100 ]
fi
# temporary disk space for logs, etc...
redodir=/tmp/vmware/${USER}.$$
# dir for configs and vmem file
confdir=/tmp/vmware/${USER}.$$
# configfile
conffile="${confdir}/run-vmware.conf"
# diskfile
diskfile="${vmpath}"
# users vmware config folder
vmhome="${HOME}/.vmware"
# get several version infos for vmware/player
. /opt/openslx/vmchooser/vmware/vmware.conf
vmbuild=$buildversion
vmversion=$version
# VMware start options
# "-X": start in fullscreen
vmopt="-X"
# hardware checks
################################################################################
# use different network card (default e1000, vlance, vmxnet)
if [ -n "${network_card}" ]; then
network_virtualDev="ethernet0.virtualDev = \"${network_card}\""
else
network_virtualDev='# using default virtualDev for ethernet0'
fi
# set standard sound card, overwrite depending on OS (options sb16, es1371, hdaudio)
sound="es1371"
# check for 3D configuration setting
case "$(clean_string "$enable3d")" in
true|yes)
enable3d="TRUE"
;;
*)
enable3d="FALSE"
;;
esac
# check for whitelisted HW-3D
. /opt/openslx/config
FORCE3D=""
if [ -n "$SLX_VMWARE_3D" ]; then
FORCE3D='mks.gl.allowBlacklistedDrivers = "TRUE"'
fi
# serial/parallel port defined (e.g. "ttyS0, lp0" or "autodetect")
case "$serial" in
tty*)
if [ -e "/dev/$serial" ]; then
serialdev="serial0.filename = \"/dev/${serial}\""
serial="TRUE"
else
serialdev="# no serial port configured"
serial="FALSE"
fi
;;
auto*)
serialdev="serial0.autodetect = \"TRUE\""
serial="TRUE"
;;
*)
serialdev="# no serial port configured"
serial="FALSE"
;;
esac
case "$parallel" in
lp*|parport*)
if [ -e "/dev/$parallel" ]; then
paraldev="parallel0.filename = \"/dev/${parallel}\""
paralbidi="TRUE"
parallel="TRUE"
else
paraldev="# no parallel port configured"
paralbidi="FALSE"
parallel="FALSE"
fi
;;
auto*)
paraldev="parallel0.autodetect = \"TRUE\""
paralbidi="TRUE"
parallel="TRUE"
;;
*)
paraldev="# no parallel port configured"
paralbidi="FALSE"
parallel="FALSE"
;;
esac
# check if ide/scsi and hwver of image
# read only the first 30 lines to be sure
imghead=$(head -n 30 "${diskfile}")
## Added to handle persistent snapshots.
if [[ "$originalVMDKFilePath" ]]; then
echo "Select \"${originalVMDKFilePath}\" as information base for \"${diskfile}\"."
imghead=$(head -n 30 "$originalVMDKFilePath") && \
# Support suspend mode.
stateFilePath="$(readlink -f "$(dirname "$diskfile")/"*.vmss)" && \
if [ -f "$stateFilePath" ]; then
echo "Found state file \"$stateFilePath\"." && \
stateFileConfiguration="
checkpoint.vmState = \"$stateFilePath\""
fi
POSTRUN="stateFilePath=\"\$(readlink -f \"${confdir}/\"*.vmss)\" && memoryFilePath=\"\$(readlink -f \"${confdir}/\"*.vmem)\" && [ -f \"\$stateFilePath\" ] && echo \"Saving state and memory file \\\"\$stateFilePath\\\" and \\\"\$memoryFilePath\\\".\" && mv -f \"\$stateFilePath\" \"$(dirname "$diskfile")/\" && mv -f \"\$memoryFilePath\" \"$(dirname "$diskfile")/\""
fi
##
hddrv=$(echo "${imghead}" | grep -m1 -ia "ddb.adapterType" | awk -F '"' '{print $2}')
hwver=$(echo "${imghead}" | grep -m1 -ia "ddb.virtualHWVersion" | awk -F '"' '{print $2}')
case "${hddrv}" in
ide)
ide="TRUE"
scsi="FALSE"
;;
lsilogic|buslogic)
ide="FALSE"
scsi="TRUE"
;;
esac
# write configuration files
################################################################################
# create vmware directories
mkdir -p "$redodir" >/dev/null 2>&1
mkdir -p "$confdir" >/dev/null 2>&1
mkdir -p "$vmhome/dndlogs" >/dev/null 2>&1
touch "$vmhome/dndlogs/dndlog.conf" >/dev/null 2>&1
# create preferences
preferencesheader
# create VMware startup file
runvmwareconfheader
# link to conffile if confdir != redodir
ln -s "$conffile" "$redodir/run-vmware.conf" >/dev/null 2>&1
# sync is needed to ensure that data is really written to virtual disk
sync
# own nvram. We need it for floppy drive b, default nvram has just drive a
# TODO: optimize, currently kinda inefficient, too much copys, but we
# don't know which one is installed...
cp "/opt/openslx/vmchooser/vmware/nvram" "$confdir/nvram" 2>/dev/null
# logging and stdout
################################################################################
# log script information
writelog "# File created by $0 (VMversion ${vmversion})\n# on $(date)\n"
## Edited for persistent mode.
writelog "Starting with ${diskmode} mode ...\n"
##
# write all results to logfile
# log disksetup
writelog "Directories:"
writelog "\tConfdir:\t${confdir}"
writelog "\tConffile:\t${conffile}"
writelog "\tRedodir:\t${redodir}"
writelog "\tVMhome:\t\t${vmhome}"
writelog "\t/tmp info: \
$(grep "/tmp " /proc/mounts) $(df -h | grep " /tmp$" | awk '{print $2}')"
# hw setup
writelog "Hardware:"
writelog "\tMAC:\t\t00:50:56:${VM_ID}:${machostpart}"
if [ -n "${network_card}" ]; then
writelog "\tNet Adaptor:\t${network_card}"
fi
writelog "\tMem:\t\t${mem} MB"
# echo nur wenn hostmem gesetzt
[ -n "${hostmem}" ] && writelog "\tHostmem:\t${hostmem} MB"
writelog "\tMax. res.:\t${xres}x${yres}"
writelog "\tCD-ROM1:\t${cdrom0}"
writelog "\tCD-ROM2:\t${cdrom1}"
writelog "\tFloppy_A:\t${floppy0}"
if [ "${serial}" = "TRUE" ]; then
writelog "\tSerial Port:\t${serialdev}"
fi
if [ "${parallel}" = "TRUE" ]; then
writelog "\tParallel Port:\t${paraldev}"
fi
# image
writelog "Diskimage:"
writelog "\tDiskfile:\t${diskfile}"
writelog "\tDisktype:\t${hddrv}"
writelog "\tHWVersion:\t${hwver}"
writelog "\tVMostype:\t${vmostype}"
# misc
writelog "Misc:"
writelog "\tDisplayname:\t${displayname}"
if [ "${cap3d}" = "TRUE" -a "${enable3d}" = "TRUE" ]; then
writelog "\t3D Graphics:\tenabled"
fi
# empty line at end
writelog ""
# finally set env for run-virt.sh
################################################################################
# configure and start samba service to provide user's home directory
#if [ -f /usr/sbin/smbd ] ; then
# sudo /opt/openslx/bin/sed -i /etc/vmware/smb.conf -e "s,USER,$USER,"
# sudo /usr/sbin/nmbd -s /etc/vmware/smb.conf
# sudo /usr/sbin/smbd -s /etc/vmware/smb.conf
#fi
# For debugging
cp "$conffile" "/tmp/vmware-last-config"
# using the modified version of the wrapper script
VIRTCMD="/opt/openslx/bin/vmplayer"
VIRTCMDOPTS="${vmopt} ${conffile}"
RMDIRS="${redodir} ${conffile}"