From b3604a8f65f0361d7d0481411aa49e9b969dd19a Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 14 May 2009 10:05:46 +0200 Subject: [PATCH] Initial commit for having support for swapfiles. --- Makefile | 4 +-- bin/live-swapfile | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 2 deletions(-) create mode 100755 bin/live-swapfile diff --git a/Makefile b/Makefile index 40ce7af..e01ae9b 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ install: test build # Installing executables mkdir -p $(DESTDIR)/sbin - cp bin/live-getty bin/live-login bin/live-new-uuid bin/live-snapshot $(DESTDIR)/sbin + cp bin/live-getty bin/live-login bin/live-new-uuid bin/live-snapshot bin/live-swapfile $(DESTDIR)/sbin mkdir -p $(DESTDIR)/usr/share/live-initramfs cp bin/live-preseed bin/live-reconfigure contrib/languagelist $(DESTDIR)/usr/share/live-initramfs @@ -76,7 +76,7 @@ uninstall: rm -f $(DESTDIR)/etc/live.conf # Uninstalling executables - rm -f $(DESTDIR)/sbin/live-getty $(DESTDIR)/sbin/live-login $(DESTDIR)/sbin/live-snapshot + rm -f $(DESTDIR)/sbin/live-getty $(DESTDIR)/sbin/live-login $(DESTDIR)/sbin/live-snapshot $(DESTDIR)/sbin/live-swapfile rm -rf $(DESTDIR)/usr/share/live-initramfs rm -f $(DESTDIR)/usr/share/initramfs-tools/hooks/live rm -rf $(DESTDIR)/usr/share/initramfs-tools/scripts/live* diff --git a/bin/live-swapfile b/bin/live-swapfile new file mode 100755 index 0000000..2c61036 --- /dev/null +++ b/bin/live-swapfile @@ -0,0 +1,100 @@ +#!/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 -- 2.1.4