適用於 Solaris 2.6 的 Solaris Resource Manager 1.0 系統管理指南(SPARC 平台版)

附錄 A Solaris Resource Manager 指令集範例

初始指令集

系統供應下列的自動指令集 /etc/init.d/init.srm,在系統變更為執行層級 2 或 3(多重使用者模式)時,它會以一個啟始引數來執行。而在系統關機時,它會以一個停止引數來執行。

#!/bin/sh
#
# Copyright (c) 1998 by Sun Microsystems, Inc.
# All rights reserved.
#
# Copyright 1995-1997 Softway Pty. Ltd.
#
# Start/stop Solaris Resource Manager v1.0
#
#ident  "@(#)init.srm 1.17 98/10/27 SMI"

#######################################################################
# Default values.

DATADIR=/var/srm
ShareDb=$DATADIR/srmDB
LimdaemonOptions=
ChargeOptionsOn="limits=y:share=y:adjgroups=y:limshare=y"
ChargeOptionsOff="limits=n:share=n:adjgroups=n:limshare=n"

LostLnode=srmlost
IdleLnode=srmidle

#######################################################################

# ECHO=echo	# For a verbose startup and shutdown
ECHO=:		# For a quiet startup and shutdown

SRMDIR=/usr/srm
SRMBIN=$SRMDIR/bin
SRMSBIN=$SRMDIR/sbin
ETCSRM=/etc/srm

PATH=/sbin:/usr/sbin:/bin:$PATH:$SRMSBIN:$SRMBIN
export PATH
case "$1" in
'start')
	if [ ! -x $SRMBIN/srmadm ]; then 
		echo "Solaris Resource Manager *not* installed." \
			"Missing srmadm command."
		exit
	fi

	# Only bother if sched/SHR is loaded.
	if [ `$SRMBIN/srmadm` != yes ]
	then
		#
		# Usually this is because /etc/system doesn't have the usual
		#	set initclass="SHR"
		# or at least a set extraclass="SHR"
		#
		echo "Solaris Resource Manager *not* loaded."
		exit
	else
		echo "Enabling Solaris Resource Manager v1.0."
		if [ `$SRMBIN/srmadm show fileopen` = yes ]; then
			echo "SRM database file already open - stopping first."
			limdaemon -k
			sleep 2
			srmadm set $ChargeOptionsOff
			sync
			srmadm set fileopen=n
			$ECHO "SRM inactive"
		fi
		$ECHO "Starting SRM..."
	fi

	# Check the limconf file.
	if [ ! -s $ETCSRM/limconf ]; then
		echo "SRM - file $ETCSRM/limconf is missing " >&2
		echo "SRM not started."
		exit 1
	fi

	if [ ! -f "$ShareDb" ]; then
		echo "SRM database '$ShareDb' not present - " \
			"creating empty database"
		if [ ! -d "$DATADIR" ]; then
			mkdir "$DATADIR"
			chmod 400 "$DATADIR"
			chown root "$DATADIR"
			chgrp root "$DATADIR"
		fi
		touch "$ShareDb" ||
		{
			echo "Failed to create '$ShareDb'" >&2
			echo "SRM not started"
			exit 1
		}
		chmod 400 "$ShareDb"
		chown root "$ShareDb"
		chgrp root "$ShareDb"
	fi

	CreateLnodes=0
	if [ ! -s "$ShareDb" ]; then
		$ECHO "SRM Warning: Using empty database" >&2
		CreateLnodes=1
	fi

	$ECHO "SRM starting ... \c"

	# Open Lnode file.
	srmadm set -f "$ShareDb" fileopen=y
	if [ $? != 0 ]; then
		echo
		echo "srmadm set -f $ShareDb failed" >&2
		echo "SRM not started"
		exit 1
	fi

	# Set SRM global options.
	srmadm set $ChargeOptionsOn
	if [ $? != 0 ]; then
		echo
		echo "srmadm set $ChargeOptionsOn failed" >&2
		echo "SRM not completely enabled"
		exit 1
	fi

	# Create if needed the other lnode.
	liminfo other 2>/dev/null | grep "^Login name:  *other " >/dev/null 2>&1
	if [ $? -ne 0 ]; then
		# If user "other" exists but has no lnode, create one.
		limadm set cpu.shares=1 other 2>/dev/null
		limadm set sgroup=root other 2>/dev/null
	fi

	# Create if needed, and set the lost lnode.
	if [ x"$LostLnode" != x ]; then
        	liminfo "$LostLnode" 2>/dev/null | \
			grep "^Login name:  *$LostLnode " >/dev/null 2>&1
		if [ $? -ne 0 ]; then
			limadm set cpu.shares=1 "$LostLnode"
			limadm set sgroup=root "$LostLnode"
		fi
		srmadm set lost="$LostLnode" ||
		$ECHO "SRM - Warning: No user '$LostLnode' for lost lnode"
	fi

	# Create if needed, and set the idle lnode.
	if [ x"$IdleLnode" != x ]; then
        	liminfo "$IdleLnode" 2>/dev/null | \
			grep "^Login name:  *$IdleLnode " >/dev/null 2>&1
		if [ $? -ne 0 ]; then
			limadm set cpu.shares=0 "$IdleLnode"
			limadm set sgroup=root "$IdleLnode"
		fi
		srmadm set idle="$IdleLnode" ||
		$ECHO "SRM - Warning: No user '$IdleLnode' for idle lnode"
	fi

	# If creating SRM database, set up existing users.
	if [ "$CreateLnodes" -eq 1 ]; then
		echo "SRM - creating user lnodes; may take a while"
	# We now want to catch any other users which were not found
	# on the filesystems.  First we need to decide what the maximum
	# uid value we will create an l-node entry for in the database.
	# We choose less than the uid for 'nobody' so that we can try
	# and minimise the apparent size of the database (which is a sparse
	# file).  If the user 'nobody' does not exist then we just have
	# to take our chances with using all possible uid values.
	# Unfortunately all this means that there are certain circumstances
	# where not all users will be taken into account.

	MaxUID=`awk -F: "\\$1==\"nobody\" { print \\$3 - 100 }" /etc/passwd`
		if [ $? -eq 0 -a x"$MaxUID" != x ] ; then
			Cond="uid >= 0 && uid < $MaxUID && !flag.real"
		else
			Cond="uid >= 0 && !flag.real"
		fi
		UIDS=`limreport "$Cond" '%d\n' uid | wc -l`
		if [ $UIDS -gt 0 ]; then
			$ECHO "$UIDS other lnodes to be created " \
				"due to passwd entries"
				limreport "$Cond" 'limadm set -u sgroup=0:cpu.shares=1 %d\necho " uid %7d\r\c"\n' uid uid | sh

			echo
		fi
	fi

	limdaemon $LimdaemonOptions

	echo "Solaris Resource Manager v1.0 Enabled."
    ;;

