vmware-tools startup/rc.d
Hej,Jeg har fornyligt lavet en vmware server. hvor jeg kører i øjeblikket 2 freebsd server under.
For at få serverne til at kører optimalt i forhold til host systemet. med shutdown,hdd sharing osv er jeg nød til at installere vmware tools på fbsd serverne.
Jeg har installeret dem og fungere fint nok. Det eneste er bar at vmware-tools.sh ligger i /usr/local/etc/rc.d/ Og vil gerne ha flyttet alle mine startups til /etc/rc.d og kører det via rc.conf.
Jeg har prøvet bar at flyttet sh filen til det directory og lave den kørbar, samt tilføjet vmware_enable="YES" i rc.conf.
Det for bar systemet til ikke engang at ville loade ens login/shell.
Jeg har også prøvet at tilføjet disse linier i startupscriptet:
. /etc/rc.subr
load_rc_config vmware
name=vmware
rcvar=`set_rcvar`
run_rc_command "$1"
Men det loader den ik vmware-tools af. Den skriver godt nok starting vmware og går videre i starten men den loader dem aldrig.
Hvad gør jeg forkert. Har før fået det til at virke med apache og mysql. Kører forresten fbsd 6.2.
Her er original vmware scriptet:
#!/bin/sh
#
# Copyright (C) 1998-2002 VMware, Inc. All Rights Reserved.
#
# This script manages the services needed to run VMware software
# Basic support for IRIX style chkconfig
# chkconfig: 3 90 08
# description: Manages the services needed to run VMware software
# Basic support for the Linux Standard Base Specification 1.0.0 (to be used by
# insserv for exemple)
### BEGIN INIT INFO
# Provides: VMware_Tools
# Required-Start: $network $syslog
# Required-Stop:
# Default-Start: 3 5
# Default-Stop:
# Description: Manages the services needed to run VMware Tools
### END INIT INFO
# BEGINNING_OF_UTIL_DOT_SH
#!/bin/sh
# A few utility functions used by our shell scripts. These are patched in during
# make.
# They are a lot of small utility programs to create temporary files in a
# secure way, but none of them is standard. So I wrote this --hpreg
make_tmp_dir() {
local dirname="$1" # OUT
local prefix="$2" # IN
local tmp
local serial
local loop
tmp="${TMPDIR:-/tmp}"
# Don't overwrite existing user data
# -> Create a directory with a name that didn't exist before
#
# This may never succeed (if we are racing with a malicious process), but at
# least it is secure
serial=0
loop='yes'
while [ "$loop" = 'yes' ]; do
# Check the validity of the temporary directory. We do this in the loop
# because it can change over time
if [ ! -d "$tmp" ]; then
echo 'Error: "'"$tmp"'" is not a directory.'
echo
exit 1
fi
if [ ! -w "$tmp" -o ! -x "$tmp" ]; then
echo 'Error: "'"$tmp"'" should be writable and executable.'
echo
exit 1
fi
# Be secure
# -> Don't give write access to other users (so that they can not use this
# directory to launch a symlink attack)
if mkdir -m 0755 "$tmp"'/'"$prefix$serial" >/dev/null 2>&1; then
loop='no'
else
serial=`expr $serial + 1`
serial_mod=`expr $serial % 200`
if [ "$serial_mod" = '0' ]; then
echo 'Warning: The "'"$tmp"'" directory may be under attack.'
echo
fi
fi
done
eval "$dirname"'="$tmp"'"'"'/'"'"'"$prefix$serial"'
}
# Check if the process associated to a pidfile is running.
# Return 0 if the pidfile exists and the process is running, 1 otherwise
vmware_check_pidfile() {
local pidfile="$1" # IN
local pid
pid=`cat "$pidfile" 2>/dev/null`
if [ "$pid" = '' ]; then
# The file probably does not exist or is empty. Failure
return 1
fi
# Keep only the first number we find, because some Samba pid files are really
# trashy: they end with NUL characters
# There is no double quote around $pid on purpose
set -- $pid
pid="$1"
[ -d /proc/"$pid" ]
}
# Note:
# . Each daemon must be started from its own directory to avoid busy devices
# . Each PID file doesn't need to be added to the installer database, because
# it is going to be automatically removed when it becomes stale (after a
# reboot). It must go directly under /var/run, or some distributions
# (RedHat 6.0) won't clean it
#
# Terminate a process synchronously
vmware_synchrone_kill() {
local pid="$1" # IN
local signal="$2" # IN
local second
kill -"$signal" "$pid"
# Wait a bit to see if the dirty job has really been done
for second in 0 1 2 3 4 5 6 7 8 9 10; do
if [ ! -d /proc/"$pid" ]; then
# Success
return 0
fi
sleep 1
done
# Timeout
return 1
}
# Kill the process associated to a pidfile
vmware_stop_pidfile() {
local pidfile="$1" # IN
local pid
pid=`cat "$pidfile" 2>/dev/null`
if [ "$pid" = '' ]; then
# The file probably does not exist or is empty. Success
return 0
fi
# Keep only the first number we find, because some Samba pid files are really
# trashy: they end with NUL characters
# There is no double quote around $pid on purpose
set -- $pid
pid="$1"
# First try a nice SIGTERM
if vmware_synchrone_kill "$pid" 15; then
return 0
fi
# Then send a strong SIGKILL
if vmware_synchrone_kill "$pid" 9; then
return 0
fi
return 1
}
# END_OF_UTIL_DOT_SH
vmware_etc_dir=/etc/vmware-tools
# Since this script is installed, our main database should be installed too and
# should contain the basic information
vmware_db="$vmware_etc_dir"/locations
if [ ! -r "$vmware_db" ]; then
echo 'Warning: Unable to find '"`vmware_product_name`""'"'s main database '"$vmware_db"'.'
echo
exit 1
fi
# BEGINNING_OF_DB_DOT_SH
#!/bin/sh
#
# Manage an installer database
#
# Add an answer to a database in memory
db_answer_add() {
local dbvar="$1" # IN/OUT
local id="$2" # IN
local value="$3" # IN
local answers
local i
eval "$dbvar"'_answer_'"$id"'="$value"'
eval 'answers="$'"$dbvar"'_answers"'
# There is no double quote around $answers on purpose
for i in $answers; do
if [ "$i" = "$id" ]; then
return
fi
done
answers="$answers"' '"$id"
eval "$dbvar"'_answers="$answers"'
}
# Remove an answer from a database in memory
db_answer_remove() {
local dbvar="$1" # IN/OUT
local id="$2" # IN
local new_answers
local answers
local i
eval 'unset '"$dbvar"'_answer_'"$id"
new_answers=''
eval 'answers="$'"$dbvar"'_answers"'
# There is no double quote around $answers on purpose
for i in $answers; do
if [ "$i" != "$id" ]; then
new_answers="$new_answers"' '"$i"
fi
done
eval "$dbvar"'_answers="$new_answers"'
}
# Load all answers from a database on stdin to memory (<dbvar>_answer_*
# variables)
db_load_from_stdin() {
local dbvar="$1" # OUT
eval "$dbvar"'_answers=""'
# read doesn't support -r on FreeBSD 3.x. For this reason, the following line
# is patched to remove the -r in case of FreeBSD tools build. So don't make
# changes to it. -- Jeremy Bar
while read action p1 p2; do
if [ "$action" = 'answer' ]; then
db_answer_add "$dbvar" "$p1" "$p2"
elif [ "$action" = 'remove_answer' ]; then
db_answer_remove "$dbvar" "$p1"
fi
done
}
# Load all answers from a database on disk to memory (<dbvar>_answer_*
# variables)
db_load() {
local dbvar="$1" # OUT
local dbfile="$2" # IN
db_load_from_stdin "$dbvar" < "$dbfile"
}
# Iterate through all answers in a database in memory, calling <func> with
# id/value pairs and the remaining arguments to this function
db_iterate() {
local dbvar="$1" # IN
local func="$2" # IN
shift 2
local answers
local i
local value
eval 'answers="$'"$dbvar"'_answers"'
# There is no double quote around $answers on purpose
for i in $answers; do
eval 'value="$'"$dbvar"'_answer_'"$i"'"'
"$func" "$i" "$value" "$@"
done
}
# If it exists in memory, remove an answer from a database (disk and memory)
db_remove_answer() {
local dbvar="$1" # IN/OUT
local dbfile="$2" # IN
local id="$3" # IN
local answers
local i
eval 'answers="$'"$dbvar"'_answers"'
# There is no double quote around $answers on purpose
for i in $answers; do
if [ "$i" = "$id" ]; then
echo 'remove_answer '"$id" >> "$dbfile"
db_answer_remove "$dbvar" "$id"
return
fi
done
}
# Add an answer to a database (disk and memory)
db_add_answer() {
local dbvar="$1" # IN/OUT
local dbfile="$2" # IN
local id="$3" # IN
local value="$4" # IN
db_remove_answer "$dbvar" "$dbfile" "$id"
echo 'answer '"$id"' '"$value" >> "$dbfile"
db_answer_add "$dbvar" "$id" "$value"
}
# Add a file to a database on disk
# 'file' is the file to put in the database (it may not exist on the disk)
# 'tsfile' is the file to get the timestamp from, '' if no timestamp
db_add_file() {
local dbfile="$1" # IN
local file="$2" # IN
local tsfile="$3" # IN
local date
if [ "$tsfile" = '' ]; then
echo 'file '"$file" >> "$dbfile"
else
date=`date -r "$tsfile" '+%s' 2> /dev/null`
if [ "$date" != '' ]; then
date=' '"$date"
fi
echo 'file '"$file$date" >> "$dbfile"
fi
}
# Add a directory to a database on disk
db_add_dir() {
local dbfile="$1" # IN
local dir="$2" # IN
echo 'directory '"$dir" >> "$dbfile"
}
# END_OF_DB_DOT_SH
db_load 'vmdb' "$vmware_db"
# This comment is a hack to prevent RedHat distributions from outputing
# "Starting <basename of this script>" when running this startup script.
# We just need to write the word daemon followed by a space --hpreg.
# This defines echo_success() and echo_failure() on RedHat
if [ -r "$vmdb_answer_INITSCRIPTSDIR"'/functions' ]; then
. "$vmdb_answer_INITSCRIPTSDIR"'/functions'
fi
# This defines $rc_done and $rc_failed on S.u.S.E.
if [ -f /etc/rc.config ]; then
# Don't include the entire file: there could be conflicts
rc_done=`(. /etc/rc.config; echo "$rc_done")`
rc_failed=`(. /etc/rc.config; echo "$rc_failed")`
else
# Make sure the ESC byte is literal: Ash does not support echo -e
rc_done='[71G done'
rc_failed='[71Gfailed'
fi
#
# Global variables
#
vmmemctl="vmmemctl"
vmxnet="vmxnet"
vmhgfs="vmhgfs"
GUESTD_PID_FILE='/var/run/vmware-guestd.pid'
#
# Utilities
#
# BEGINNING_OF_IPV4_DOT_SH
#!/bin/sh
#
# IPv4 address functions
#
# Thanks to Owen DeLong <owen@delong.com> for pointing me at bash's arithmetic
# expansion ability, which is a lot faster than using 'expr' --hpreg
#
# Compute the subnet address associated to a couple IP/netmask
ipv4_subnet() {
local ip="$1"
local netmask="$2"
# Split quad-dotted addresses into bytes
# There is no double quote around the back-quoted expression on purpose
# There is no double quote around $ip and $netmask on purpose
set -- `IFS='.'; echo $ip $netmask`
echo $(($1 & $5)).$(($2 & $6)).$(($3 & $7)).$(($4 & $8))
}
# Compute the broadcast address associated to a couple IP/netmask
ipv4_broadcast() {
local ip="$1"
local netmask="$2"
# Split quad-dotted addresses into bytes
# There is no double quote around the back-quoted expression on purpose
# There is no double quote around $ip and $netmask on purpose
set -- `IFS='.'; echo $ip $netmask`
echo $(($1 | (255 - $5))).$(($2 | (255 - $6))).$(($3 | (255 - $7))).$(($4 | (255 - $8)))
}
# END_OF_IPV4_DOT_SH
# Are we running in a VM?
vmware_inVM() {
"$vmdb_answer_SBINDIR"/vmware-checkvm >/dev/null 2>&1
}
# This is a function in case a future product name contains language-specific
# escape characters.
vmware_product_name() {
echo 'VMware Tools'
exit 0
}
# Is a given module loaded?
isLoaded() {
local module="$1"
/sbin/kldstat | awk 'BEGIN {n = "no";} {if ($5 == "'"$module.ko"'") n = "yes";} END {print n;}'
}
# Is a given Network interface in use?
isInUse() {
local interface="$1"
LANG=C ifconfig $interface | grep -Eq \
"inet +[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+"
if [ "$?" -eq 0 ]; then
echo 'yes'
else
echo 'no'
fi
}
vmware_failed() {
if [ "`type -t 'echo_failure' 2>/dev/null`" = 'function' ]; then
echo_failure
else
echo -n "$rc_failed"
fi
}
vmware_success() {
if [ "`type -t 'echo_success' 2>/dev/null`" = 'function' ]; then
echo_success
else
echo -n "$rc_done"
fi
}
# Execute a macro
vmware_exec() {
local msg="$1" # IN
local func="$2" # IN
shift 2
echo -n ' '"$msg"
# On Caldera 2.2, SIGHUP is sent to all our children when this script exits
# I wanted to use shopt -u huponexit instead but their bash version
# 1.14.7(1) is too old
#
# Ksh does not recognize the SIG prefix in front of a signal name
if [ "$VMWARE_DEBUG" = 'yes' ]; then
(trap '' HUP; "$func" "$@")
else
(trap '' HUP; "$func" "$@") >/dev/null 2>&1
fi
if [ "$?" -gt 0 ]; then
vmware_failed
echo
return 1
fi
vmware_success
echo
return 0
}
# Execute a macro in the background
vmware_bg_exec() {
local msg="$1" # IN
local func="$2" # IN
shift 2
if [ "$VMWARE_DEBUG" = 'yes' ]; then
# Force synchronism when debugging
vmware_exec "$msg" "$func" "$@"
else
echo -n ' '"$msg"' (background)'
# On Caldera 2.2, SIGHUP is sent to all our children when this script exits
# I wanted to use shopt -u huponexit instead but their bash version
# 1.14.7(1) is too old
#
# Ksh does not recognize the SIG prefix in front of a signal name
(trap '' HUP; "$func" "$@") 2>&1 | logger -t 'VMware[init]' -p daemon.err &
vmware_success
echo
return 0
fi
}
#
# Macro definitions
#
# Note:
# . Each daemon must be started from its own directory to avoid busy devices
# . Each PID file doesn't need to be added to the installer database, because
# it is going to be automatically removed when it becomes stale (after a
# reboot). It must go directly under /var/run, or some distributions
# (RedHat 6.0) won't clean it
#
# Terminate a process synchronously
vmware_synchrone_kill() {
local pid="$1" # IN
local signal="$2" # IN
local second
kill -"$signal" "$pid"
# Wait a bit to see if the dirty job has really been done
for second in 0 1 2 3 4 5 6 7 8 9 10; do
if [ ! -d /proc/"$pid" ]; then
# Success
return 0
fi
sleep 1
done
# Timeout
return 1
}
# Kill the process associated to a pidfile
vmware_stop_pidfile() {
local pidfile="$1" # IN
local pid
pid=`cat "$pidfile" 2>/dev/null`
if [ "$pid" = '' ]; then
# The file probably does not exist or is empty. Success
return 0
fi
# Keep only the first number we find, because some Samba pid files are really
# trashy: they end with NUL characters
# There is no double quote around $pid on purpose
set $pid
pid="$1"
# First try a nice SIGTERM
if vmware_synchrone_kill "$pid" 15; then
return 0
fi
# Then send a strong SIGKILL
if vmware_synchrone_kill "$pid" 9; then
return 0
fi
return 1
}
vmware_switch() {
"$vmdb_answer_BINDIR"/vmware-config-tools.pl --switch
exit 0
}
# Start the guest virtual memory manager
vmware_start_vmmemctl() {
/sbin/kldload "$vmmemctl" >/dev/null 2>&1 || exit 1
exit 0
}
# Stop the guest virtual memory manager
vmware_stop_vmmemctl() {
if [ "`isLoaded "$vmmemctl"`" = 'yes' ]; then
/sbin/kldunload "$vmmemctl" >/dev/null 2>&1 || exit 1
fi
exit 0
}
# Start the virtual ethernet kernel service
vmware_start_vmxnet() {
if [ "`isLoaded "$vmxnet"`" = 'no' ]; then
kldload "$vmxnet" > /dev/null 2>&1 || exit 1
fi
exit 0
}
# Stop the virtual ethernet kernel service
vmware_stop_vmxnet() {
if [ "`isInUse vxn0`" = 'no' ]; then
kldunload "$vmxnet" >/dev/null 2>&1 || exit 1
fi
exit 0
}
#
# Note:
# . Each daemon must be started from its own directory to avoid busy devices
# . Each PID file doesn't need to be added to the installer database, because
# it is going to be automatically removed when it becomes stale (after a
# reboot). It must go directly under /var/run, or some distributions
# (RedHat 6.0) won't clean it
#
# Start the guest OS daemon
vmware_start_guestd() {
cd "$vmdb_answer_SBINDIR" && "$vmdb_answer_SBINDIR"/vmware-guestd \
--background "$GUESTD_PID_FILE"
}
# Stop the guest OS daemon
vmware_stop_guestd() {
vmware_stop_pidfile "$GUESTD_PID_FILE"
}
is_ESX_running() {
if "$vmdb_answer_SBINDIR"/vmware-checkvm -p | grep -q ESX; then
echo yes
else
echo no
fi
}
is_vmmemctl_needed() {
if [ "`is_ESX_running`" = 'yes' ]; then
echo yes
else
echo no
fi
}
is_vmxnet_needed() {
LANG=C pciconf -l 2>&1 | grep -q 'chip=0x072015ad'
if [ "$?" -eq 0 -a "$vmdb_answer_VMXNET_CONFED" = 'yes' ]; then
echo yes
else
echo no
fi
}
# See how we were called.
case "$1" in
start)
exitcode='0'
if vmware_inVM; then
if [ -e "$vmware_etc_dir"/not_configured ]; then
echo "`vmware_product_name`"' is installed, but it has not been '
echo '(correctly) configured for the running kernel.'
echo 'To (re-)configure it, invoke the following command: '
echo "$vmdb_answer_BINDIR"'/vmware-config-tools.pl.'
echo
exit 1
fi
echo 'Starting VMware Tools services in the virtual machine:'
vmware_exec 'Switching to guest configuration:' vmware_switch
exitcode=`expr "$exitcode" + "$?"`
if [ "`is_vmmemctl_needed`" = 'yes' ]; then
vmware_exec 'Guest memory manager:' vmware_start_vmmemctl
exitcode=`expr "$exitcode" + "$?"`
fi
if [ "`is_vmxnet_needed`" = 'yes' ]; then
vmware_exec 'Guest vmxnet fast network device:' vmware_start_vmxnet
exitcode=`expr "$exitcode" + "$?"`
fi
vmware_exec 'Guest operating system daemon:' vmware_start_guestd
exitcode=`expr "$exitcode" + "$?"`
else
echo 'Starting VMware Tools services on the host:'
vmware_exec 'Switching to host config:' vmware_switch
exitcode=`expr "$exitcode" + "$?"`
fi
if [ "$exitcode" -gt 0 ]; then
# Set the 'not configured' flag
touch "$vmware_etc_dir"'/not_configured'
chmod 644 "$vmware_etc_dir"'/not_configured'
db_add_file "$vmware_db" "$vmware_etc_dir"'/not_configured' \
"$vmware_etc_dir"'/not_configured'
exit 1
fi
;;
stop)
exitcode='0'
if vmware_inVM; then
echo 'Stopping VMware Tools services in the virtual machine:'
vmware_exec 'Guest operating system daemon:' vmware_stop_guestd
exitcode=`expr "$exitcode" + "$?"`
if [ "`is_vmmemctl_needed`" = 'yes' ]; then
vmware_exec 'Guest memory manager:' vmware_stop_vmmemctl
exitcode=`expr "$exitcode" + "$?"`
fi
if [ "`is_vmxnet_needed`" = 'yes' ]; then
vmware_exec 'Guest vmxnet fast network device:' vmware_stop_vmxnet
exitcode=`expr "$exitcode" + "$?"`
fi
else
echo -n 'Skipping VMware Tools services shutdown on the host:'
vmware_success
echo
fi
;;
status)
echo -n 'vmware-guestd '
if vmware_check_pidfile "$GUESTD_PID_FILE"; then
echo 'is running'
exit 0;
else
echo 'is not running'
exit 1;
fi
;;
restart)
"$0" stop && "$0" start
;;
*)
echo "Usage: `basename "$0"` {start|stop|status|restart}"
exit 1
esac
exit 0