Subversion Repositories configs

Rev

Rev 57 | Go to most recent revision | Details | Last modification | View Log | RSS feed

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