Subversion Repositories configs

Rev

Rev 4 | Go to most recent revision | 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
 
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
58 - 167
	if [ "$KTUNE_REVERT_SYSCTL" = 1 ]; then
168
	    echo -n $"Reverting to saved sysctl settings: "
169
	    load_file "$SAVE_FILE" 0
170
	fi
4 - 171
	/bin/rm -f "$SAVE_FILE"
172
    fi
173
 
174
    if [ ${#KTUNE_FILES[@]} -gt 0 ]; then
175
	for file in "${KTUNE_FILES[@]}"; do
176
	    call_script "${file%.conf}.sh" stop
177
	done
178
    fi
179
}
180
 
181
start() {
182
    [ "$EUID" != "0" ] && exit 4
183
    ret=0
184
 
185
    # if no elevator on command line, apply the ktune elevator
186
    if [ -n "$ELEVATOR" -a -n "$SYS_BLOCK_SDX" -a $CMDLINE_ELEVATOR -ne 0 ]; then
187
	ret_e=0
188
	echo -n $"Applying ${ELEVATOR} elevator: "
189
	for i in $SYS_BLOCK_SDX; do
190
	    dev="${i%%/queue*}"; echo -n "${dev##*/} "
191
	    echo "$ELEVATOR" > "$i" 2>/dev/null;
192
	    let ret_e+=$?
193
	done
194
	if [ $ret_e -eq 0 ]; then
195
	    success; echo
196
	else
197
	    failure; echo; ret=1
198
	fi
199
    fi
200
 
201
    load_sysctl
202
 
203
    /bin/touch $VAR_SUBSYS_KTUNE
204
    return $ret
205
}
206
 
207
reload() {
208
    [ "$EUID" != "0" ] && exit 4
209
    revert_sysctl
210
    load_sysctl
211
}
212
 
213
stop() {
214
    [ "$EUID" != "0" ] && exit 4
215
    ret=0
216
 
217
    revert_sysctl
218
 
219
    # if no elevator on command line, apply the default elevator
220
    if [ -n "$ELEVATOR" -a -n "$SYS_BLOCK_SDX" -a $CMDLINE_ELEVATOR -ne 0 ]; then
221
	ret_e=0
222
	echo -n $"Reverting to ${KERNEL_ELEVATOR} elevator: "
223
	for i in $SYS_BLOCK_SDX; do
224
	    dev="${i%%/queue*}"; echo -n "${dev##*/} "
225
	    echo "$KERNEL_ELEVATOR" > "$i" 2>/dev/null;
226
	    let ret_e+=$?
227
	done
228
	if [ $ret_e -eq 0 ]; then
229
	    success; echo
230
	else
231
	    failure; echo; ret=1
232
	fi
233
    fi
234
 
235
    /bin/rm -f $VAR_SUBSYS_KTUNE
236
    return $ret
237
}
238
 
239
status() {
240
    [ "$EUID" != "0" ] && exit 4
241
 
242
    if [ ! -f "$VAR_SUBSYS_KTUNE" ]; then
243
	echo $"ktune settings are not applied."
244
	return 3
245
    fi
246
 
247
    echo $"Current ktune sysctl settings:"
248
    if [ -e $SAVE_FILE ]; then
249
        keys=$(awk '/^[#;]/ { next } /=/ { match($1,"=") && $1=substr($1,1,RSTART-1); print $1 }' "$SAVE_FILE")
250
        for key in $keys; do
251
	    $SYSCTL_GET $key
252
        done
253
    else
254
        echo $"None"
255
    fi
256
 
257
    if [ -n "$ELEVATOR" -a -n "$SYS_BLOCK_SDX" -a $CMDLINE_ELEVATOR -ne 0 ]; then
258
	echo
259
	echo $"Current elevator settings:"
260
	for i in $SYS_BLOCK_SDX; do
261
	    echo -n "${i}: "; cat "$i"
262
	done
263
    fi
264
 
265
    return 0
266
}
267
 
268
case "$1" in
269
    start)
270
	[ -f "$VAR_SUBSYS_KTUNE" ] && exit 0
271
	start
272
	RETVAL=$?
273
	;;
274
    stop)
275
	[ -f "$VAR_SUBSYS_KTUNE" ] || exit 0
276
	stop
277
	RETVAL=$?
278
	;;
279
    reload)
280
	[ -f "$VAR_SUBSYS_KTUNE" ] && reload
281
	RETVAL=$?
282
	;;
283
    restart|force-reload)
284
	[ -f "$VAR_SUBSYS_KTUNE" ] && stop
285
	start
286
	RETVAL=$?
287
	;;
288
    condrestart|try-restart)
289
	[ -f "$VAR_SUBSYS_KTUNE" ] || exit 0
290
	stop
291
	start
292
	RETVAL=$?
293
	;;
294
    status)
295
	status
296
	RETVAL=$?
297
	;;
298
    *)
299
	echo $"Usage: $0 {start|stop|restart|condrestart|status}"
300
	RETVAL=2
301
	;;
302
esac
303
 
304
exit $RETVAL