123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- #!/usr/bin/env bash
- source "$rvm_scripts_path/base"
- true ${rvm_trace_flag:-0}
- if (( rvm_trace_flag == 2 ))
- then
- set -x
- export rvm_trace_flag
- fi
- system="${_system_type}"
- version="${rvm_ruby_string}.${system}"
- # Check we're on a suitable 64-bit machine
- case "$system" in
- Linux)
- if [[ "${_system_arch}" != "x86_64" ]]
- then
- rvm_error "This script only works on a 64-bit Linux OS."
- echo "The result from \"uname -sm\" is \"${_system_type} ${_system_arch}\" not \"Linux x86_64\""
- exit 1
- fi
- ;;
- Darwin)
- system_version="$(sw_vers -productVersion)"
- MAJOR="$(echo $system_version | cut -f1 -d.)"
- MINOR="$(echo $system_version | cut -f2 -d.)"
- CPU_CAPABLE="$(sysctl hw.cpu64bit_capable | cut -f2 -d' ')"
- #
- # Check the CPU and Mac OS profile.
- if [[ $CPU_CAPABLE -ne 1 || $MAJOR -lt 10 || $MINOR -lt 5 ]]
- then
- rvm_error "This script requires Mac OS 10.5 or later on a 64-bit Intel CPU."
- exit 1
- fi
- ;;
- SunOS)
- if [[ "${_system_arch}" != "i386" || "$(isainfo -b)" != "64" ]]
- then
- rvm_error "This script only works on a 64-bit Solaris-x86 OS."
- exit 1
- fi
- ;;
- *)
- rvm_error "This script only works on a 64-bit Linux, Mac OS X, or Solaris-x86 machine"
- echo "The result from \"uname -sm\" is \"${_system_type} ${_system_version}\""
- exit 1
- ;;
- esac
- # We should run this as a normal user, not root.
- if (( UID == 0 ))
- then
- rvm_error "This script should be run as a normal user, not root."
- exit 1
- fi
- # Check that the current directory is writable
- if [[ ! -w "." ]]
- then
- rvm_error "This script requires write permission on your current directory."
- __rvm_ls -ld $PWD
- exit 1
- fi
- # We're good to go. Let user know.
- machine_name="$(command uname -n)"
- rvm_log "Starting installation of $version on $machine_name"
- # Figure out how much total memory is installed
- rvm_log "Setting up shared memory"
- #
- # Ref: http://wiki.finkproject.org/index.php/Shared_Memory_Regions_on_Darwin
- # Ref: http://developer.postgresql.org/pgdocs/postgres/kernel-resources.html
- # Ref: http://www.idevelopment.info/data/Oracle/DBA_tips/Linux/LINUX_8.shtml
- #
- case "$system" in
- Linux)
- # use TotalMem: kB because Ubuntu doesn't have Mem: in Bytes
- totalMemKB=$(__rvm_awk '/MemTotal:/{print($2);}' /proc/meminfo)
- totalMem=$(($totalMemKB * 1024))
- # Figure out the max shared memory segment size currently allowed
- shmmax=$(\command \cat /proc/sys/kernel/shmmax)
- # Figure out the max shared memory currently allowed
- shmall=$(\command \cat /proc/sys/kernel/shmall)
- ;;
- Darwin)
- totalMem="$(sysctl hw.memsize | cut -f2 -d' ')"
- # Figure out the max shared memory segment size currently allowed
- shmmax="$(sysctl kern.sysv.shmmax | cut -f2 -d' ')"
- # Figure out the max shared memory currently allowed
- shmall="$(sysctl kern.sysv.shmall | cut -f2 -d' ')"
- ;;
- SunOS)
- # TODO: figure memory needs for SunOS
- # Investigate project.max-shm-memory
- totalMemMB="$(/usr/sbin/prtconf | __rvm_grep Memory | cut -f3 -d' ')"
- totalMem=$(($totalMemMB * 1048576))
- shmmax=$(($totalMem / 4))
- shmall=$(($shmmax / 4096))
- ;;
- *)
- rvm_error "Can't determine operating system. Check script."
- exit 1
- ;;
- esac
- totalMemMB=$(($totalMem / 1048576))
- shmmaxMB=$(($shmmax / 1048576))
- shmallMB=$(($shmall / 256))
- # Print current values
- echo " Total memory available is $totalMemMB MB"
- echo " Max shared memory segment size is $shmmaxMB MB"
- echo " Max shared memory allowed is $shmallMB MB"
- # Figure out the max shared memory segment size (shmmax) we want
- # Use 75% of available memory but not more than 2GB
- shmmaxNew=$(($totalMem * 3/4))
- if (( shmmaxNew > 2147483648 ))
- then
- shmmaxNew=2147483648
- fi
- shmmaxNewMB=$(($shmmaxNew / 1048576))
- # Figure out the max shared memory allowed (shmall) we want
- # The Darwin (OSX) default is 4MB, way too small
- # The Linux default is 2097152 or 8GB, so we should never need this
- # but things will certainly break if it's been reset too small
- # so ensure it's at least big enough to hold a fullsize shared memory segment
- shmallNew=$(($shmmaxNew / 4096))
- if (( shmallNew < shmall ))
- then
- shmallNew=$shmall
- fi
- shmallNewMB=$(($shmallNew / 256))
- # Increase shmmax if appropriate
- if (( shmmaxNew > shmmax ))
- then
- rvm_log "Increasing max shared memory segment size to $shmmaxNewMB MB"
- case "${system}" in
- Darwin)
- __rvm_try_sudo sysctl -w kern.sysv.shmmax=$shmmaxNew
- ;;
- Linux)
- __rvm_try_sudo bash -c "echo $shmmaxNew > /proc/sys/kernel/shmmax"
- ;;
- SunOS)
- echo "[[Warning]] shmmax must be set manually on SunOS"
- ;;
- esac
- else
- rvm_log "No need to increase max shared memory segment size"
- fi
- # Increase shmall if appropriate
- if (( shmallNew > shmall ))
- then
- rvm_log "Increasing max shared memory allowed to $shmallNewMB MB"
- case "${system}" in
- Darwin)
- __rvm_try_sudo sysctl -w kern.sysv.shmall=$shmallNew
- ;;
- Linux)
- __rvm_try_sudo bash -c "echo $shmallNew > /proc/sys/kernel/shmall"
- ;;
- SunOS)
- echo "[[Warning]]shmall must be set manually on SunOS"
- ;;
- esac
- else
- rvm_log "No need to increase max shared memory allowed"
- fi
- # At this point, shared memory settings contain the values we want,
- # put them in sysctl.conf so they are preserved.
- if [[ ! -f /etc/sysctl.conf ]] || (( $(__rvm_grep -sc "kern.*.shm" /etc/sysctl.conf) == 0 ))
- then
- case "$system" in
- Linux)
- echo "# kernel.shm* settings added by MagLev installation" > /tmp/sysctl.conf.$$
- echo "kernel.shmmax=$(\command \cat /proc/sys/kernel/shmmax)" >> /tmp/sysctl.conf.$$
- echo "kernel.shmall=$(\command \cat /proc/sys/kernel/shmall)" >> /tmp/sysctl.conf.$$
- ;;
- Darwin)
- # On Mac OS X Leopard, you must have all five settings in sysctl.conf
- # before they will take effect.
- echo "# kern.sysv.shm* settings added by MagLev installation" > /tmp/sysctl.conf.$$
- sysctl kern.sysv.shmmax kern.sysv.shmall kern.sysv.shmmin kern.sysv.shmmni \
- kern.sysv.shmseg | \command \tr ":" "=" | \command \tr -d " " >> /tmp/sysctl.conf.$$
- ;;
- SunOS)
- # Do nothing in SunOS since /etc/sysctl.conf is ignored on Solaris 10.
- # Must configure shared memory settings manually.
- ;;
- *)
- rvm_error "Can't determine operating system. Check script."
- exit 1
- ;;
- esac
- # Do nothing on SunOS since /etc/sysctl.conf is ignored on Solaris 10.
- if [[ "$system" != "SunOS" ]]
- then
- rvm_log "Adding the following section to /etc/sysctl.conf"
- \command \cat /tmp/sysctl.conf.$$
- __rvm_try_sudo bash -c "\command \cat /tmp/sysctl.conf.$$ >> /etc/sysctl.conf"
- /bin/\command \rm -f /tmp/sysctl.conf.$$
- fi
- else
- rvm_log "The following shared memory settings already exist in /etc/sysctl.conf"
- echo "To change them, remove the following lines from /etc/sysctl.conf and rerun this script"
- __rvm_grep "kern.*.shm" /etc/sysctl.conf
- fi
- # Now setup for NetLDI in case we ever need it.
- rvm_log "Setting up GemStone netldi service port"
- if (( $(__rvm_grep -sc "^gs64ldi" /etc/services) == 0 ))
- then
- echo '[[Info]] Adding "gs64ldi 50378/tcp" to /etc/services'
- __rvm_try_sudo bash -c 'echo "gs64ldi 50378/tcp # Gemstone netldi" >> /etc/services'
- else
- rvm_log "GemStone netldi service port is already set in /etc/services"
- echo "To change it, remove the following line from /etc/services and rerun this script"
- __rvm_grep "^gs64ldi" /etc/services
- fi
|