Avatar billede fiskerendk Nybegynder
06. oktober 2007 - 15:51 Der er 1 løsning

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=' done'
  rc_failed='failed'
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
Avatar billede fiskerendk Nybegynder
12. oktober 2007 - 00:45 #1
har fixet det lavede en extra startupfil i rc.d og nu virker det..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester