Subversion Repositories configs

Rev

Rev 58 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4 - 1
#!/bin/sh
2
#
3
# ktune		ktune sysctls
4
#
5
# chkconfig: - 27 99
6
# description:	Applies and reverts ktune sysctl settings
7
#
8
# config: /etc/sysctl.ktune
9
# config: /etc/sysconfig/ktune
10
#
11
 
12
# Source function library.
13
. /etc/init.d/functions
14
 
15
# Source ktune configureation.
16
if [ -f /etc/sysconfig/ktune ] ; then
17
    . /etc/sysconfig/ktune
18
else
19
    echo -n $"$0: /etc/sysconfig/ktune does not exist."; warning; echo
20
    exit 5
21
fi
22
 
23
VAR_SUBSYS_KTUNE=/var/lock/subsys/ktune
24
SAVE_FILE="/var/run/ktune.save"
25
SYSCTL_SET="/sbin/sysctl -q -w "
26
SYSCTL_GET="/sbin/sysctl -e"
27
 
97 - 28
RESTART=
4 - 29
KERNEL_ELEVATOR="cfq"
30
/bin/fgrep -q 'elevator=' /proc/cmdline
31
CMDLINE_ELEVATOR=$?
32
if [ -n "$ELEVATOR_TUNE_DEVS" ]; then
33
	SYS_BLOCK_SDX=
34
	for file in $(eval LANG=C /bin/ls -1d "${ELEVATOR_TUNE_DEVS}" 2>/dev/null); do
35
		if ! expr match $(readlink -f "$file") '^/sys/.*/queue/scheduler$' >/dev/null; then
36
			printf $"$0: '%s' is not a scheduler control file." "$file"
37
			warning; echo
38
		else
39
			SYS_BLOCK_SDX="$SYS_BLOCK_SDX $file"
40
		fi
41
	done
42
else
43
	SYS_BLOCK_SDX=
44
fi
45
 
46
declare -a KTUNE_FILES
47
if [ -r "$SYSCTL" ]; then
48
    KTUNE_FILES[0]="$SYSCTL"
49
fi
50
if [ "x$USE_KTUNE_D" = "xyes" ]; then
51
    while read file; do
52
	[ -r "$file" ] || continue
