summaryrefslogtreecommitdiffstats
path: root/src/os-plugins/plugins/vmware/XX_vmware.sh
blob: 2b51936d7e1a7352832ac48f77b0e32da1995b5b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# Copyright (c) 2007..2009 - RZ Uni Freiburg
# Copyright (c) 2008..2012 - 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
#
# script is included from init via the "." load function - thus it has all
# variables and functions available

# TODO:
# configs nach /etc/opt/openslx/plugins/vmware
# cp nach run-virt.include

# TODO: nvram,functions
# write /etc/vmware/config (if a non-standard location of vmware basedir is
# to be configured), /etc/init.d/vmware

# include default directories
. /etc/openslx.conf

ETCDIR=/mnt/${OPENSLX_DEFAULT_CONFDIR}
PLUGINCONFDIR=${ETCDIR}/plugins/vmware
BINDIR=/mnt/${OPENSLX_DEFAULT_BINDIR}
PLUGINDIR=/mnt/${OPENSLX_DEFAULT_DIR}/plugin-repo/vmware
VIRTDIR=/mnt/${OPENSLX_DEFAULT_VIRTDIR}

# 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... more or less useless with the
  # new plugin system
  if [ $vmware_active -ne 0 ]; then

    [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'vmware' os-plugin ...";
    # Load general configuration
    . /initramfs/machine-setup

    testmkd /mnt/tmp/virt/vmware 1777
    testmkd /dev/shm/vmware 1777
    testmkd /mnt/var/run/vmware 1777
    testmkd ${PLUGINCONFDIR}
    testmkd /mnt/etc/vmware/udhcpd

    # write the ${PLUGINCONFDIR}/vmware.conf file
    # check for the several variables and write the several files:
    #   dhcpd.conf for vmnet* interfaces
    #   nat.conf for the NAT configuration of vmnet8
    # TODO: vmnet-natd-8.mac not clear if really needed and which mac it
    # should contain (seems to be an average one)
    echo -e "# configuration file for vmware background services written in \
stage3 setup" > ${PLUGINCONFDIR}/vmware.conf
    if [ "$vmware_bridge" = 1 ] ; then
      echo "vmnet0=true" >> ${PLUGINCONFDIR}/vmware.conf
    fi

    # variable might contain ",NAT" which is to be taken off
    if [ -n "$vmware_vmnet1" ] ; then
      local vmnet1=${vmware_vmnet1%,*} # x.x.x.x/yy,NAT => 'x.x.x.x/yy'
      local vmnat=${vmware_vmnet1#$vmnet1*} # x.x.x.x/yy,NAT => ',NAT'
      local vmip=${vmnet1%/*} # x.x.x.x/yy => 'x.x.x.x'">
      local vmpx=${vmnet1#*/} # x.x.x.x/yy => 'yy'
      local vmsub=$(echo $vmip |sed 's,\(.*\)\..*,\1,') # x.x.x.x => x.x.x
      echo -e "vmnet1=$vmnet1" >> ${PLUGINCONFDIR}/vmware.conf
      [ -n "$vmnat" ] && echo "vmnet1nat=true" >> ${PLUGINCONFDIR}/vmware.conf
      # setting up the udhcpd configuration
      sed -e "s,NWIF,vmnet1,;s,/misc/,/vmware/," \
          -e "s,CNETWORK,$vmsub,;s,PIDFILE,/var/run/vmware/udhcpd-vmnet1.pid," \
          -e "s,LEASEFILE,/var/run/vmware/udhcpd-vmnet1.leases," \
      /mnt/etc/opt/openslx/udhcpd.conf >/mnt/etc/vmware/udhcpd/udhcpd-vmnet1.conf
      # setting the base samba configuration if available
      [ -f /mnt/opt/openslx/plugin-repo/vmchooser/smb.conf \
        -a -f /mnt/usr/sbin/smbd ] && \
          sed -e "s,NWIF,$vmsub,;s,PIDDIR,/var/run/vmware," \
            /mnt/opt/openslx/plugin-repo/vmchooser/smb.conf \
            >/etc/vmware/smb.conf
    fi

    # vmware nat interface configuration
    if [ -n "$vmware_vmnet8" ] ; then
      local vmnet8ip=${vmware_vmnet8%/*}
      local vmpx=${vmware_vmnet8#*/}
      local vmsub=$(echo $vmnet8ip |sed 's,\(.*\)\..*,\1,') # x.x.x.x => x.x.x">
      # vmip is user for vmnet8 device
      # vmnet is user for config files nat.conf/dhcp
      local vmip="${vmsub}.1"
      local vmnet="${vmsub}.2"
      echo -e "vmnet8=$vmip/$vmpx" >>${PLUGINCONFDIR}/vmware.conf
      # setting up the udhcpd configuration
      sed -e "s,NWIF,vmnet8,;s,/misc/,/vmware/," \
          -e "s,CNETWORK,$vmsub,;s,PIDFILE,/var/run/vmware/udhcpd-vmnet8.pid," \
          -e "s,LEASEFILE,/var/run/vmware/udhcpd-vmnet8.leases," \
      /mnt/etc/opt/openslx/udhcpd.conf >/mnt/etc/vmware/udhcpd/udhcpd-vmnet8.conf
      # might be not needed any more ...
      echo -e "# Linux NAT configuration file" \
        > /mnt/etc/vmware/nat.conf
      echo -e "[host]" \
        >> /mnt/etc/vmware/nat.conf
      echo -e "ip = $vmnet/$vmpx" \
        >> /mnt/etc/vmware/nat.conf
      echo -e "device = /dev/vmnet8" \
        >> /mnt/etc/vmware/nat.conf
      echo -e "activeFTP = 1" \
        >> /mnt/etc/vmware/nat.conf
      echo -e "[udp]" \
        >> /mnt/etc/vmware/nat.conf
      echo -e "timeout = 60" \
        >> /mnt/etc/vmware/nat.conf
      echo -e "[incomingtcp]" \
        >> /mnt/etc/vmware/nat.conf
      echo -e "[incomingudp]" \
        >> /mnt/etc/vmware/nat.conf
      echo "00:50:56:F1:30:50" > /mnt/etc/vmware/vmnet-natd-8.mac
    fi
    # copy the runlevel script to the proper place and activate it
    sed "s/eth0/$nwif/g" ${PLUGINDIR}/vmware-slx > /mnt/etc/init.d/vmware-env \
      || echo "  * Error copying runlevel script. Shouldn't happen."
    chmod a+x /mnt/etc/init.d/vmware-env
    rllinker "vmware-env" 20 2

    ############################################################################
    # vmware stuff first part: two scenarios
    # * VM images in /usr/share/vmware - then simply link
    # * VM images via additional mount (mount source NFS, NBD, ...)

    # get source of vmware image server (get type, server and path)
    if strinstr "/" "${vmware_imagesrc}" ; then
      vmimgprot=$(uri_token ${vmware_imagesrc} prot)
      vmimgserv=$(uri_token ${vmware_imagesrc} server)
      vmimgpath="$(uri_token ${vmware_imagesrc} path)"
    fi
    if [ -n "${vmimgserv}" -a -n ${vmimgpath} -a -n ${vmimgprot} ] ; then
      mnttarget=${VIRTDIR}/vmware
      # mount the vmware image source readonly (ro)
      fsmount ${vmimgprot} ${vmimgserv} ${vmimgpath} ${mnttarget} ro
    else
      [ $DEBUGLEVEL -gt 1 ] && error "  * Incomplete information in variable \
${vmware_imagesrc}." nonfatal
    fi
    
    ############################################################################
    # vmware stuff second part: setting up the environment
    # make udhcpd more silent
    touch /mnt/var/run/vmware/udhcpd-vmnet1.leases \
          /mnt/var/run/vmware/udhcpd-vmnet8.leases

    # create the needed devices which effects all vmware options
    # they are 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
    chmod 0700 /dev/vmnet*

    # allow VMware swapping if RamZSWAP is enabled
    if grep -E "^ramzswap.*1 -.*" /proc/modules ; then
      echo -e '.encoding = "UTF-8"\nprefvmx.minVmMemPct = "75"
prefvmx.useRecommendedLockedMemSize = "TRUE"' | sed -e "s/^ *//" \
        >/mnt/etc/vmware/config
    else
    # disable VMware swapping else
      echo -e '.encoding = "UTF-8"\nprefvmx.minVmMemPct = "100"
prefvmx.useRecommendedLockedMemSize = "TRUE"' | sed -e "s/^ *//" \
        >/mnt/etc/vmware/config
    fi

    # copy virtualization include files to config dir
    cp ${PLUGINDIR}/run-virt.include ${PLUGINCONFDIR}
    # copy version depending files
    cp ${PLUGINDIR}/${vmware_kind}/vmplayer ${BINDIR}/vmplayer
    if [ -e ${PLUGINDIR}/${vmware_kind}/vmware ]; then
      cp ${PLUGINDIR}/${vmware_kind}/vmware ${BINDIR}/vmware
    fi

    # affects only kernel and config depending configuration of not
    # local installed versions
    cat ${PLUGINDIR}/${vmware_kind}/config >>/mnt/etc/vmware/config
    chmod 644 /mnt/etc/vmware/config
    echo "# stage1 variables produced during plugin install" \
      >>${PLUGINCONFDIR}/vmware.conf
    cat ${PLUGINDIR}/${vmware_kind}/vmware.conf >>${PLUGINCONFDIR}/vmware.conf

    # if /tmp resides on nfs: create an empty container file for vmware *.vmem
    # it does not like to live on NFS exports
    # stuff moved more generic to vmchooser plugin
    #if [ cat /proc/mounts|grep -qe "^/tmp "|grep -qe "nfs" ] ; then
    #  dd if=/dev/zero of=/mnt/tmp/vm-container count=1 seek=2048000
    #  diskfm /mnt/tmp/vm-container /mnt/tmp/virt
    #  chmod a+rwxt /mnt/tmp/virt
    #fi
    [ $DEBUGLEVEL -gt 0 ] && echo "done with 'vmware' os-plugin ..."

  fi
else
  [ $DEBUGLEVEL -gt 0 ] && echo "  * Configuration of vmware plugin failed"
fi