os_tweaks.sh #6

  • //
  • guest/
  • perforce_software/
  • sdp/
  • dev/
  • Server/
  • Unix/
  • setup/
  • os_tweaks.sh
  • View
  • Commits
  • Open Download .zip Download (5 KB)
#!/bin/bash
#------------------------------------------------------------------------------
set -u

# Usage (bash syntax):
# ./os_tweaks.sh 2>&1 | tee /tmp/os_tweaks.log

# This script checks, and if need be sets, certain OS parameters per
# Perforce recommendations: http://answers.perforce.com/articles/KB/3005#LINUX

# Following is a sample manual session:
# ROOT@perforce1:/root cat /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
# [yes] no
# ROOT@perforce1:/root cat /sys/kernel/mm/transparent_hugepage/defrag
# [always] madvise never
# ROOT@perforce1:/root cat /sys/kernel/mm/transparent_hugepage/enabled
# [always] madvise never
# ROOT@perforce1:/root echo no > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
# ROOT@perforce1:/root echo never > /sys/kernel/mm/transparent_hugepage/defrag
# ROOT@perforce1:/root echo never > /sys/kernel/mm/transparent_hugepage/enabled
# ROOT@perforce1:/root cat /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
# yes [no]
# ROOT@perforce1:/root cat /sys/kernel/mm/transparent_hugepage/defrag
# always madvise [never]
# ROOT@perforce1:/root cat /sys/kernel/mm/transparent_hugepage/enabled
# always madvise [never]

function msg () { echo -e "$*"; }
function bail () { msg "\\n${1:-Unknown Error}\\n"; exit "${2:-1}"; }

declare -i i=0
declare -a Files
declare -i ChangesNeeded=0
declare -a CurrentValues
declare -a CorrectValues
declare CurrentValue=
declare Version=1.1.0

# Static Data
Files[0]=/sys/kernel/mm/transparent_hugepage/khugepaged/defrag
Files[1]=/sys/kernel/mm/transparent_hugepage/defrag
Files[2]=/sys/kernel/mm/transparent_hugepage/enabled

msg "Started ${0##*/} v$Version on host ${HOSTNAME%%.*} at $(date)."

# Note: On CentOS systems, /etc/redhat-release is a symlink to /etc/centos-release.

# The exact string to grep for is not perfectly consistent between RHEL/CentOS
# releases.
if [[ -r /etc/redhat-release ]]; then
   if grep -q 'CentOS release 6' /etc/redhat-release; then
      msg "Verified: Running on supported OS (CentOS 6)."
      CorrectValues[0]="no"
   elif grep -q 'Red Hat Enterprise Linux Server release 6' /etc/redhat-release; then
      msg "Verified: Running on supported OS (RHEL 6)."
      CorrectValues[0]="no"
   elif grep -q 'CentOS Linux release 7' /etc/redhat-release; then
      msg "Verified: Running on supported OS (CentOS 7)."
      CorrectValues[0]="0"
   elif grep -q 'Red Hat Enterprise Linux Server release 7' /etc/redhat-release; then
      msg "Verified: Running on supported OS (RHEL 7)."
      CorrectValues[0]="0"
   else
      bail "Unknown RHEL/CentOS version encountered."
   fi
elif [[ -r /etc/lsb-release ]]; then
   if grep -q '^DISTRIB_CODENAME=xenial' /etc/lsb-release; then
      msg "Verified: Running on supported OS (Ubuntu 16.04)."
      CorrectValues[0]="0"
   elif grep -q '/^DISTRIB_CODENAME=bionic' /etc/lsb-release; then
      msg "Verified: Running on supported OS (Ubuntu 18.04)."
      CorrectValues[0]="0"
   else
      bail "Unknown Ubuntu version encountered."
   fi
else
   bail "This ${0##*/} script runs on RHEL/CentOS 6/7 and Ubuntu 16.04 only."
fi

[[ $(whoami) == root ]] || bail "This must be run as root."

