Reorganizing frontend in source tree.
[live-boot-grml.git] / frontend / live-swapfile
diff --git a/frontend/live-swapfile b/frontend/live-swapfile
new file mode 100755 (executable)
index 0000000..745fa87
--- /dev/null
@@ -0,0 +1,100 @@
+#!/bin/sh
+
+# File: live-swapfile - create and use a swap file
+# Copyright: (C) 2009 Daniel Baumann <mail@daniel-baumann.ch>
+# 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