summaryrefslogblamecommitdiffstats
path: root/src/os-plugins/plugins/virtualbox/files/run-virt.include
blob: f5eb3c16366da24d20282cb50c00b994545b6f72 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12

                                                                               
                                            
                                         







                                                                         

                                                                               
                                                                             

















                                                                                
                                                                
                             
                        
                                   
                 
                                            

                                                                    
                                                                     
                                                              
                            
                                
                                                                          
                                                              
                                 
                                                   
                                                 

                                  

                                                  

                                                              



                                                           
 
                                                       
                                   
                             
                               
                              


                                                                  



                                   
                                                     

                     
                                                                       
                                                    
                                
                                                                       
             

  








                                                                     
                     

                     
                              

                        
             
               
                    


                        
                     
                              
            
             
               
                    


                        
                     
                              
             
             



                        
                     
                              
             
             

               
                    
                        
                     
    
                          

                           
            

                       


                       






                                                                              
                   
        



                                                                            


                        
    
       
             
                     
               
                    


                    
                    


                    
                    
    





                                           
                                                                   






                                                                                
 


                                                
                                                       


                                                                           

                     
                         
                                                   







                                                    
                                               
                                                   
                                                                    
               

                               
                                                                     
                                       
               







                                        
                                


                                                     


                                                                        
  
 
                                                                             

                                                             































                                                                                 
   
 
                         










                              
 

                                                   
          

                                              
        



                                                    
    
 









                       


                                                                     



                                                                            

                                                         

                                        




                                                                          
                   
        









                                                              
 
              
                             
 
                                                                    
                     





                                                             
                            


                                                   
                                    

                                                              


                                                


                                               

                                             

                                   

                                    

                                                         

                                                                                
                                                       

                                                                                

                                            
 


                                                         



                                               
 

                                         
 
                                





                                                                              




                                                                  
                                                                              

  
                  
                               
           
                                   







                                                                      






                                                                          
  
 
                                                                                
                                   
                                                                                
 

                                                                    
                                                                           

                                           

  

                                      
                         




                                                                                
 


                                                                           
 
                                            

                                           

                  
# run-virt.include
# -----------------------------------------------------------------------------
# Copyright (c) 2009..2011 - RZ Uni Freiburg
# Copyright (c) 2009..2013 - OpenSLX GmbH
#
# This program/file 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 feedback to feedback@openslx.org
#
# General information about OpenSLX can be found at http://openslx.org
# -----------------------------------------------------------------------------
# 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
################################################################################
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

################################################################################
### Declaration of default variables
################################################################################

PLUGINCONFVIRTUALBOX="${PLUGINCONFROOT}/${self}"
PLUGINDIRVIRTUALBOX="${OPENSLX_DEFAULT_DIR}/plugin-repo/${self}"
# create TMPDIR for all users
TMPDIR=/tmp/virt/${self}
mkdir -m 1777 ${TMPDIR} 2>/dev/null
# dir for configs
confdir="/tmp/virt/${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/virt/.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
# default guest audio controller (SB16, AC97, HDA)
guestaudio="HDA"
# default guest network adaptor (Am79C970A, Am79C973, 82540EM)
vb_network_card="82540EM"
# default setting for accelerated 2D grapics (OS dependent)
enable2d="true"
# set default graphics ram
vram="128"

# configure our own rwimg, empty image which we provide
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

# link to image
diskfile="${diskfolder}/${imgname}"
[ ${diskless} -eq 0 ] && ln -sf ${vmpath} ${diskfile}

# check the file type
if echo ${imgname} | grep -qiE "vdi|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|vhd), exiting!"
  cleanexit 1
fi

# 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"

