#!/bin/sh # File: live-swapfile - create and use a swap file # Copyright: (C) 2009 Daniel Baumann # License: GPL-3+ set -e # Options _SWAP_DIRECTORY="${_SWAP_DIRECTORY:-/live/swap}" _SWAP_FILE="${_SWAP_FILE:-swapfile.img}" _SWAP_SIZE="${_SWAP_SIZE:-auto}" _SWAP_FACTOR="${_SWAP_FACTOR:-2}" _SWAP_PURGE="${_SWAP_PURGE:-true}" _FORCE="${_FORCE:-true}" case "${1}" in add) # Reading size of physical memory _MEM_TOTAL_KB="$(awk '/^MemTotal: / { print $2 }' /proc/meminfo)" _MEM_TOTAL_MB="$(expr ${_MEM_TOTAL_KB} / 1024)" echo "Found ${_MEM_TOTAL_MB} MB physical memory." # Setting size of new swapfile if [ -z "${_SWAP_SIZE}" ] || [ "${_SWAP_SIZE}" = "auto" ] then _SWAP_SIZE_KB="$(expr ${_MEM_TOTAL_KB} '*' ${_SWAP_FACTOR})" _SWAP_SIZE_MB="$(expr ${_SWAP_SIZE_KB} / 1024)" else _SWAP_SIZE_MB="${_SWAP_SIZE}" fi echo "Requesting ${_SWAP_SIZE_MB} MB swapfile." # Reading size of old swapfile if [ -e "${_SWAP_DIRECTORY}/${_SWAP_FILE}" ] then _SWAP_FILESIZE="$(ls -hl ${_SWAP_DIRECTORY}/${_SWAP_FILE} | awk '{ print $5 }')" echo "Found ${_SWAP_FILESIZE} MB swapfile." fi # Creating new swap file if [ "${_SWAP_FILESIZE}" != "${_SWAP_SIZE_MB}M" ] then if [ "${_FORCE}" = "true" ] then # Removing old swapfile rm -f "${_SWAP_DIRECTORY}/${_SWAP_FILE}" echo "Creating ${_SWAP_SIZE_MB} MB swapfile." mkdir -p "${_SWAP_DIRECTORY}" # Unfortunately, swapon does not support files # with holes, therefore we cannot preallocate. dd if=/dev/zero of="${_SWAP_DIRECTORY}/${_SWAP_FILE}" bs=1024k count="${_SWAP_SIZE_MB}" else echo "Exit." return 1 fi fi echo "Enabling ${_SWAP_DIRECTORY}/${_SWAP_FILE}." mkswap "${_SWAP_DIRECTORY}/${_SWAP_FILE}" swapon "${_SWAP_DIRECTORY}/${_SWAP_FILE}" ;; rm|remove) if grep -qs "${_SWAP_DIRECTORY}/${_SWAP_FILE}" /proc/swaps then echo "Disabling ${_SWAP_DIRECTORY}/${_SWAP_FILE}." swapoff "${_SWAP_DIRECTORY}/${_SWAP_FILE}" fi if [ "${_SWAP_PURGE}" = "true" ] then echo "Removing ${_SWAP_DIRECTORY}/${_SWAP_FILE}." rm -f "${_SWAP_DIRECTORY}/${_SWAP_FILE}" __DIRECTORY="${_SWAP_DIRECTORY}" while [ "${__DIRECTORY}" != "/" ] do rmdir --ignore-fail-on-non-empty "${__DIRECTORY}" __DIRECTORY="$(dirname ${__DIRECTORY})" done fi ;; *) echo "Usage: ${0} {add|remove}" exit 1 ;; esac