53
	KTUNE_FILES[${#KTUNE_FILES[*]}]="${file}"
54
    done <<EOF
55
$(LANG=C /bin/ls -1 /etc/ktune.d/*.conf 2>/dev/null)
56
EOF
57
fi
58
 
59
function is_int
60
{
61
  [ ! -z "${1##*[^0-9]*}" ]
62
}
63
 
64
load_file() {
65
    local file=$1
66
    local save=$2
67
    local curr_value
68
 
69
    ret_s=0
70
    errors=
71
    # apply ktune settings
72
    while read line; do
73
	[ "${line:0:1}" == "#" -o "${line:0:1}" == ";" ] && continue
74
	[ -z "$line" ] && continue
75
 
76
	key=$(echo $line | awk '{ match($0,"[ \t]*=[ \t]*") && $0=substr($0,1,RSTART-1); print $0}')
77
	value=$(echo $line | awk '/=/ { match($0,"[ \t]*=[ \t]*"); $0=substr($0,RSTART+RLENGTH); print $0}')
78
 
79
	curr_value=""
80
	if [ "${value:0:1}" = '>' ]; then
81
	    value=${value:1}
82
	    curr_value=$($SYSCTL_GET -n "$key")
83
	fi
84
 
85
	if [ "${value:0:1}" = '$' ]; then
86
	    value=${value:1}
87
	    value=${!value}
88
	fi
89
 
90
	is_int "$curr_value" && is_int "$value" && [ "$value" -lt "$curr_value" ] && value="$curr_value"
91
 
92
	[ $save -ne 0 ] && save_value=$($SYSCTL_GET "$key")
93
 
94
	setting=$key
95
	if [ "$value" ]; then
96
	    [ -n "$value" ] && setting+="=${value}"
97
 
98
	    error="$($SYSCTL_SET "${setting}" 2>&1)"
99
	    ret=$?
100
	    if [ $save -ne 0 -a $ret -eq 0 ] && ! grep -q "^${key} =" $SAVE_FILE 2>/dev/null; then
101
	        echo "$save_value" >> "$SAVE_FILE"
102
	    fi
103
	    [ -n "$error" ] && errors+="${error}\n"
104
 
105
	    let ret_s+=$ret
106
	fi
107
    done < "$file"
108
 
109
    if [ $ret_s -eq 0 ]; then
110
	success; echo
111
    else
112
	failure; echo; ret=1
113
	echo -e "$errors" | while read line; do echo -e "  ${line}"; done
114
    fi
115
}
116
 
117
call_script() {
118
    local script=$1
97 - 119
    shift
4 - 120
 
121
    if [ -x "$script" ]; then
97 - 122
	echo -n "Calling '$script $@': "
123
	("$script" "$@")
4 - 124
	ret=$?
125
 
126
	if [ $ret -eq 0 ]; then
127
	    success; echo
128
	else
129
	    failure; echo; ret=1
130
	fi
131
    fi
132
}
133
 
134
load_sysctl() {
135
    # Remove save file
136
    /bin/rm -f "$SAVE_FILE"
137
 
138
    if [ ${#KTUNE_FILES[@]} -gt 0 ]; then
139
        # Apply general sysctl settings beforehand
140
	for f in $SYSCTL_PRE; do
141
	    if [ -r "$f" ]; then
142
		echo $"Applying sysctl settings from $f"
143
		sysctl -e -p "$f" >/dev/null 2>&1
144
	    fi
145
	done
146
 
147
	echo $"Applying ktune sysctl settings:"
148
 
149
	# Apply ktune files.
150
	for file in "${KTUNE_FILES[@]}"; do
151
	    echo -n $"$file: "
152
	    load_file "$file" 1
153
	    call_script "${file%.conf}.sh" start
154
	done
155
 
156
        # Apply general sysctl settings afterwards
157
	for f in $SYSCTL_POST; do
158
	    if [ -r "$f" ]; then
159
		echo $"Applying sysctl settings from $f"
160
		sysctl -e -p "$f" >/dev/null 2>&1
161
	    fi
162
	done
163
    fi
164
}
165
 
166
revert_sysctl() {
167
    if [ -r "$SAVE_FILE" ]; then
58 - 168
	if [ "$KTUNE_REVERT_SYSCTL" = 1 ]; then
169
	    echo -n $"Reverting to saved sysctl settings: "
170
	    load_file "$SAVE_FILE" 0
171
	fi
4 - 172
	/bin/rm -f "$SAVE_FILE"
173
    fi
174
 
175
    if [ ${#KTUNE_FILES[@]} -gt 0 ]; then
176
	for file in "${KTUNE_FILES[@]}"; do
97 - 177
	    call_script "${file%.conf}.sh" stop ${RESTART:+restart}
4 - 178
	done
179
    fi
180
}
181
 
182
start() {
183
    [ "$EUID" != "0" ] && exit 4
184
    ret=0
185
 
186
    # if no elevator on command line, apply the ktune elevator
187
    if [ -n "$ELEVATOR" -a -n "$SYS_BLOCK_SDX" -a $CMDLINE_ELEVATOR -ne 0 ]; then
188
	ret_e=0
189
	echo -n $"Applying ${ELEVATOR} elevator: "
190
	for i in $SYS_BLOCK_SDX; do
191
	    dev="${i%%/queue*}"; echo -n "${dev##*/} "
192
	    echo "$ELEVATOR" > "$i" 2>/dev/null;
193
	    let ret_e+=$?
194
	done
195
	if [ $ret_e -eq 0 ]; then
196
	    success; echo
197
	else
198
	    failure; echo; ret=1
199
	fi
200
    fi
201
 
202
    load_sysctl
203
 
204
    /bin/touch $VAR_SUBSYS_KTUNE
205
    return $ret
206
}
207
 
208
reload() {
209
    [ "$EUID" != "0" ] && exit 4
210
    revert_sysctl
211
    load_sysctl
212
}
213
 
214
stop() {
215
    [ "$EUID" != "0" ] && exit 4
216
    ret=0
217
 
218
    revert_sysctl
219
 
220
    # if no elevator on command line, apply the default elevator
221
    if [ -n "$ELEVATOR" -a -n "$SYS_BLOCK_SDX" -a $CMDLINE_ELEVATOR -ne 0 ]; then
222
	ret_e=0
223
	echo -n $"Reverting to ${KERNEL_ELEVATOR} elevator: "
224
	for i in $SYS_BLOCK_SDX; do
225
	    dev="${i%%/queue*}"; echo -n "${dev##*/} "
226
	    echo "$KERNEL_ELEVATOR" > "$i" 2>/dev/null;
227
	    let ret_e+=$?
228
	done
229
	if [ $ret_e -eq 0 ]; then
230
	    success; echo
231
	else
232
	    failure; echo; ret=1
233
	fi
234
    fi
235
 
236
    /bin/rm -f $VAR_SUBSYS_KTUNE
237
    return $ret
238
}
239
 
240
status() {
241
    [ "$EUID" != "0" ] && exit 4
242
 
243
    if [ ! -f "$VAR_SUBSYS_KTUNE" ]; then
244
	echo $"ktune settings are not applied."
245
	return 3
246
    fi
247
 
248
    echo $"Current ktune sysctl settings:"
249
    if [ -e $SAVE_FILE ]; then
250
        keys=$(awk '/^[#;]/ { next } /=/ { match($1,"=") && $1=substr($1,1,RSTART-1); print $1 }' "$SAVE_FILE")
251
        for key in $keys; do
252
	    $SYSCTL_GET $key
253
        done
254
    else
255
        echo $"None"
256
    fi
257
 
258
    if [ -n "$ELEVATOR" -a -n "$SYS_BLOCK_SDX" -a $CMDLINE_ELEVATOR -ne 0 ]; then
259
	echo
260
	echo $"Current elevator settings:"
261
	for i in $SYS_BLOCK_SDX; do
262
	    echo -n "${i}: "; cat "$i"
263
	done
264
    fi
265
 
266
    return 0
267
}
268
 
269
case "$1" in
270
    start)
271
	[ -f "$VAR_SUBSYS_KTUNE" ] && exit 0
272
	start
273
	RETVAL=$?
274
	;;
275
    stop)
276
	[ -f "$VAR_SUBSYS_KTUNE" ] || exit 0
277
	stop
278
	RETVAL=$?
279
	;;
280
    reload)
281
	[ -f "$VAR_SUBSYS_KTUNE" ] && reload
282
	RETVAL=$?
283
	;;
284
    restart|force-reload)
285
	[ -f "$VAR_SUBSYS_KTUNE" ] && stop
286
	start
287
	RETVAL=$?
288
	;;
289
    condrestart|try-restart)
290
	[ -f "$VAR_SUBSYS_KTUNE" ] || exit 0
97 - 291
	RESTART=1
4 - 292
	stop
293
	start
294
	RETVAL=$?
295
	;;
296
    status)
297
	status
298
	RETVAL=$?
299
	;;
300
    *)
301
	echo $"Usage: $0 {start|stop|restart|condrestart|status}"
302
	RETVAL=2
303
	;;
304
esac
305
 
306
exit $RETVAL