#!/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). |