diff options
Diffstat (limited to 'core/modules/vmware')
12 files changed, 532 insertions, 169 deletions
diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_static_directory_structure.inc b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_static_directory_structure.inc new file mode 100644 index 00000000..96363de3 --- /dev/null +++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_static_directory_structure.inc @@ -0,0 +1,23 @@ +############################### +# Include: Write config files # +############################### + +writelog "Redo directory: ${redodir}" +writelog "Config directory: ${confdir}" +writelog "Config file: ${conffile}" +writelog "vmhome/dndlogs: ${vmhome}/dndlogs" + +# 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 + +# link to conffile if confdir != redodir +[ "$confdir" != "$redodir" ] && ln -s "$conffile" "$redodir/run-vmware.conf" >/dev/null 2>&1 + +# own nvram. We need it for floppy drive b, default nvram has just drive a +if ! cp "/opt/openslx/vmchooser/vmware/nvram" "$confdir/nvram"; then + slxlog "virt-vmware-nvram" "Could not copy nvram from '/opt/openslx/vmchooser/vmware/nvram' '$confdir/nvram'" +fi + diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmhome_preferences_file.inc b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmhome_preferences_file.inc index b618041c..d50402f3 100644 --- a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmhome_preferences_file.inc +++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmhome_preferences_file.inc @@ -68,4 +68,5 @@ create_vmhome_preferences_file() { echo 'pref.hotkey.rightControl = "true"' >> "$vmhome/preferences" fi writelog "Vmware preferences file created in $vmhome." + true } diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/determine_hardware_limitations.inc b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/determine_hardware_limitations.inc new file mode 100644 index 00000000..11ea2e3a --- /dev/null +++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/determine_hardware_limitations.inc @@ -0,0 +1,185 @@ +######################################## +# Include: Determine hw limitations depending on hwver and guest os # +######################################## + +MAXMEM="9999999" +MAXCORES="4" +shfolders="TRUE" +sound="es1371" + +# define hardware configuration depending on the guest OS used +# this needs to be fixed and is the base for the creation of new VMs +case "$VM_OS_TYPE" in + win31*|windows31*) + VM_OS_TYPE="win31" + shfolders="FALSE" + sound="sb16" + MAXMEM="32" + MAXCORES="1" + ;; + winnt*|windowsnt*) + VM_OS_TYPE="winnt" + shfolders="FALSE" + sound="sb16" + MAXMEM="1000" + MAXCORES="2" + ;; + win95*|windows95*) + VM_OS_TYPE="win95" + shfolders="FALSE" + MAXMEM="96" + MAXCORES="1" + ;; + win98*|windows98*) + VM_OS_TYPE="win98" + MAXMEM="256" + MAXCORES="1" + ;; + winme*|windowsme*) + VM_OS_TYPE="winme" + MAXMEM="384" + MAXCORES="1" + ;; + win2000|windows2000|win2000pro*) + VM_OS_TYPE="win2000pro" + MAXMEM="4000" + MAXCORES="2" + ;; + win2000srv*|windows2000srv*|win2000serv*|windows2000serv*) + VM_OS_TYPE="win2000serv" + shfolders="FALSE" + MAXMEM="4000" + MAXCORES="4" + ;; + win2000adv*|windows2000adv*|win2000dat*|windows2000dat*) + VM_OS_TYPE="win2000advserv" + shfolders="FALSE" + MAXMEM="8000" + MAXCORES="8" + ;; + winnet*64|win*2003*64|windowsnet*64) + VM_OS_TYPE="winnetstandard-64" + MAXMEM="8000" + MAXCORES="8" + ;; + winnet*|win*2003*|windowsnet*) + VM_OS_TYPE="winnetstandard" + MAXMEM="4000" + MAXCORES="8" + ;; + winxphome*|windowsxphome*) + VM_OS_TYPE="winxphome" + MAXMEM="4000" + MAXCORES="2" + ;; + winxp*64|windowsxp*64) + VM_OS_TYPE="winxppro-64" + MAXMEM="8000" + MAXCORES="8" + ;; + winxp*|windowsxp*) + VM_OS_TYPE="winxppro" + MAXMEM="4000" + MAXCORES="4" + ;; + winvista-64) + VM_OS_TYPE="winvista-64" + MAXMEM="16000" + MAXCORES="4" + ;; + windows7-64) + VM_OS_TYPE="windows7-64" + MAXMEM="32000" + MAXCORES="8" + ;; + windows8-64) + VM_OS_TYPE="windows8-64" + MAXMEM="32000" + MAXCORES="8" + ;; + windows9-64) + VM_OS_TYPE="windows9-64" + MAXMEM="64000" + MAXCORES="8" + ;; + winvista) + VM_OS_TYPE="winvista" + MAXMEM="8000" + MAXCORES="2" + ;; + windows7) + VM_OS_TYPE="windows7" + MAXMEM="8000" + MAXCORES="4" + ;; + windows8) + VM_OS_TYPE="windows8" + MAXMEM="8000" + MAXCORES="4" + ;; + windows9) + VM_OS_TYPE="windows9" + MAXMEM="8000" + MAXCORES="4" + ;; + win*64) + MAXMEM="16000" + MAXCORES="4" + ;; + win*) + MAXMEM="8000" + MAXCORES="1" + ;; + dos|msdos*|ms-dos*) + VM_OS_TYPE="dos" + shfolders="FALSE" + MAXMEM="128" + MAXCORES="1" + ;; + macos*64) + VM_OS_TYPE="freebsd-64" + MAXMEM="4000" + MAXCORES="2" + ;; + macos*) + VM_OS_TYPE="freebsd" + MAXMEM="4000" + MAXCORES="1" + ;; + beos*) + VM_OS_TYPE="other" + shfolders="FALSE" + ;; + # Unknown guestOS setting in .xml - this encompasses linux too, + # as there is a multitude of different distributions. Perhaps further + # action will be needed if this leads to problems with exotic OSs. + *64) + VM_OS_TYPE="other-64" + # shfolders="FALSE" + MAXMEM="123456" + MAXCORES="4" + ;; + *) + VM_OS_TYPE="other" + # shfolders="FALSE" + MAXMEM="8000" + MAXCORES="1" + ;; +esac + +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" ] && [ "$SHARE_REMAP_MODE" != 1 ]; then + HGFS_DISABLED="FALSE" +else + HGFS_DISABLED="TRUE" +fi + +[ "$mem" -ge "$MAXMEM" ] && mem="$MAXMEM" +[ "$HWVER" -lt "7" -a "$mem" -gt "3500" ] && mem="3500" + diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/log_config_summary.inc b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/log_config_summary.inc new file mode 100644 index 00000000..41986b2a --- /dev/null +++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/log_config_summary.inc @@ -0,0 +1,60 @@ +################################################## +# Include: Print vm config summary into log file # +################################################## + +# log script information +writelog "# File created by $0 (VMware version ${vmware_version})\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\t$macaddr" +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 "\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 + +writelog "Shared folders:" +if [ "${HGFS_DISABLED}" = "FALSE" ]; then + writelog "\tNo shared folders enabled." +else + writelog "\Shared folders enabled." +fi + +# image +writelog "Diskimage:" +writelog "\tDiskfile:\t${VM_DISKFILE_RO}" +writelog "\tHWVersion:\t${HWVER}" +writelog "\tVMostype:\t${VM_OS_TYPE}" + +# misc +writelog "Misc:" +writelog "\tDisplayname:\t${VM_DISPLAYNAME}" +if [ "${cap3d}" = "TRUE" -a "${enable3d}" = "TRUE" ]; then + writelog "\t3D Graphics:\tenabled" +fi +# empty line at end +writelog "" + diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/parse_vmx.inc b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/parse_vmx.inc index 092abce5..dec80e1d 100644 --- a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/parse_vmx.inc +++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/parse_vmx.inc @@ -1,130 +1,8 @@ ###################################################################### -# Include: Parsing the non-legacy delivered vmxfile $TMPDIR/$IMGUUID # +# Include: Parsing the non-legacy delivered vmxfile ${TMPCONFIG} # ###################################################################### writelog "Parsing virtual machine description file..." -# check for vmdk file marker %VM_DISK_PATH% and put vmdk path in it's place: also VM_DISK_MODE -# and VM_DISK_REDOLOGDIR. -# IMAGE=$(grep -io '<image_path.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }') -sed -i 's#%VM_DISK_PATH%#'"$vm_diskfile"'#g' "$TMPDIR/$IMGUUID" -sed -i 's#%VM_DISK_MODE%#'"independent-nonpersistent"'#g' "$TMPDIR/$IMGUUID" -sed -i 's#%VM_DISK_REDOLOGDIR%#'"$redodir"'#g' "$TMPDIR/$IMGUUID" - -# Ethernet: All we do is entering a generated MAC, as we do not want to interfere -# in the possible case no networking is wanted. -writelog "Guest MAC: $macaddr" -echo 'ethernet0.addressType = "static"' >> "$TMPDIR/$IMGUUID" -echo 'ethernet0.address = "'"${macaddr}"'"' >> "$TMPDIR/$IMGUUID" - -# DVD, CDROM -# XXX: For now it's save to assume ide channel 1 is free, as we support only one HDD, and it it's IDE, it's on channel 0 -cat >> "$TMPDIR/$IMGUUID" <<-HEREEND -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" -HEREEND - -# Floppies: -cat >> "$TMPDIR/$IMGUUID" <<-HEREEND -floppy0.present = "$floppy0" -floppy0.startConnected = "FALSE" -floppy0.autodetect = "TRUE" -floppy0.fileName = "auto detect" -floppy1.present = "$floppy1" -floppy1.startConnected = "TRUE" -floppy1.fileType = "file" -floppy1.fileName = "$floppy1name" -HEREEND - -writelog "numvcpus = ${cpu_cores} - maxvcpus=${real_core_count}" - -# RAM, CPUs -cat >> "$TMPDIR/$IMGUUID" <<-HEREEND -numvcpus = "$cpu_cores" -cpuid.coresPerSocket = "$cores_per_socket" -maxvcpus = "$real_core_count" -memsize = "$mem" -MemAllowAutoScaleDown = "FALSE" -MemTrimRate = "-1" -HEREEND - -# USB -if [ -n "$SLX_EXAM" ]; then - # Exam mode: No USB (TODO: Configurable) - sed -i '/^usb\./d' "$TMPDIR/$IMGUUID" - echo 'usb.present = "FALSE"' >> "$TMPDIR/$IMGUUID" -else - cat >> "$TMPDIR/$IMGUUID" <<-HEREEND - usb.present = "TRUE" - usb.generic.autoconnect = "TRUE" - HEREEND -fi - -# shared folders -cat >> "$TMPDIR/$IMGUUID" <<-HEREEND -$ENABLE_SHARE -sharedFolder0.present = "$shfolders" -sharedFolder0.enabled = "$shfolders" -sharedFolder0.expiration = "never" -sharedFolder0.guestName = "$homesharename" -sharedFolder0.hostPath = "$homesharepath" -sharedFolder0.readAccess = "TRUE" -sharedFolder0.writeAccess = "TRUE" -sharedFolder1.present = "$shfolders" -sharedFolder1.enabled = "$shfolders" -sharedFolder1.expiration = "never" -sharedFolder1.guestName = "$commonsharename" -sharedFolder1.hostPath = "$commonsharepath" -sharedFolder1.readAccess = "TRUE" -sharedFolder1.writeAccess = "FALSE" -sharedFolder.maxNum = "2" -hgfs.mapRootShare = "TRUE" -hgfs.linkRootShare = "TRUE" -HEREEND - -# Isolation tools: settings -# It should be verified whether and when entries necessary -cat >> "$TMPDIR/$IMGUUID" <<-HEREEND -isolation.tools.hgfs.disable = "FALSE" -isolation.tools.dnd.disable = "FALSE" -isolation.tools.copy.enable = "TRUE" -isolation.tools.paste.enabled = "TRUE" -HEREEND - -# Serial, parallel: Empty, nothing is being currently set. TODO later. - -# Graphics, GPU: 3D will be enabled (even if vmware doesn't support the chip) if we whitelisted it. -if [ -n "$SLX_VMWARE_3D" ]; then - writelog "FORCE3D set - overriding 3D in vmx file." - echo 'mks.gl.allowBlacklistedDrivers = "TRUE"' >> "$TMPDIR/$IMGUUID" - # We override... play safe and cap the hwVersion to 10, since some i915 chips goofed up with 12 - # Investigate if we might have to do this in other cases where we don't override - if grep -qi '^mks.enable3d.*true' "$TMPDIR/$IMGUUID"; then - vmw_cap_hw_version "10" - fi -else - writelog "FORCE3D not set - 3D will only work if GPU/driver is whitelisted by vmware." -fi - -# Disable DPI scaling information passing via vmware tools -sed -i '/^gui.applyHostDisplayScaling/d' "$TMPDIR/$IMGUUID" -echo 'gui.applyHostDisplayScalingToGuest = "FALSE"' >> "$TMPDIR/$IMGUUID" - -# Additinal exam mode settings -if [ -n "$SLX_EXAM" ]; then - echo 'gui.restricted = "true"' >> "$TMPDIR/$IMGUUID" -fi - -# Killing duplicate lines (output much nicer than sort -u): -awk '!a[$0]++' "${TMPDIR}/${IMGUUID}" > "${TMPDIR}/${IMGUUID}.tmp" && mv "${TMPDIR}/${IMGUUID}.tmp" "${TMPDIR}/${IMGUUID}" - -# At last_ Let's copy it to $confdir/run-vmware.conf -cp -p "$TMPDIR/$IMGUUID" "$conffile" && writelog "Copied TMPDIR/IMGUUID ${TMPDIR}/${IMGUUID} to conffile ${conffile}" || \ - ( writelog "Could not copy TMPDIR/IMGUUID -$TMPDIR/$IMGUUID- to conffile ${conffile}!"; cleanexit 1 ) +HWVER=$(grep -i -m1 '^virtualHW.version *= *' "${TMPCONFIG}" | awk -F '=' '{print $2}' | sed -r 's/[^0-9]//g') diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_vmware_include_variables.inc b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_vmware_include_variables.inc index 0c45ee59..da820bc6 100644 --- a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_vmware_include_variables.inc +++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_vmware_include_variables.inc @@ -3,8 +3,6 @@ ##################################################################### set_vmware_include_variables() { - [ "$mem" -gt 3800 -a "$(uname -m)" != "x86_64" ] && mem=3800 - # temporary disk space for logs, etc... redodir="/tmp/virt/vmware/${USER}.$$" @@ -14,9 +12,6 @@ set_vmware_include_variables() { # configfile conffile="${confdir}/run-vmware.conf" - # diskfile - diskfile="${vmpath}" - # users vmware config folder [ -z "${HOME}" ] && HOME=$(getent passwd "$(whoami)" | awk -F ':' '{print $6}') vmhome="${HOME}/.vmware" diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_final_vmx.inc b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_final_vmx.inc new file mode 100644 index 00000000..f1395369 --- /dev/null +++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_final_vmx.inc @@ -0,0 +1,211 @@ + +# check for vmdk file marker %VM_DISK_PATH% and put vmdk path in it's place: also VM_DISK_MODE +# and VM_DISK_REDOLOGDIR. +sed -i 's#%VM_DISK_PATH%#'"$VM_DISKFILE_RO"'#g' "${TMPCONFIG}" +sed -i 's#%VM_DISK_MODE%#'"independent-nonpersistent"'#g' "${TMPCONFIG}" +sed -i 's#%VM_DISK_REDOLOGDIR%#'"$redodir"'#g' "${TMPCONFIG}" + +# Ethernet: All we do is entering a generated MAC, as we do not want to interfere +# in the possible case no networking is wanted. +writelog "Guest MAC: $macaddr" +echo 'ethernet0.addressType = "static"' >> "${TMPCONFIG}" +echo 'ethernet0.address = "'"${macaddr}"'"' >> "${TMPCONFIG}" + +# DVD, CDROM +# XXX: For now it's safe to assume ide channel 1 is free, as we support only one HDD, and if it's IDE, it's on channel 0 +cat >> "${TMPCONFIG}" <<-HEREEND +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" +HEREEND + +if [ -n "$FLOPPYIMG" ]; then + floppy1="TRUE" +else + floppy1="FALSE" +fi + +# Floppies: +cat >> "${TMPCONFIG}" <<-HEREEND +floppy0.present = "$floppy0" +floppy0.startConnected = "FALSE" +floppy0.autodetect = "TRUE" +floppy0.fileName = "auto detect" +floppy1.present = "$floppy1" +floppy1.startConnected = "TRUE" +floppy1.fileType = "file" +floppy1.fileName = "$FLOPPYIMG" +HEREEND + +writelog "numvcpus = ${cpu_cores} - maxvcpus=${real_core_count}" + +# RAM, CPUs +cat >> "${TMPCONFIG}" <<-HEREEND +numvcpus = "$cpu_cores" +cpuid.coresPerSocket = "$cores_per_socket" +maxvcpus = "$real_core_count" +memsize = "$mem" +MemAllowAutoScaleDown = "FALSE" +MemTrimRate = "-1" +HEREEND + +# USB fallback: Only write usb config if there's none +if ! grep -q -i "^usb\.present" "${TMPCONFIG}"; then + # Nothing found, go ahead + if [ -n "$SLX_EXAM" ]; then + # Exam mode: Default to no USB + sed -i '/^usb\./Id' "${TMPCONFIG}" + echo 'usb.present = "FALSE"' >> "${TMPCONFIG}" + else + cat >> "${TMPCONFIG}" <<-HEREEND + usb.present = "TRUE" + HEREEND + fi +fi +sed -i '/^usb\.generic\.autoconnect/Id' "${TMPCONFIG}" +echo 'usb.generic.autoconnect = "TRUE"' >> "${TMPCONFIG}" +# USB 3.0 support changes quality and has different side effects +# with every minor release of vmware. Always force 2.0 for now. +# TODO: Get it fixed by vmware? +sed -i '/^ehci\.present/Id;/^usb_xhci\.present/Id' "${TMPCONFIG}" +echo 'ehci.present = "TRUE"' >> "${TMPCONFIG}" + +# shared folders +if [ "$HGFS_DISABLED" = "FALSE" ]; then + cat >> "${TMPCONFIG}" <<-HEREEND + sharedFolder.option = "alwaysEnabled" + sharedFolder0.present = "$shfolders" + sharedFolder0.enabled = "$shfolders" + sharedFolder0.expiration = "never" + sharedFolder0.guestName = "$homesharename" + sharedFolder0.hostPath = "$homesharepath" + sharedFolder0.readAccess = "TRUE" + sharedFolder0.writeAccess = "TRUE" + sharedFolder1.present = "$shfolders" + sharedFolder1.enabled = "$shfolders" + sharedFolder1.expiration = "never" + sharedFolder1.guestName = "$commonsharename" + sharedFolder1.hostPath = "$commonsharepath" + sharedFolder1.readAccess = "TRUE" + sharedFolder1.writeAccess = "FALSE" + sharedFolder.maxNum = "2" + hgfs.mapRootShare = "TRUE" + hgfs.linkRootShare = "TRUE" + HEREEND +fi + +# Isolation tools: settings +cat >> "${TMPCONFIG}" <<-HEREEND +isolation.tools.hgfs.disable = "$HGFS_DISABLED" +isolation.tools.dnd.disable = "FALSE" +isolation.tools.copy.enable = "TRUE" +isolation.tools.paste.enabled = "TRUE" +HEREEND + +# Serial port +if [ -n "$serial_0" ]; then + cat >> "${TMPCONFIG}" <<-HEREEND + serial0.present = "TRUE" + serial0.startConnected = "TRUE" + serial0.fileType = "device" + serial0.fileName = "$serial_0" + serial0.tryNoRxLoss = "FALSE" + serial0.autodetect = "FALSE" + HEREEND +fi + +# Parallel port +if [ -n "$parallel_0" ]; then + cat >> "${TMPCONFIG}" <<-HEREEND + parallel0.present = "TRUE" + parallel0.startConnected = "TRUE" + parallel0.fileType = "device" + parallel0.fileName = "$parallel_0" + parallel0.bidirectional = "TRUE" + parallel0.autodetect = "FALSE" + HEREEND +fi + +# Graphics, GPU: 3D will be enabled (even if vmware doesn't support the chip) if we whitelisted it. +if [ -n "$SLX_VMWARE_3D" ]; then + writelog "FORCE3D set - overriding 3D in vmx file." + echo 'mks.gl.allowBlacklistedDrivers = "TRUE"' >> "${TMPCONFIG}" + # We override... play safe and cap the hwVersion to 10, since some i915 chips goofed up with 12 + # Investigate if we might have to do this in other cases where we don't override + if grep -qi '^mks.enable3d.*true' "${TMPCONFIG}"; then + vmw_cap_hw_version "10" + fi +else + writelog "FORCE3D not set - 3D will only work if GPU/driver is whitelisted by vmware." +fi + +# Disable DPI scaling information passing via vmware tools +sed -i '/^gui.applyHostDisplayScaling/Id' "${TMPCONFIG}" +echo 'gui.applyHostDisplayScalingToGuest = "FALSE"' >> "${TMPCONFIG}" + +# Additinal exam mode settings +if [ -n "$SLX_EXAM" ]; then + echo 'gui.restricted = "true"' >> "${TMPCONFIG}" +fi + +# Hack resolution if we know the desired one is not in the default list of vmx_svga +# For now, only do it on the odd ones, as we don't know if this has any side effects +# This seems unnecessary on Win7 but is required on WinXP - need more research for other OSs +case "$RESOLUTION" in + 1600x900|2560x1440|2880x1800|3200x1800) + X=${RESOLUTION%x*} + Y=${RESOLUTION#*x} + BYTES=$(( ( ( X * Y * 4 + 65535 ) / 65536 ) * 65536 )) + [ "$BYTES" -lt 16777216 ] && BYTES=16777216 + cat >> "${TMPCONFIG}" <<-EOF + svga.autodetect = "FALSE" + svga.vramSize = $BYTES + svga.maxWidth = $X + svga.maxHeight = $Y + EOF + ;; +esac + +# Killing duplicate lines (output much nicer than sort -u): +awk '!a[$0]++' "${TMPCONFIG}" > "${TMPCONFIG}.tmp" && mv -f "${TMPCONFIG}.tmp" "${TMPCONFIG}" + +# Apply $maxhardwareversion to final VMX +if [ -n "$HWVER" ] && [ "$HWVER" -gt "$maxhardwareversion" ]; then + writelog "Hardware version capped to $maxhardwareversion (was $HWVER)" + sed -i 's/^virtualHW\.version.*$/virtualHW.version = "'$maxhardwareversion'"/I' "${TMPCONFIG}" + HWVER="$maxhardwareversion" +fi + +# Enable nested virtualization if not specified in remote vmx +if [ -e "/run/hwinfo" ] && ! grep -qi '^vhv\.enable' "${TMPCONFIG}" \ + && grep -qE '^flags\s*:.*\b(ept|npt)\b' "/proc/cpuinfo" \ + && [ "$HWVER" -ge "9" ]; then + . "/run/hwinfo" + [ "${HW_KVM}" = "ENABLED" ] && echo 'vhv.enable = "TRUE"' >> "${TMPCONFIG}" +fi +# TODO: Need a way to check if supported by hardware before enabling! +#grep -qi '^vpmc\.enable' "${TMPCONFIG}" || echo 'vpmc.enable = "TRUE"' >> "${TMPCONFIG}" + +# Disable space check warnings +sed -i '/^mainMem.freeSpaceCheck/Id' "${TMPCONFIG}" +echo 'mainMem.freeSpaceCheck = "FALSE"' >> "${TMPCONFIG}" + +# See if there are any USB devices connected that we want to pass through immediately +get_usb_devices 'usb.autoConnect.deviceXXXXX = "0x%VENDOR%:0x%PRODUCT%"' \ + | sed -r 's/0x0+/0x/g' \ + | awk '{sub(/XXXXX/,NR-1)}1' \ + >> "${TMPCONFIG}" + +# At last_ Let's copy it to $confdir/run-vmware.conf +if cp -p "${TMPCONFIG}" "$conffile"; then + writelog "Copied TMPDIR/IMGUUID ${TMPCONFIG} to conffile ${conffile}" +else + writelog "Could not copy TMPDIR/IMGUUID -${TMPCONFIG}- to conffile ${conffile}!" + cleanexit 1 +fi + diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/run-virt.include b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/run-virt.include index e25947e0..f66bc9b8 100644 --- a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/run-virt.include +++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/run-virt.include @@ -20,7 +20,7 @@ ################################################################################ VMWAREINCLUDEDIR=/opt/openslx/vmchooser/vmware/includes -vmostype=$(rv_clean_string "$vmostype") +VM_OS_TYPE=$(rv_clean_string "$VM_OS_TYPE") # declaration of default variables for vmware source "${VMWAREINCLUDEDIR}/set_vmware_include_variables.inc" && set_vmware_include_variables @@ -33,39 +33,23 @@ vmw_cap_hw_version() { [ "$1" -lt "$maxhardwareversion" ] && maxhardwareversion="$1" } -if [ "$LEGACY" ]; then - # hardware checks - source "${VMWAREINCLUDEDIR}/set_hardware_legacy.inc" && set_hardware_legacy - # write configuration files - # write_config_files calls: - # set_vmhome_preferences_header - # set_vmware_startup_file - source "${VMWAREINCLUDEDIR}/write_config_files_legacy.inc" && write_config_files_legacy -else - # write configuration files - source "${VMWAREINCLUDEDIR}/write_config_files.inc" +# get information from downloaded vmx +source "${VMWAREINCLUDEDIR}/parse_vmx.inc" - # parse the given vmx file - source "${VMWAREINCLUDEDIR}/parse_vmx.inc" -fi +# determine limitations wrt RAM and CPU count of VM +source "${VMWAREINCLUDEDIR}/determine_hardware_limitations.inc" -# logging and stdout -# needs writelog() from vmchooser-run_virt -source "${VMWAREINCLUDEDIR}/logging.inc" && logging +# create file and directory structure for vmware setup +source "${VMWAREINCLUDEDIR}/create_static_directory_structure.inc" -# Apply $maxhardwareversion to final VMX -HWVER=$(grep -i '^virtualHW.version *= *' "$conffile" | head -n 1 | awk -F '=' '{print $2}' | sed -r 's/[^0-9]//g') -if [ -n "$HWVER" ] && [ "$HWVER" -gt "$maxhardwareversion" ]; then - writelog "Hardware version capped to $maxhardwareversion (was $HWVER)" - sed -i 's/^virtualHW\.version.*$/virtualHW.version = "'$maxhardwareversion'"/I' "$conffile" -fi +# create preferences file ${vmhome}/preferences +source "${VMWAREINCLUDEDIR}/create_vmhome_preferences_file.inc" && create_vmhome_preferences_file -# See if there are any USB devices connected that we want to pass through immediately -get_usb_devices 'usb.autoConnect.deviceXXXXX = "0x%VENDOR%:0x%PRODUCT%"' \ - | sed -r 's/0x0+/0x/g' \ - | awk '{sub(/XXXXX/,NR-1)}1' \ - >> "$conffile" +# parse the given vmx file +source "${VMWAREINCLUDEDIR}/write_final_vmx.inc" +# print summary - needs writelog() from vmchooser-run_virt +source "${VMWAREINCLUDEDIR}/log_config_summary.inc" # For debugging cp "$conffile" "/tmp/vmware-last-config" diff --git a/core/modules/vmware/module.build b/core/modules/vmware/module.build index bac61583..f321b084 100644 --- a/core/modules/vmware/module.build +++ b/core/modules/vmware/module.build @@ -1,12 +1,12 @@ fetch_source() { - [ -e "${MODULE_WORK_DIR}/src" -a -d "${MODULE_WORK_DIR}/src" ] && \ + [ -d "${MODULE_WORK_DIR}/src" ] && \ { rm -r "${MODULE_WORK_DIR}/src" || perror "Could not delete old src dir."; } mkdir -p "${MODULE_WORK_DIR}/src" || perror "Could not mkdir src" - cd "${MODULE_WORK_DIR}/src" || perror "cd fail." + cd "${MODULE_WORK_DIR}/src" || perror "cd to '${MODULE_WORK_DIR}/src' failed." # Get directory listing wget -O "index.html" "$REQUIRED_DOWNLOAD_BASE" || perror "Could not download vmware dir index" - + VMWARE_BUNDLE_FILE=$(grep -E -o -i "href=\"VMware-$REQUIRED_TYPE-[^\"]+[\._\-]$ARCHREGEX[\._\-][^\"]+\"" "index.html" | head -n 1 | awk -F '"' '{printf $2}') [ -z "$VMWARE_BUNDLE_FILE" ] && perror "Could not determine vmware $REQUIRED_TYPE bundle file for current arch from $MODULE_WORK_DIR/src/index.html" # Download file @@ -34,11 +34,11 @@ build() { # prepare the build directory with the files needed during the chroot cp "${MODULE_WORK_DIR}/src/$VMWARE_BUNDLE_FILE" "${MODULE_BUILD_DIR}/$VMWARE_BUNDLE_FILE" - cp -r "${MODULE_WORK_DIR}/patches" "${MODULE_BUILD_DIR}" + cp -r "${MODULE_DIR}/patches" "${MODULE_BUILD_DIR}" # sanity check to see if KERNEL_HEADERS_DIR is set and exists [ -z "${KERNEL_HEADERS_DIR}" -o ! -e "${KERNEL_HEADERS_DIR}" ] && perror "KERNEL_HEADERS_DIR ('"${KERNEL_HEADERS_DIR}"') not found. Was the kernel module built?" - + # build in two steps, to be able to use mltk function while patching modules pinfo "Installing vmware per chroot..." chroot_run "${MODULE_BUILD_DIR}" <<-EOF @@ -54,7 +54,7 @@ build() { for KMOD in *.tar; do SHORT="${KMOD%%.tar}" [ -e ".${SHORT}.patched" ] && continue - for PATCH in $(find "${MODULE_WORK_DIR}/patches/" -name "${SHORT}__*__*.patch"); do + for PATCH in $(find "${MODULE_DIR}/patches/" -name "${SHORT}__*__*.patch"); do parse_patch_name "$PATCH" [ -z "${MIN_KERN}" -o -z "${MAX_KERN}" ] && perror "Could not parse patch filename" if version_lt "$TARGET_KERNEL_SHORT" "$MIN_KERN" || version_gt "$TARGET_KERNEL_SHORT" "$MAX_KERN"; then @@ -101,7 +101,7 @@ build() { # This file was formerly stored in data/opt/openslx/vmchooser/vmware/vmware.conf. mkdir -p "${MODULE_BUILD_DIR}/opt/openslx/vmchooser/vmware/" || perror "could not mkdir "${MODULE_BUILD_DIR}/opt/openslx/vmchooser/vmware/"." - + cat > "${MODULE_BUILD_DIR}/opt/openslx/vmchooser/vmware/vmware.conf" <<-EOF # configuration file written by vmware/module.build vmnet0=true @@ -127,7 +127,7 @@ post_copy() { tarcopy "$(find /usr/lib/ /usr/lib64 -name gconv -type d)" "$TARGET_BUILD_DIR" # Update Icon cache for vmplayer - gtk-update-icon-cache-3.0 "${TARGET_BUILD_DIR}/usr/share/icons/hicolor/" || pwarning "update-icon-cache-3.0 failed." + gtk-update-icon-cache-3.0 "${TARGET_BUILD_DIR}/usr/share/icons/hicolor/" || pwarning "update-icon-cache-3.0 failed." # fix vmware-usbarbitrator bug date +'%Y.%m.%d' >"${TARGET_BUILD_DIR}/etc/arch-release" diff --git a/core/modules/vmware/module.conf b/core/modules/vmware/module.conf index 697ba546..02770c34 100644 --- a/core/modules/vmware/module.conf +++ b/core/modules/vmware/module.conf @@ -1,4 +1,4 @@ -REQUIRED_DOWNLOAD_BASE="http://softwareupdate.vmware.com/cds/vmw-desktop/ws/12.1.0/3272444/linux/core/" +REQUIRED_DOWNLOAD_BASE="http://softwareupdate.vmware.com/cds/vmw-desktop/ws/12.5.2/4638234/linux/core/" REQUIRED_TYPE="workstation" REQUIRED_MODULES="kernel" REQUIRED_DIRECTORIES=" @@ -38,8 +38,8 @@ REQUIRED_VMWARE_DELETIONS=" /etc/cups/thnuclnt.convs /etc/cups/thnuclnt.types /etc/modprobe.d/vmware-fuse.conf - /lib/modules/3.11.0-13-generic/misc/vmnet.ko - /lib/modules/3.11.0-13-generic/misc/vmmon.ko + /lib/modules/*-generic/misc/vmnet.ko + /lib/modules/*-generic/misc/vmmon.ko /usr/share/mime/packages/vmware-player.xml /usr/share/applications/vmware* /usr/share/desktop-directories/vmware-ace-vms.directory diff --git a/core/modules/vmware/patches/vmmon__4.9__12.0.0-12.5.2.patch b/core/modules/vmware/patches/vmmon__4.9__12.0.0-12.5.2.patch new file mode 100644 index 00000000..054dd8a1 --- /dev/null +++ b/core/modules/vmware/patches/vmmon__4.9__12.0.0-12.5.2.patch @@ -0,0 +1,13 @@ +--- a/linux/hostif.c 2016-12-22 14:27:00.425933040 +0100 ++++ b/linux/hostif.c 2016-12-22 14:27:38.746706220 +0100 +@@ -1162,7 +1162,9 @@ + int retval; + + down_read(¤t->mm->mmap_sem); +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0) ++ retval = get_user_pages((unsigned long)uvAddr, numPages, 0, ppages, NULL); ++#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0) + retval = get_user_pages((unsigned long)uvAddr, numPages, 0, 0, ppages, NULL); + #else + retval = get_user_pages(current, current->mm, (unsigned long)uvAddr, diff --git a/core/modules/vmware/patches/vmnet__4.9__12.0.0-12.5.2.patch b/core/modules/vmware/patches/vmnet__4.9__12.0.0-12.5.2.patch new file mode 100644 index 00000000..18ef062b --- /dev/null +++ b/core/modules/vmware/patches/vmnet__4.9__12.0.0-12.5.2.patch @@ -0,0 +1,13 @@ +--- a/userif.c 2016-12-22 14:29:43.237218623 +0100 ++++ b/userif.c 2016-12-22 14:31:03.258834075 +0100 +@@ -113,7 +113,9 @@ + int retval; + + down_read(¤t->mm->mmap_sem); +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0) ++ retval = get_user_pages(addr, 1, 0, &page, NULL); ++#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0) + retval = get_user_pages(addr, 1, 1, 0, &page, NULL); + #else + retval = get_user_pages(current, current->mm, addr, |