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