CorrectValues[1]="never"
CorrectValues[2]="never"

echo -e "\nStarted ${0##*/} v$Version at $(date) on $(hostname --fqdn).\n"

while [[ $i -lt ${#Files[*]} ]]; do
   if [[ -r ${Files[$i]} ]]; then
      CurrentValue=$(cat ${Files[$i]})
      CurrentValue=${CurrentValue#*\[}
      CurrentValue=${CurrentValue%\]*}
      CurrentValues[$i]=$CurrentValue
   else
      bail "Expected file does not exist: ${Files[$i]}"
   fi

   echo -n -e "File:        : ${Files[$i]}\nCurrent Value: ${CurrentValues[$i]}\nCorrect Value: ${CorrectValues[$i]}"

   if [[ "$CurrentValue" == "${CorrectValues[$i]}" ]]; then
      echo -e " (OK)\n"
   else
      echo -e " (Needs to be adjusted)\n"
      ChangesNeeded=$((ChangesNeeded+1))
   fi

   i=$((i+1))
done

if [[ $ChangesNeeded -eq 0 ]]; then
   echo -e "Verified: No changes to the OS parameters checked by this script are needed.\n"
   exit 0
else
   echo -e "Detected $ChangesNeeded of ${#Files[*]} OS parameters needing to be updated.\n"
fi

echo -e "Making updates.\n"
i=0
while [[ $i -lt ${#Files[*]} ]]; do
   CurrentValue=$(cat ${Files[$i]})
   CurrentValue=${CurrentValue#*\[}
   CurrentValue=${CurrentValue%\]*}

   [[ "$CurrentValue" == "${CorrectValues[$i]}" ]] && continue

   echo -e "Setting value to ${CorrectValues[$i]} in ${Files[$i]}"
   echo ${CorrectValues[$i]} > ${Files[$i]} || bail  "Failed to set value in ${Files[$i]}."

   i=$((i+1))
done

echo -e "\nRechecking files after making updates.\n"
i=0
ChangesNeeded=0

while [[ $i -lt ${#Files[*]} ]]; do
   CurrentValue=$(cat ${Files[$i]})
   CurrentValue=${CurrentValue#*\[}
   CurrentValue=${CurrentValue%\]*}

   echo -n -e "File:        : ${Files[$i]}\nCurrent Value: $CurrentValue\nCorrect Value: ${CorrectValues[$i]}"

   if [[ "$CurrentValue" == "${CorrectValues[$i]}" ]]; then
      echo -e " (OK)\n"
   else
      echo -e " (Still needs to be adjusted)\n"
      ChangesNeeded=$((ChangesNeeded+1))
   fi

   i=$((i+1))
done

if [[ $ChangesNeeded -eq 0 ]]; then
   echo -e "Done. All OS parameters needing updates have been made.\n"
else
   bail "Some OS parameter updates failed.  See output above.\n"
fi

# Change User Description Committed
#8 26904 C. Thomas Tyler Added stock SDP copyright.
No functional change.
#7 26239 C. Thomas Tyler Upgraded to drop Linux flavor detection, since these are kernel parameters
not dependent on the Linux flavor.
#6 25868 C. Thomas Tyler Added support for Ubuntu 16.04, 18.04.
#5 23733 C. Thomas Tyler Fixed "supported OS" safety-check in os_tweaks to run on all RHEL/CentOS 6/7 versions.
#4 22890 C. Thomas Tyler Adapted to 'Maipo' codename for RHEL 7 release now visible in
/etc/redhat-release on RHEL/CentOS 7.4 systems.
#3 22621 C. Thomas Tyler Corrected OS version check to work on all CentOS 6.x releases,
not just Santiago (6.8).
#2 21175 C. Thomas Tyler Merge down of os_tweaks.sh from main.
#1 20262 C. Thomas Tyler Added utility script to make recommended OS tweaks.
 This script
checks current values, and makes updates if needed.  It must
be run as root, and is only tested on RHEL/CentOS (and has built-in
safety features).