127 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#!/bin/sh
 | 
						|
 | 
						|
# start or stop laptop_mode, best run by a power management daemon when
 | 
						|
# ac gets connected/disconnected from a laptop
 | 
						|
#
 | 
						|
# install as /sbin/laptop_mode
 | 
						|
#
 | 
						|
# Contributors to this script:   Kiko Piris
 | 
						|
#				 Bart Samwel
 | 
						|
#				 Dax Kelson
 | 
						|
# Original Linux 2.4 version by: Jens Axboe
 | 
						|
 | 
						|
parse_mount_opts () {
 | 
						|
	echo "$*"			| \
 | 
						|
	sed 's/commit=[0-9]*//g'	| \
 | 
						|
	sed 's/,,*/,/g'			| \
 | 
						|
	sed 's/^,//'			| \
 | 
						|
	sed 's/,$//'			| \
 | 
						|
	cat -
 | 
						|
}
 | 
						|
 | 
						|
KLEVEL="$(uname -r | cut -c1-3)"
 | 
						|
case "$KLEVEL" in
 | 
						|
	"2.4")
 | 
						|
		true
 | 
						|
		;;
 | 
						|
	"2.6")
 | 
						|
		true
 | 
						|
		;;
 | 
						|
	*)
 | 
						|
		echo "Unhandled kernel level: $KLEVEL ('uname -r' = '$(uname -r)')"
 | 
						|
		exit 1
 | 
						|
		;;
 | 
						|
esac
 | 
						|
 | 
						|
# Shall we remount journaled fs. with appropiate commit interval? (1=yes)
 | 
						|
DO_REMOUNTS=1
 | 
						|
 | 
						|
# age time, in seconds. should be put into a sysconfig file
 | 
						|
MAX_AGE=600
 | 
						|
 | 
						|
# Allowed dirty ratio, in pct. should be put into a sysconfig file as well.
 | 
						|
DIRTY_RATIO=40
 | 
						|
 | 
						|
# kernel default dirty buffer age
 | 
						|
DEF_AGE=30
 | 
						|
DEF_UPDATE=5
 | 
						|
DEF_DIRTY_BACKGROUND_RATIO=10
 | 
						|
DEF_DIRTY_RATIO=40
 | 
						|
 | 
						|
 | 
						|
if [ ! -e /proc/sys/vm/laptop_mode ]; then
 | 
						|
	echo "Kernel is not patched with laptop_mode patch."
 | 
						|
	exit 1
 | 
						|
fi
 | 
						|
 | 
						|
if [ ! -w /proc/sys/vm/laptop_mode ]; then
 | 
						|
	echo "You do not have enough privileges to enable laptop_mode."
 | 
						|
	exit 1
 | 
						|
fi
 | 
						|
 | 
						|
case "$1" in
 | 
						|
	start)
 | 
						|
		AGE=$((100*$MAX_AGE))
 | 
						|
		echo -n "Starting laptop_mode"
 | 
						|
		case "$KLEVEL" in
 | 
						|
			"2.4")
 | 
						|
				echo "1"				> /proc/sys/vm/laptop_mode
 | 
						|
				echo "30 500 0 0 $AGE $AGE 60 20 0"	> /proc/sys/vm/bdflush
 | 
						|
				;;
 | 
						|
			"2.6")
 | 
						|
				echo "1"				> /proc/sys/vm/laptop_mode
 | 
						|
				echo "$AGE"				> /proc/sys/vm/dirty_writeback_centisecs
 | 
						|
				echo "$AGE"				> /proc/sys/vm/dirty_expire_centisecs
 | 
						|
				echo "$DIRTY_RATIO"			> /proc/sys/vm/dirty_ratio
 | 
						|
				echo "$DIRTY_RATIO"			> /proc/sys/vm/dirty_background_ratio
 | 
						|
				;;
 | 
						|
		esac
 | 
						|
		if [ $DO_REMOUNTS -eq 1 ]; then
 | 
						|
			cat /etc/mtab | while read DEV MP FST OPTS DUMP PASS ; do
 | 
						|
				PARSEDOPTS="$(parse_mount_opts "$OPTS")"
 | 
						|
				case "$FST" in
 | 
						|
					"ext3")		mount $DEV -t $FST $MP -o remount,$PARSEDOPTS,commit=$MAX_AGE ;;
 | 
						|
					"reiserfs")	mount $DEV -t $FST $MP -o remount,$PARSEDOPTS,commit=$MAX_AGE ;;
 | 
						|
					"xfs")		mount $DEV -t $FST $MP -o remount,$PARSEDOPTS,commit=$MAX_AGE ;;
 | 
						|
				esac
 | 
						|
			done
 | 
						|
		fi
 | 
						|
		echo "."
 | 
						|
		;;
 | 
						|
	stop)
 | 
						|
		U_AGE=$((100*$DEF_UPDATE))
 | 
						|
		B_AGE=$((100*$DEF_AGE))
 | 
						|
		echo -n "Stopping laptop_mode"
 | 
						|
		case "$KLEVEL" in
 | 
						|
			"2.4")
 | 
						|
				echo "0"				> /proc/sys/vm/laptop_mode
 | 
						|
				echo "30 500 0 0 $U_AGE $B_AGE 60 20 0"	> /proc/sys/vm/bdflush
 | 
						|
				;;
 | 
						|
			"2.6")
 | 
						|
				echo "0"				> /proc/sys/vm/laptop_mode
 | 
						|
				echo "$U_AGE"				> /proc/sys/vm/dirty_writeback_centisecs
 | 
						|
				echo "$B_AGE"				> /proc/sys/vm/dirty_expire_centisecs
 | 
						|
				echo "$DEF_DIRTY_RATIO"			> /proc/sys/vm/dirty_ratio
 | 
						|
				echo "$DEF_DIRTY_BACKGROUND_RATIO"	> /proc/sys/vm/dirty_background_ratio
 | 
						|
				;;
 | 
						|
		esac
 | 
						|
		if [ $DO_REMOUNTS -eq 1 ]; then
 | 
						|
			cat /etc/mtab | while read DEV MP FST OPTS DUMP PASS ; do
 | 
						|
				PARSEDOPTS="$(parse_mount_opts "$OPTS")"
 | 
						|
				case "$FST" in
 | 
						|
					"ext3")		mount $DEV -t $FST $MP -o remount,$PARSEDOPTS ;;
 | 
						|
					"reiserfs")	mount $DEV -t $FST $MP -o remount,$PARSEDOPTS ;;
 | 
						|
					"xfs")		mount $DEV -t $FST $MP -o remount,$PARSEDOPTS ;;
 | 
						|
				esac
 | 
						|
			done
 | 
						|
		fi
 | 
						|
		echo "."
 | 
						|
		;;
 | 
						|
	*)
 | 
						|
		echo "$0 {start|stop}"
 | 
						|
		;;
 | 
						|
 | 
						|
esac
 | 
						|
 | 
						|
exit 0
 |