Menu

[r10367]: / legacy / etc / rc.d / geom  Maximize  Restore  History

Download this file

190 lines (153 with data), 3.5 kB

#!/bin/sh
# Copyright (c) 2008-2009 Volker Theile (votdev@gmx.de)
# All rights reserved.

# PROVIDE: geom
# REQUIRE: CONFIG
# BEFORE: disks
# KEYWORD: nojail shutdown

. /etc/rc.subr
. /etc/configxml.subr

name="geom"

load_rc_config "${name}"

# Custom commands
extra_commands="load tune"
start_cmd="geom_start"
stop_cmd="geom_stop"
load_cmd="geom_load"
tune_cmd="geom_tune"

# Defaults
geom_classes=${geom_classes:-"vinum mirror stripe concat raid5"}
geom_load_param=${geom_load_param:-""}
geom_stop_param=${geom_stop_param:-""}

geom_start()
{
	local _classes _class

	_classes=$*
	_classes=${_classes:-"${geom_classes}"}

	echo "Starting GEOM devices."
	for _class in ${_classes}; do
		if configxml_isset //g${_class}/vdisk; then
			case ${_class} in
				vinum)
					_geom_start_vinum;;
				*)
					_geom_load ${_class};;
			esac
			geom_tune ${_class}
		fi
	done
}

geom_stop()
{
	local _classes _class

	_classes=$*
	_classes=${_classes:-"${geom_classes}"}

	echo "Stopping GEOM devices."
	for _class in ${_classes}; do
		case ${_class} in
			raid5)
				_geom_stop_raid5;;
			*)
				_geom_stop ${_class};;
		esac
		_geom_unload ${_class}
	done
}

geom_load()
{
	local _classes _class

	_classes=$*
	_classes=${_classes:-"${geom_classes}"}

	for _class in ${_classes}; do
		case ${_class} in
			vinum)
				;;
			*)
				_geom_load ${_class};;
		esac
	done
}

geom_tune()
{
	local _classes _class

	_classes=$*
	_classes=${_classes:-"${geom_classes}"}

	for _class in ${_classes}; do
		case ${_class} in
			raid5)
				_geom_tune_raid5;;
			*)
				;;
		esac
	done
}

_geom_start_vinum()
{
	local _name

	/usr/local/bin/xml sel -t -m "//gvinum/vdisk" \
		-v "name" \
		-i "position() != last()" -n -b \
		${configxml_file} | /usr/local/bin/xml unesc | \
		while read _name; do
			/sbin/gvinum start "${_name}"
		done
}

_geom_stop()
{
	local _class _name

	_class=$1

	# Stop devices.
	/usr/local/bin/xml sel -t -m "//g${_class}/vdisk" \
		-v "name" \
		-i "position() != last()" -n -b \
		${configxml_file} | /usr/local/bin/xml unesc | \
		while read _name; do
			/sbin/geom ${_class} status "${_name}" 1>/dev/null 2>&1 && /sbin/g${_class} stop ${geom_stop_param} "${_name}"
		done
}

_geom_stop_raid5()
{
	local _name

	# Stop devices.
	/usr/local/bin/xml sel -t -m "//graid5/vdisk" \
		-v "name" \
		-i "position() != last()" -n -b \
		${configxml_file} | /usr/local/bin/xml unesc | \
		while read _name; do
			/sbin/geom raid5 status "${_name}" 1>/dev/null 2>&1 && /sbin/graid5 destroy -y "${_name}"
		done
}

_geom_load()
{
	local _class

	_class=$1

	# Load module.
	/sbin/kldstat -q -m g_${_class} || /sbin/geom ${_class} load ${geom_load_param}
}

_geom_unload()
{
	local _class

	_class=$1

	# Unload module.
	/sbin/kldstat -q -m g_${_class} && /sbin/geom ${_class} unload
}

# Optimize geom raid5 RAM usage
_geom_tune_raid5()
{
	local _realmem

	_realmem=`/sbin/sysctl -n hw.realmem`
	_realmem=`expr -- ${_realmem} / 1024 / 1024`

	if [ 128 -gt ${_realmem} ]; then
		/usr/bin/logger "Optimizing GEOM raid5 for systems with <= 128MB of RAM."
		sysctl kern.geom.raid5.maxwql=10
		sysctl kern.geom.raid5.maxmem=1100000
	elif [ 256 -gt ${_realmem} ]; then
		/usr/bin/logger "Optimizing GEOM raid5 for systems with <= 256MB of RAM."
		sysctl kern.geom.raid5.maxwql=20
		sysctl kern.geom.raid5.maxmem=2000000
	else
		/usr/bin/logger "Detected >= 512MB of RAM... No need to optimize RAM usage for GEOM raid5."
	fi

	return 0
}

run_rc_command "$@"
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.