(Terug) naar scripts op heeck.nl of heeck.nl

******************************************************************************************
VNC xstartup en VMware vmrun

Deze variant van de xstartup-file voor vncserver heb ik opgebouwd om VMware virtual machines 'headless' te kunnen starten. Ik zit niet altijd thuis achter mijn grafische desktop en die is dus ook niet altijd aangelogd. Het op de command line starten van virtual machines is niet zo'n probleem, dat kan met vmrun, onderdeel van de vix api van VMware.

Net als anderen ben ik in eerste instantie gaan kijken naar vmrun met de optie 'nogui' om een virtual machine te starten zonder scherm maar dat levert alleen foutmeldingen op van het soort 'unknown error' dus dat werd hem niet.

Vervolgens ben ik gaan studeren op VNC en dat bleek vrij snel een goede oplossing. Niet alleen faciliteert het 'headless' starten van Virtual Machines maar als je om één of andere reden toch ergens op moet klikken of enteren in de virtual machine kun je er met een VNC client verbinding mee maken. De welkebende twee vliegen...

Ik zag geen snelle manier om verschillende xstartup files aan te roepen voor mijn diverse virtual machines dus heb ik de keuze ingebouwd in het standaard xstartup script. Ik maak hierbij gebruik van het gegeven dat vnc4server het argument -name <DESKTOP-NAME> aanpakt en dat deze binnen het script als variabele $VNCDESKTOP beschikbaar is.
Vanaf regel 45 zie je de keuzemogelijkheden met bij elke keuze het volledige pad naar de .vmx file.

De functie startvm() doet na het starten van de VNCserver (op de eerste beschikbare poort) een paar dingen:
  1. Checkt of de gewenste VM niet al draait (dubbelstartbeveiliging, in dat geval einde script en stop VNCserver).
  2. Start de gewenste virtual machine met vmrun en VMware player.
  3. Creëert een stopscript in de .vnc directory, om de virtual machine in 'suspend' state te brengen en daarna de VNCserver te stoppen.
  4. Creëert een desktop shortcut naar dit stopscript. Dit is voor als ik wel thuis ben een handige indicator welke virtual machine('s) er draaien.
01 #!/bin/sh
02 [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
03 [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
04 xsetroot -solid grey
05 vncconfig -iconic &
06 x-terminal-emulator -geometry 80x24+150+150 -ls -title "$VNCDESKTOP Desktop" &
07 x-window-manager &
08 
09 # Script to start VMware Player with machine in VNC environment to run 'headless'
10 startvm(){
11 	#check if chosen VM isn't already running
12 	if [ `vmrun -T player list | grep ${1}|wc -l` -eq 0 ]
13 	then
14 		vmrun -T player start $1 &
15 		# create stopscript for vm
16 		echo "#!/bin/sh\n\n"> ~/.vnc/suspvm${DISPLAY}.sh
17 		echo "if [ \`vmrun -T player list | grep ${1}|wc -l\` -gt 0 ]" 
   		>> ~/.vnc/suspvm${DISPLAY}.sh
18 		echo "then" >> ~/.vnc/suspvm${DISPLAY}.sh
19 		echo "echo \"Suspending Virtual Machine $1\"" 
   		>> ~/.vnc/suspvm${DISPLAY}.sh
20 		echo "vmrun -T player suspend $1" >> ~/.vnc/suspvm${DISPLAY}.sh
21 		echo "else" >> ~/.vnc/suspvm${DISPLAY}.sh
22 		echo "echo \" Virtual Machine $1 is not active.\"" 
   		>> ~/.vnc/suspvm${DISPLAY}.sh
23 		echo "fi" >> ~/.vnc/suspvm${DISPLAY}.sh
24 		echo "vncserver -kill ${DISPLAY}" >> ~/.vnc/suspvm${DISPLAY}.sh
25 		echo "rm ~/.vnc/suspvm${DISPLAY}.sh" >> ~/.vnc/suspvm${DISPLAY}.sh
26 		echo "rm ~/Desktop/suspvm${DISPLAY}.desktop" 
   		>> ~/.vnc/suspvm${DISPLAY}.sh
27 		chmod 755 ~/.vnc/suspvm${DISPLAY}.sh
28 		# Create desktop Icon for stopscript, this alerts for running VM's as well
29 		machine=$(basename $1 | cut -f1 -d".")
30 		echo "[Desktop Entry]" > ~/Desktop/suspvm${DISPLAY}.desktop
31 		echo "Version=1.0" >> ~/Desktop/suspvm${DISPLAY}.desktop
32 		echo "Name=Suspend VM ${machine} & stop VNCserver ${DISPLAY}" 
   		>> ~/Desktop/suspvm${DISPLAY}.desktop
33 		echo "Comment=Suspend Virtual Machine $1 and stop VNCserver ${DISPLAY}" 
   		>> ~/Desktop/suspvm${DISPLAY}.desktop
34 		echo "Exec=${HOME}/.vnc/suspvm${DISPLAY}.sh" 
   		>> ~/Desktop/suspvm${DISPLAY}.desktop
35 		echo "Icon=/usr/share/icons/hicolor/48x48/apps/vmware-pause.png" 
   		>> ~/Desktop/suspvm${DISPLAY}.desktop
36 		echo "Terminal=true" >> ~/Desktop/suspvm${DISPLAY}.desktop
37 		echo "Type=Application" >> ~/Desktop/suspvm${DISPLAY}.desktop
38 		echo "Categories=Utility;Application;" 
   		>> ~/Desktop/suspvm${DISPLAY}.desktop
39 		chmod 755 ~/Desktop/suspvm${DISPLAY}.desktop
40 	else
41 		vncserver -kill ${DISPLAY}
42 	fi
43 }
44 
45 case $VNCDESKTOP in
46 vm_sap740)
47 	startvm /vmstore/sap74npl/sap74npl.vmx &
48 	;;
49 vm_sap702)
50 	startvm /vmstore/SLES_11_SP1_SAP_Testdrive-1.0.13/
		SLES_11_SP1_SAP_Testdrive.x86_64-1.0.13.vmx &
51 	;;
52 esac
Als een virtual machine is opgestart levert dat een shortcut op de desktop op met een aangepast VMware ikoontje, ik heb er een 'pauze' symbooltje bij geplakt:
shortcut
Het label van de shortcut bevat de naam van de virtual machine en het displaynummer (poort 590x) van de VNCserver: Suspend VM SLES_11_SP1_SAP_Testdrive & stop VNCserver :1 Om deze gemakkelijk te kunnen benaderen.

Met deze shortcut kan het in de dirctory .vnc gegenereerde stopscript (in dit geval suspvm:1.sh) worden aangeroepen. Het stopscript verwijdert zelf de shortcut en zichzelf weer, vnc4server ruimt bij het afsluiten z'n pidfile op.

25-02-2016
* Begin **********************************************************************************