'stop')
	# SRM shutdown should be done as late as possible before
	# filesystems are unmounted. 
	if [ -x $SRMBIN/srmadm ] && $SRMBIN/srmadm show fileopen > /dev/null
	then
		limdaemon -k
		sleep 2
		srmadm set $ChargeOptionsOff
		srmadm set fileopen=n
		sync
		$ECHO "Solaris Resource Manager Disabled" 
	fi
	;;

*)
	echo "Usage: $0 {start|stop}"
	;;
esac

預設的 'no lnode' 指令集

此指令集在預設的排程群組中建立 lnode(如果密碼映射中存在此類使用者的話為 other,否則為 root。)並且以郵件提醒系統管理員要將新的 lnode 移入排程階層中的適當位置。

#!/bin/sh
#
#ident  "@(#)nolnode.sh 1.6 98/10/28 SMI"
#
# Copyright (c) 1998 by Sun Microsystems, Inc.
# All rights reserved.
#
# Copyright 1995-1997 Softway Pty. Ltd.
#
# A script that called by the PAM module to create a lnode
#

PATH=/usr/srm/bin:/sbin:/bin export PATH
LOCALE=C export LOCALE
if [ "$DEBUG" = "true" ]
then
    exec >> /tmp/nolnodelog 2>&1
    echo
    date
    echo "Attempting to create lnode for $USER"
else
    exec > /dev/null  2>&1
fi

err=`limadm set -u cpu.shares=1 "$UID" 2>&1`
if [ $? -eq 0 ]
then
    cat <<-EOF | /usr/lib/sendmail root 
	Subject: New lnode created for "$USER"

	Remember to change scheduling group and shares for
	"$USER".

	`limreport lname=='"'"$USER"'"' 'Currently in group "%s" with %d shares\\n' sgroupname cpu.shares`
EOF
else
    cat <<-EOF | /usr/lib/sendmail root
	Subject: Could not create lnode for "$USER"

	after "$SERVICE" attempt on tty "$TTY", uid "$UID", 
	rhost \""$RHOST"\",
	limadm said \""$err"\"
EOF
    exit 1 # deny access
fi
# permit access
exit 0