#! /bin/sh # check if the configuration file is available if [ -e /initramfs/plugin-conf/vmware.conf ]; then # load needed variables . /initramfs/plugin-conf/vmware.conf # Test if this plugin is activated if [ $vmware_active -ne 0 ]; then [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'vmware' os-plugin ..."; # Load general configuration . /initramfs/machine-setup # we need to load the function file for: # uri_token, testmkd . /etc/functions # D_INITDIR is defined in the following file: . /etc/sysconfig/config echo " * vmware part 1" ############################################################################# # vmware stuff first part: two scenarios # * VM images in /usr/share/vmware - then simply link # * VM images via additional mount (mount source NFS, NBD, ...) if [ "x${vmware}" != "x" ] && [ "x${vmware}" != "xno" ] ; then # map slxgrp to pool, so it's better to understand pool=${slxgrp} # if we dont have slxgrp defined [ -z "${pool}" ] && pool="default" # get source of vmware image server (get type, server and path) if strinstr "/" "${vmware}" ; then vmimgprot=$(uri_token ${vmware} prot) vmimgserv=$(uri_token ${vmware} server) vmimgpath="$(uri_token ${vmware} path)" fi if [ -n "${vmimgserv}" ] ; then testmkd /mnt/var/lib/vmware case "${vmimgprot}" in *nbd) ;; lbdev) # we expect the stuff on toplevel directory, filesystem type should be # autodetected here ... (vmimgserv is blockdev here) vmbdev=/dev/${vmimgserv} waitfor ${vmbdev} 20000 echo -e "ext2\nreiserfs\nvfat\nxfs" >/etc/filesystems mount -o ro ${vmbdev} /mnt/var/lib/vmware || error "$scfg_evmlm" nonfatal ;; *) # we expect nfs mounts here ... for proto in tcp udp fail; do [ $proto = "fail" ] && { error "$scfg_nfs" nonfatal; noimg=yes; break;} mount -n -t nfs -o ro,nolock,$proto ${vmimgserv}:${vmimgpath} \ /mnt/var/lib/vmware && break done ;; esac fi fi echo " * vmware part 2" ############################################################################# # vmware stuff second part: setting up the environment # create needed directories and files if [ "x${vmware}" != "x" ] && [ "x${vmware}" != "xno" ] ; then for i in /etc/vmware/vmnet1/dhcpd /etc/vmware/vmnet8/nat \ /etc/vmware/vmnet8/dhcpd /var/run/vmware /etc/vmware/loopimg \ /etc/vmware/fd-loop /var/X11R6/bin /etc/X11/sessions; do testmkd /mnt/$i done # create needed devices (not created automatically via module load) for i in "/dev/vmnet0 c 119 0" "/dev/vmnet1 c 119 1" \ "/dev/vmnet8 c 119 8" "/dev/vmmon c 10 165"; do mknod $i done # create the vmware startup configuration file /etc/vmware/locations # fixme --> ToDo # echo -e "answer VNET_8_NAT yes\nanswer VNET_8_HOSTONLY_HOSTADDR \n\ #192.168.100.1\nanswer VNET_8_HOSTONLY_NETMASK 255.255.255.0\n\ #file /etc/vmware/vmnet8/dhcpd/dhcpd.conf\n\ # remove_file /etc/vmware/not_configured" >/mnt/etc/vmware/locations chmod 0700 /dev/vmnet* chmod 1777 /mnt/etc/vmware/fd-loop # loop file for exchanging information between linux and vmware guest if modprobe ${MODPRV} loop; then mdev -s else : #|| error "" nonfatal fi # mount a clean tempfs (bug in UnionFS prevents loopmount to work) strinfile "unionfs" /proc/mounts && \ mount -n -o size=1500k -t tmpfs vm-loopimg /mnt/etc/vmware/loopimg # create an empty floppy image of 1.4MByte size dd if=/dev/zero of=/mnt/etc/vmware/loopimg/fd.img \ count=2880 bs=512 2>/dev/null chmod 0777 /mnt/etc/vmware/loopimg/fd.img # use dos formatter from rootfs (later stage4) LD_LIBRARY_PATH=/mnt/lib /mnt/sbin/mkfs.msdos \ /mnt/etc/vmware/loopimg/fd.img >/dev/null 2>&1 #|| error mount -n -t msdos -o loop,umask=000 /mnt/etc/vmware/loopimg/fd.img \ /mnt/etc/vmware/fd-loop echo -e "usbfs\t\t/proc/bus/usb\tusbfs\t\tauto\t\t 0 0" >> /mnt/etc/fstab # needed for VMware 5.5.3 and versions below echo -e "\tmount -t usbfs usbfs /proc/bus/usb 2>/dev/null" \ >>/mnt/etc/${D_INITDIR}/boot.slx # TODO: we still use this function? Prove if we can delete it. config_vmware chmod 1777 /mnt/var/run/vmware # define a variable where gdm/kdm should look for additional sessions # do we really need it? looks like we can delete it... # export vmsessions=/var/lib/vmware/vmsessions # we configured vmware, so we can delete the not_configured file rm /mnt/etc/vmware/not_configured 2>/dev/null # copy dhcpd.conf and nat for vmnet8 (nat) # fixme: It should be possible to start just one vmware dhcp which should # listen to both interfaces vmnet1 and vmnet8 ... #TODO: copy it from plugin source... cp /mnt/var/lib/vmware/templates/dhcpd.conf \ /mnt/etc/vmware/vmnet8/dhcpd 2>/dev/null cp /mnt/var/lib/vmware/templates/nat.conf \ /mnt/etc/vmware/vmnet8/nat 2>/dev/null fi # TODO: plugin should copy it... find out how # TODO: perhaps we can a) kick out vmdir # b) configure vmdir by plugin configuration # TODO: How to start it. See Wiki. Currently a) implemnted # a) we get get information and start the programm with # /var/X11R6/bin/run-vmware.sh "$imagename" "$name_for_vmwindow" "$ostype_of_vm" "$kind_of_network" # b) we write a wrapper and get the xml-file as attribute cat < /mnt/var/X11R6/bin/run-vmware.sh #!/bin/bash # # Description: Script for preparing VMware environment Diskless # X Stations and interactive session chooser (v4) # # Author(s): see project authors file # letzte Ă„nderung Dirk, 15.10. # Copyright: (c) 2003, 2006 - RZ Universitaet Freiburg # # Version: 0.16.611 # ################################################################################ ################################################################################ ## ## Put $HOME to another location ## ################################################################################ # We need to change $HOME so it saves everything to /tmp #export HOME="/tmp/${USER}" # following mkdir we have now twice in this script... but better twice # as not seperated. Now its no problem to delete this # "Put $HOME to another location" section later #mkdir /tmp/${USER} #ln -s /home/${USER}/.Xauthority /tmp/${USER}/.Xauthority ### VARIABLES SECTION ########################################################## ## ## declaration of default variables ## ################################################################################ ## "static" variables only changed within the script # The PATH... export PATH="\${PATH}:/var/X11R6/bin:/usr/X11R6/bin" # Last two values for MAC address mac= # memory information. permem is value to calculate needed memory mem= totalmem= permem=66 # virtual fd/cd/dvd and drive devices, floppy b: for configuration #floppya is always false, if we have a floppy device or not isn't #important. floppya="FALSE" floppyb="TRUE" floppybname="/etc/vmware/loopimg/fd.img" cdr_1="FALSE" cdr_2="FALSE" # ide is expected default, test for the virtual disk image type should # be done while creating the runscripts ... ide="TRUE" scsi="FALSE" hddrv="lsilogic" # Displayresolution needed for vmware.config hostres=\$(xvidtune -show 2>/dev/null| grep -ve "^$") xres=\$(echo "\${hostres}" | awk '{print \$3}') yres=\$(echo "${hostres}" | awk '{print \$7}') # VMplayer buildversion vmbuild= # VMware start options #-X = fullscreen vmopt="-X" # temporary disk space for logs, etc... # use /tmp/vmware/\${USER} if /tmp sits on NFS import export tmpdir=/tmp/\${USER} # configfile confile="\${tmpdir}/runvmware.conf" # users vmware config folder vmhome="\${HOME}/.vmware" #vmhome="/tmp/\${USER}/.vmware" # unknow variables needed vor vmwplayer configuration confver=8 hver=4 # set hostname: using original hostname and adding string "-vm" # variable isn't used anywhere in this script. but still works (however) # TODO: Test it commented out hostname="VM-\${HOST}" # Folder of VirtualMachine Images vmdir="/var/lib/vmware" # special Variables, persistence vmware? #TODO: do we really need it? Should be everywhere nonpersistent np="independent-nonpersistent" ######## ## TODO: everything clean till here ######## # File if its a link. Stupid crap #TODO: perhaps we don't need it rightsfile= #TODO: don't know what it is for. check later noimage=0 # image checking variable filecheck= ## Image depending variables. This values will be changed by the script # vmware image file imagename="\$1" diskfile="\${vmdir}/\${imagename}" #TODO: check for a faster way, perhaps we should put this into XML # oh - yeah!! Why not do it on the SERVER??? It has enough power and has # to do it once and not during every start on a client :) #grepping every file could take much (network) resources. And if its #an IDE Image, but has somewhere the string ddb.adapterType stuff can #become screwed # NOOOOOOO - We do not check on every start on every client!!! # check if IDE or SCSI #hddrv=\$(grep -m 1 -ia "ddb.adapterType" \${diskfile} | awk -F "\"" '{print \$2}') #if [ "\${hddrv}" = "ide" ]; then # ide="TRUE" # scsi="FALSE" #elif [ "\${hddrv}" = "lsilogic" ]; then # ide="FALSE" # scsi="TRUE" #elif [ "\${hddrv}" = "buslogic" ]; then # ide="FALSE" # scsi="TRUE" #fi # define name for VMware window displayname="\$2" # Definition of the client system vmostype="\$3" # Definition of the client system network="\$4" # command line variables # start with this this default commmand line options + extra # TODO: defaults laut datei --include /var/lib/vmware/tmpl/winconfig # --include include code right before program start # Should we debug? Hell yes, we should always debug! debug=0 #TODO: Bad done... we should do this another way later last_changes=\$(head -n 15 \$0 | grep "@" | awk -F ", " '{print \$2}' \ | awk -F "-" '{print \$3" "\$2" "\$1}' | sort -bfnr \ | awk '{print \$3"-"\$2"-"\$1}' | grep -m 1 [0-9]) version=\$(head -n 15 \$0 | grep "# Version: " | awk '{print \$3}') ############# ## TODO: End of uncleaned area ############# ### FUNCTION SECTION ########################################################### ## ## In this script used functions ## ################################################################################ ### write runvmware.conf ####################################################### #TODO: only not yet checked function filecheck () { filecheck=\$(LANG=us ls -lh \${diskfile} 2>&1) writelog "Filecheck:\n\${filecheck}\n" #TODO: don't understand the sence in it noimage=\$(echo \${filecheck} | grep -i "no such file or directory" | wc -l) rightsfile=\${diskfile} # check if link # TODO: mistake with 2nd rightsfile if its in another directory? if [ -L "\${diskfile}" ]; then # take link target rightsfile=\$(ls -lh \${diskfile} 2>&1 | awk -F "-> *" '{print \$2}') rightsfile=\${vmdir}/\${rightsfile} filecheck=\$(LANG=us ls -lh \${rightsfile} 2>&1) fi # does file exist if [ "\${noimage}" -ge "1" ]; then writelog "Vmware Image Problem:\c" writelog "\tThe image you've specified doesn't exist." writelog "Filecheck says:\c" writelog "\t\t\${diskfile}:\n\t\t\tNo such file or directory" writelog "Hint:\c" writelog "\t\t\tCompare spelling of the image with your options.\n" exit 1 fi # readable? if ! [ -r "\${diskfile}" >/dev/null 2>&1 \ -o -r "\${diskfile}" >/dev/null 2>&1 ]; then writelog "Vmware Image Problem:\c" writelog "\tThe image you've specified has wrong rights." writelog "Filecheck says:\t\t\$(echo \${filecheck} \ | awk '{print \$1" "\$3" "\$4}') \${rightsfile}" writelog "Hint:\t\t\tChange rights with: chmod a+r \${rightsfile}\n" exit 1 fi # writable (for persistent-mode)? if ! [ -w "\${diskfile}" >/dev/null 2>&1 \ -o -w "\${diskfile}" >/dev/null 2>&1 ] \ && [ "\${np}" = "independent-persistent" ]; then writelog "Vmware Image Problem:\c" writelog "\tThe image you've specified has wrong rights." writelog "Filecheck says:\t\t\$(echo \${filecheck} \ | awk '{print \$1" "\$3" "\$4}') \${rightsfile}" writelog "Hint:\t\t\tUse nonpersistent-mode or change rights to rw\n" exit 1 fi } ### write runvmware.conf ####################################################### runvmwareconfheader () { echo " ############################################################################## ###### This configuration file was generated by 'runvmware', ###### ###### dont use it for your own configurations - it will be overwritten ###### ###### ###### ###### identity ############################################################## displayName = \"\${displayname}\" guestOS = \"\${vmostype}\" config.version = \"\${confver}\" virtualHW.version = \"\${hver}\" memsize = \"\${mem}\" numvcpus = \"1\" ###### ide-disks ############################################################# ide0:0.mode = \"\${np}\" ide0:0.present = \"\${ide}\" ide0:0.fileName = \"\${diskfile}\" ide1:0.present = \"\${cdr_1}\" ide1:0.autodetect = \"TRUE\" ide1:0.fileName = \"auto detect\" ide1:0.deviceType = \"cdrom-raw\" ide1:1.present = \"\${cdr_2}\" ide1:1.autodetect = \"TRUE\" ide1:1.fileName = \"auto detect\" ide1:1.deviceType = \"cdrom-raw\" ###### scsi-disks ############################################################ scsi0.present = \"\${scsi}\" scsi0.virtualDev = \"lsilogic\" scsi0:0.mode = \"\${np}\" scsi0:0.present = \"\${scsi}\" scsi0:0.fileName = \"\${diskfile}\" ###### nics ################################################################## ethernet0.present = \"TRUE\" ethernet0.addressType = \"static\" ethernet0.connectionType = \"\${network}\" ethernet0.address = \"00:50:56:0D:\${mac}\" ###### sound ################################################################# sound.present = \"TRUE\" sound.virtualDev = \"es1371\" ###### usb ################################################################### usb.present = \"TRUE\" usb.generic.autoconnect = \"TRUE\" ###### floppies ############################################################## floppy0.present = \"\${floppya}\" floppy0.fileName = \"auto detect\" # we need floppy b: this for our windows client configuration floppy1.present = \"\${floppyb}\" floppy1.fileType = \"file\" floppy1.fileName = \"\${floppybname}\" floppy1.startConnected = \"TRUE\" ###### ports ################################################################# parallel0.present = \"FALSE\" serial0.present = \"FALSE\" ###### shared folders ######################################################## sharedFolder0.present = \"TRUE\" sharedFolder0.enabled = \"TRUE\" sharedFolder0.expiration = \"never\" sharedFolder0.guestName = \"Home\" sharedFolder0.hostPath = \"\${HOME}\" sharedFolder0.readAccess = \"TRUE\" sharedFolder0.writeAccess = \"TRUE\" sharedFolder.maxNum = \"1\" ###### misc ################################################################## tmpDirectory = \"\${tmpdir}\" mainMem.useNamedFile = \"TRUE\" snapshot.disabled = \"TRUE\" tools.syncTime = \"TRUE\" # use redoLogDir = \"/dev/shm\" if sitting on NFS import redoLogDir = \"\${tmpdir}\" hints.hideAll = \"TRUE\" logging = \"FALSE\" isolation.tools.hgfs.disable = \"FALSE\" isolation.tools.dnd.disable = \"TRUE\" isolation.tools.copy.enable = \"TRUE\" isolation.tools.paste.enabled = \"TRUE\" gui.restricted = \"TRUE\" pref.hotkey.shift = \"TRUE\" pref.hotkey.control = \"TRUE\" pref.hotkey.alt = \"TRUE\" svga.maxWidth = \"\${xres}\" svga.maxHeight = \"\${yres}\" " \ >\${confile} # set the appropriate permissions for the vmware config file chmod u+rwx \${confile} >/dev/null 2>&1 } ### creates user configurationfile in \${vmhome} ################################ preferencesheader () { echo " ############################################################################## ###### This configuration file was generated by 'runvmware', ###### ###### dont use it for your own configurations - it will be overwritten ###### ###### ###### ################################## Wichtig! ################################## ###### *.vmem wird immer angelegt und frisst soviel Speicher, wie fuer ###### ###### den Gast vorgesehen. Sollte nicht im tempfs liegen. NFS OK, da ###### ###### IO nur einmal beim Start erheblich. Wird gesteuert ueber ###### ###### tmpDirectory = /nfs-viel-platz und darin wird dann vmware-\$user ###### ###### angelegt. hints.hideAll = \"true\" pref.exchangeSelections = \"true\" pref.hotkey.shift = \"true\" pref.tip.startup = \"false\" pref.vmplayer.exit.vmAction = \"poweroff\" pref.vmplayer.fullscreen.autohide = \"true\" pref.vmplayer.webUpdateOnStartup = \"false\" prefvmx.defaultVMPath = \"\${vmhome}\" prefvmx.mru.config = \"\${confile}:\" tmpDirectory = \"\${tmpdir}\" webUpdate.checkPeriod = \"manual\" 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}\" " \ >\${vmhome}/preferences } ### log function ############################################################### # function to write to stdout and logfile writelog () { # write to stdout echo -e "\$1" # log in file echo -e "\$1" >>\${tmpdir}/runvmware.\${USER}.log } ### MAIN SECTION ############################################################### ## ## Main part of the script... ## ################################################################################ # Delete the LOCK file. its unsecure, but ... rm -f \${tmpdir}/*LOCK >/dev/null 2>&1 # create vmware directories mkdir -p \${tmpdir} >/dev/null 2>&1 mkdir -p \${vmhome} >/dev/null 2>&1 # NO X-server, no runvmware ;) [ -z "\$DISPLAY" ] && echo -e "\n\tStart only within a desktop!\n" && exit 1 # logo for console cat < /etc/vmware/fd-loop/config.xml echo "" > /etc/vmware/fd-loop/config.xml echo " " >> /etc/vmware/fd-loop/config.xml echo " " >> /etc/vmware/fd-loop/config.xml echo " " >> /etc/vmware/fd-loop/config.xml echo " " >> /etc/vmware/fd-loop/config.xml echo " " >> /etc/vmware/fd-loop/config.xml # if we have a scanner, then copy scannerinformation to this xml sanelines="\$(wc -l /etc/sane.d/net.conf|awk '{ print \$1 };')" if [ -f /etc/sane.d/net.conf ] && [ "\${sanelines}" -eq 1 ]; then echo "" \ >> /etc/vmware/fd-loop/config.xml echo "" >> /etc/vmware/fd-loop/config.xml fi echo " " >> /etc/vmware/fd-loop/config.xml echo "" >> /etc/vmware/fd-loop/config.xml # 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 copy it from plugin location (like this script) cp /var/lib/vmware/templates/nvram.5.0 \${tmpdir}/nvram # adjust volume writelog "Unmuting sound...\c" amixer -q sset Master 28 unmute amixer -q sset PCM 28 unmute writelog "finished\n" ### run vmplayer ############################################################### # ...with the automatically written config file if [ \$(which vmplayer 2>/dev/null) ]; then writelog "\nStarting VMplayer..." # run VMplayer writelog "... vmplayer \${vmopt} \${confile}...\n" vmplayer \${vmopt} \${confile} 2>&1 >/dev/null else writelog "\nNo VMware/VMPlayer found!\n" exit 1 fi writelog "\nBye.\n" exit 0 EOF [ $DEBUGLEVEL -gt 0 ] && echo "done with 'vmware' os-plugin ..."; fi fi