linux-server-tools/swap-management/addswap.sh

187 lines
5.2 KiB
Bash

#!/bin/bash
## addswap.sh
## version 1.01
## Quickly add and activate a SWAP file.
## Author: Ze'ev Schurmann
## License: GPL3.0 or later
## Git Repo: https://git.zaks.web.za/thisiszeev/linux-server-tools
## Usage:
##
## (as root)
## ./addswap.sh {size-in-gigaytes}
##
## (with sudo)
## sudo ./addswap.sh {size-in-gigaytes}
##
## {size-in-gigabytes} is optional. If you leave it out then the size will default
## to 4GB.
##
## The script will quickly create a SWAP file, activate it and add it to /etc/fstab
##
## It is important that you have addswap.sh and remswap.sh in the same folder and
## set the permissions to 700 and the owner and group to root. Do not try and run
## either script with out root or sudo privelages.
##
## A log file can be found at /var/log/swapmanagement.log
## Why did I make these two scripts?
##
## I use Debian as my daily driver (I've been using Linux in some for or the other
## as my daily driver since 2006). I also us Debian for all my servers. I also
## running a webhosting business (https://www.zaks.web.za) and in my 20+ years in
## the game, I have learned that... 1. VPS's do not come with SWAP, but sometimes
## you need a bit of SWAP to handle heavy load. 2. SWAP files can be added and
## removed on the fly (no reboot required), however a SWAP partition, not so simple.
##
## On my daily driver machine, I also create a lot of digital artwork. I recently
## found myself rendering a finished artfile that was 9.5GB (24000px by 13700px)
## in Gimp, and half way through I started running out of RAM and SWAP. So I
## quickly created the needed SWAP file, and Gimp was able to finish the render
## without crashing.
## Plans for the future:
##
## I am planning to make a configurable service file that can be run in the
## background to automatically create more SWAP files when your server/computer is
## under load, and remove excess SWAP files when the server/computer is no longer
## under load.
## Do you have a script idea?
## If you have an idea for a useful server script for selfhost/homelab environments,
## please start a chat with me on Reddit /u/thisiszeev and share your idea. I might
## just make it a reality, and give you credit in the relevant README.md file.
## Donations
##
## Please consider making me small donation. Even though my scripts are open source
## and free to use, I still need to eat. And the occasional bottle of wine also goes
## down well.
##
## $5 buys me a cup of coffee
## $10 buys me a nice burger
## $20 buys me a bottle of wine
## Anything above that will be awesome as well.
##
## You can send me a donation via Paypal https://www.paypal.com/paypalme/thisiszeev
##
## Drop me a message on Reddit if you do make a donation. u/thisiszeev
##
## Support is only offered freely to those who donate $20 or more.
##
## Your donation contributes to further development.
##
## If you need a custom script, contact me on Reddit for pricing.
function echolog {
echo "$1"
echo "$(date) > addswap > $1" >> /var/log/swapmanagement.log
if [[ $(wc -l < /var/log/swapmanagement.log) -gt 300 ]]; then
cat /var/log/swapmanagement.log | tail -n 250 > /var/log/swapmanagement.temp && mv /var/log/swapmanagement.temp /var/log/swapmanagement.log
fi
}
if [[ -z $1 ]] || [[ $1 = "" ]] || [[ ! $1 =~ ^[0-9]+$ ]] || [[ $1 -le 0 ]]; then
swapsize=4
echolog "Swap size not defined. Defaulting to 4GB."
else
swapsize=$1
echolog "Swap size manually defined as ${swapsize}GB."
fi
partitioncount=$(swapon --show | grep "partition" | wc -l)
filecount=$(swapon --show | grep "file" | wc -l)
totalcount=$((partitioncount+filecount))
echolog "You currently have $partitioncount active swap partitions and $filecount active swap files."
if [[ $totalcount -gt 23 ]]; then
echolog "You already have 24 or more active swap partitions and files."
exit 1
fi
swaplimit=$((24-$partitioncount))
array=($(df | grep "/$"))
freespace=$((${array[3]}/1048576))
if [[ $freespace -gt $swapsize ]]; then
checking=true
n=1
while [[ $checking == true ]]; do
if [[ $n -gt $swaplimit ]]; then
echolog "You already have 24 or more active swap partitions and files."
exit 1
fi
if [[ $n -lt 10 ]]; then
ext="00$n"
elif [[ $n -lt 25 ]] && [[ $n -gt 9 ]]; then
ext="0$n"
else
echolog "You already have 24 or more active swap partitions and files."
exit 1
fi
if [[ -f /swapfile.$ext ]]; then
if swapon --show=NAME | grep -qF "/swapfile.$ext"; then
echolog "/swapfile.$ext exists...[Active]"
else
echolog "/swapfile.$ext exists...[Inactive] > Removing"
bash remswap.sh "/swapfile.$ext"
filecount=$(swapon --show | grep "file" | wc -l)
fi
((n++))
else
echolog "Creating /swapfile.$ext..."
fallocate -l ${swapsize}G /swapfile.$ext
chmod 600 /swapfile.$ext
mkswap /swapfile.$ext
swapon /swapfile.$ext
echo "/swapfile.$ext none swap sw 0 0" >> /etc/fstab
checking=false
filecount=$(swapon --show | grep "file" | wc -l)
echolog "You now have $partitioncount active swap partitions and $filecount active swap files."
exit 0
fi
done
else
echolog "Not enough harddrive space to make a ${swapsize}GB swap file."
exit 2
fi