# set some base configuration depending on the guest operating system
case "${vmostype}" in
  win31*)
    guestaudio="SB16"
    vb_network_card="Am79C973"
    vmostype="Windows31"
    mem="32"
    vram="16"
    cpu_cores=1
    enablevt="false"
  ;;
  win95*)
    vmostype="Windows95"
    guestaudio="SB16"
    vb_network_card="Am79C973"
    mem="92"
    vram="32"
    cpu_cores=1
    enablevt="false"
  ;;
  win98*)
    vmostype="Windows98"
    guestaudio="SB16"
    vb_network_card="Am79C973"
    mem="256"
    vram="64"
    cpu_cores=1
  ;;
  winme*)
    vmostype="WindowsMe"
    guestaudio="AC97"
    vb_network_card="Am79C973"
    mem="256"
    vram="64"
    cpu_cores=1
  ;;
  winxp*|windowsxp*)
    vmostype="WindowsXP"
    guestaudio="AC97"
  ;;
  winvista*|windowsvista*)
    vmostype="WindowsVista"
  ;;
  windows7*)
    vmostype="Windows7"
  ;;
  windows8*)
    vmostype="Windows8"
  ;;
  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
  ;;
  os2*)
    mem="256"
    vmostype="OS2eCS"
    cpu_cores=1
    enable2d="false"
  ;;
  macos*|MacOS*)
    vmostype="MacOS"
    enable2d="false"
  ;;
  *)
    vmostype="Other"
    enable2d="false"
  ;;
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="34f617be-192a-46b3-a8ae-bce1029e093f"
# 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"
  # patch the disk file uuid into the snapshot vdi file
  dd if=${diskfile} of="${snapshotdir}/{${snapshotuuid}}.vdi" seek=424 \
    skip=392 bs=1 count=16 conv=notrunc
fi

# TODO: MEM muss noch angepasst werden. Maschine crasht wenn mehr 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
#  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})
#fi

# 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

# 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

# configure 3d settings
case "${enable3d}" in
  *true*|*yes*)
    enable3d="true"
    ;;
  *)
    enable3d="false"
    ;;
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

# external GUI
vrdpport=${remotedesktopport}

[ ${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\t${cdrom0}"
#writelog "\tCD-ROM2:\t\t${cdrom1}"
writelog "\tFloppy_A:\t\t${floppy0}"
writelog "\tFloppy_B:\t\t${floppy1}"
# defined in run-virt.sh and run-vmgrid.sh
writelog "\tShared Folders '${sharename}':\t${sharepath}"

################################################################################
### Pepare and configure virtual machine and disk image
################################################################################

# create Virtualbox.xml
. ${PLUGINCONFVIRTUALBOX}/virtualbox.include

# remove snapshot disk when using rw images
if [ "${imgtype}" != "Immutable" ]; then
  sed -i "/${snapshotuuid}/d" "${confdir}/VirtualBox.xml"
fi

# TODO: add rawdisk if requested
#"raw.vmdk" format="VMDK" type="Writethrough"/>

# create machine.xml
. ${PLUGINCONFVIRTUALBOX}/machine.include

# remove CD-ROM if not available
if [ "${cdrom0}" != "TRUE" ]; then
  sed -i "/HostDrive/d" ${machconfig}
  sed -i '/AttachedDevice.*type="DVD"/d' ${machconfig}
  sed -i "/<!-- PLEASE DO NOT REMOVE THIS COMMENT (CD)!!! -->/d" ${machconfig}
fi

# 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 (HD)!!! -->/d" ${machconfig}
fi

# 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
################################################################################

# configure and start samba service to provide user's home directory
if [ -f /usr/sbin/smbd ] ; then
  sudo /opt/openslx/rootfs/bin/sed -i /etc/vbox/smb.conf -e "s,USER,$USER,"
  sudo /usr/sbin/nmbd -s /etc/vbox/smb.conf
  sudo /usr/sbin/smbd -s /etc/vbox/smb.conf
fi

# 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)
VIRTCMDOPTS="--startvm ${machineuuid} --start-running"

# set headless mode (-v off to disable vrdp)
VIRTCMDHL=$(which VBoxHeadless 2>/dev/null)
VIRTCMDOPTSHL="-s ${machineuuid}"
RMDIRS="${TMPDIR}"