diff options
| author | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
|---|---|---|
| committer | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
| commit | 7c478bd95313f5f23a4c958a745db2134aa03244 (patch) | |
| tree | c871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/cmd/initpkg/swapadd.sh | |
| download | illumos-joyent-7c478bd95313f5f23a4c958a745db2134aa03244.tar.gz | |
OpenSolaris Launch
Diffstat (limited to 'usr/src/cmd/initpkg/swapadd.sh')
| -rw-r--r-- | usr/src/cmd/initpkg/swapadd.sh | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/usr/src/cmd/initpkg/swapadd.sh b/usr/src/cmd/initpkg/swapadd.sh new file mode 100644 index 0000000000..f1bbe14602 --- /dev/null +++ b/usr/src/cmd/initpkg/swapadd.sh @@ -0,0 +1,146 @@ +#!/sbin/sh +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# +# Copyright (c) 1991, 1998-1999 by Sun Microsystems, Inc. +# All rights reserved. +# +# Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T +# All rights reserved. +# +# +#ident "%Z%%M% %I% %E% SMI" + +PATH=/usr/sbin:/usr/bin; export PATH +USAGE="Usage: swapadd [-12] [file_system_table]" + +VFSTAB=/etc/vfstab # Default file system table +PASS=2 # Default to checking for existing swap + +# +# Check to see if there is an entry in the fstab for a specified file and +# mount it. This allows swap files (e.g. nfs files) to be mounted before +# being added for swap. +# +checkmount() +{ + while read rspecial rfsckdev rmountp rfstype rfsckpass rautomnt rmntopts + do + # + # Ignore comments, empty lines, and no-action lines + # + case "$rspecial" in + '#'* | '' | '-') continue ;; + esac + + if [ "x$rmountp" = "x$1" ]; then + # + # If mount options are '-', default to 'rw' + # + [ "x$rmntopts" = x- ] && rmntopts=rw + + if /sbin/mount -m -o $rmntopts $rspecial \ + >/dev/null 2>&1; then + echo "Mounting $rmountp for swap" + else + echo "Mount of $rmountp for swap failed" + fi + return + fi + done <$VFSTAB +} + +die() +{ + echo "$*" >& 2 + exit 1 +} + +while getopts 12 opt; do + case "$opt" in + 1|2) PASS=$opt ;; + \?) die "$USAGE" ;; + esac +done +shift `expr $OPTIND - 1` + +[ $# -gt 1 ] && die "$USAGE" +[ $# -gt 0 ] && VFSTAB="$1" + +# +# If $VFSTAB is not "-" (stdin), re-open stdin as the specified file +# +if [ "x$VFSTAB" != x- ]; then + [ -s "$VFSTAB" ] || die "swapadd: file system table ($VFSTAB) not found" + exec <$VFSTAB +fi + +# +# Read the file system table to find entries of file system type "swap". +# Add the swap device or file specified in the first column. +# +while read special t1 t2 fstype t3 t4 t5; do + # + # Ignore comments, empty lines, and no-action lines + # + case "$special" in + '#'* | '' | '-') continue ;; + esac + + # + # Ignore non-swap fstypes + # + [ "$fstype" != swap ] && continue + + if [ $PASS = 1 ]; then + # + # Pass 1 should handle adding the swap files that + # are accessable immediately; block devices, files + # in / and /usr, and direct nfs mounted files. + # + if [ ! -b $special ]; then + # + # Read the file system table searching for mountpoints + # matching the swap file about to be added. + # + # NB: This won't work correctly if the file to added + # for swapping is a sub-directory of the mountpoint. + # e.g. swapfile-> servername:/export/swap/clientname + # mountpoint-> servername:/export/swap + # + checkmount $special + fi + if [ -f $special -a -w $special -o -b $special ]; then + swap -$PASS -a $special >/dev/null + fi + else + # + # Pass 2 should skip all the swap already added. If something + # added earlier uses the same name as something to be added + # later, the following test won't work. This should only happen + # if parts of a particular swap file are added or deleted by + # hand between invocations. + # + swap -l 2>/dev/null | grep '\<'${special}'\>' >/dev/null 2>&1 \ + || swap -$PASS -a $special >/dev/null + fi +done |
