Improve swap handling

Modify the swap script so it starts before and stops after localmount.
Also, on linux, this script should skip mounting swap on loopback.

Add a swapfiles script which runs after localmount and is designed to
activate additional swap space which could not be activated before
localmount was run. This includes loopback swap on linux and swapfiles
which are on local file systems that were not mounted when swap was
activated initially.

The start code does reactivate swap that is already active, but this is
not an error condition.

Reported-by: Giampaolo Tomassoni <giampaolo@tomassoni.biz>
X-Gentoo-Bug: 401003
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=401003
This commit is contained in:
William Hubbs 2012-02-12 12:37:46 -06:00
parent 5396bf1851
commit 79d6f10926
4 changed files with 58 additions and 4 deletions

View File

@ -1,7 +1,7 @@
DIR= ${INITDIR}
SRCS= bootmisc.in fsck.in hostname.in local.in localmount.in netmount.in \
network.in root.in savecache.in staticroute.in swap.in swclock.in \
sysctl.in urandom.in ${SRCS-${OS}}
network.in root.in savecache.in staticroute.in swap.in swapfiles.in \
swclock.in sysctl.in urandom.in ${SRCS-${OS}}
BIN= ${OBJS}
INSTALLAFTER= _installafter_net.lo

View File

@ -4,7 +4,7 @@
depend()
{
need localmount
before localmount
keyword -jail -openvz -prefix -vserver -lxc
}
@ -12,6 +12,15 @@ start()
{
ebegin "Activating swap devices"
case "$RC_UNAME" in
Linux)
local dev
for dev in $(fstabinfo -b -t swap); do
case "$dev" in
/dev/loop*) ;;
*) swapon $dev 2>/dev/null;;
esac
done
;;
NetBSD|OpenBSD) swapctl -A -t noblk >/dev/null;;
*) swapon -a >/dev/null;;
esac

45
init.d/swapfiles.in Normal file
View File

@ -0,0 +1,45 @@
#!@PREFIX@/sbin/runscript
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
depend()
{
need localmount
keyword -jail -openvz -prefix -vserver -lxc
}
start()
{
ebegin "Activating additional swap space"
case "$RC_UNAME" in
NetBSD|OpenBSD) swapctl -A -t noblk >/dev/null;;
*) swapon -a >/dev/null;;
esac
eend 0 # If swapon has nothing todo it errors, so always return 0
}
stop()
{
ebegin "Deactivating additional swap space"
# Try to unmount all tmpfs filesystems not in use, else a deadlock may
# occur. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
# fixme: Do we need this here since we are only unmounting swap files
# and loopback swap?
cd "$RC_SVCDIR"
umount -a -t tmpfs 2>/dev/null
case "$RC_UNAME" in
Linux)
while read filename type rest; do
case "$type" in
file) swapoff $filename >/dev/null;;
esac
case "$filename" in
/dev/loop*) swapoff $filename >/dev/null;;
esac
done < /proc/swaps
;;
esac
eend 0
}

View File

@ -1,5 +1,5 @@
BOOT= bootmisc fsck hostname localmount \
root swap sysctl urandom ${BOOT-${OS}}
root swap swapfiles sysctl urandom ${BOOT-${OS}}
DEFAULT= local netmount
SHUTDOWN= savecache ${SHUTDOWN-${OS}}
SYSINIT= ${SYSINIT-${OS}}