~ubuntu-branches/ubuntu/karmic/vzctl/karmic

« back to all changes in this revision

Viewing changes to etc/init.d/vz-gentoo.in

  • Committer: Bazaar Package Importer
  • Author(s): Ola Lundqvist
  • Date: 2007-04-10 18:08:16 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20070410180816-0uuzj9fnna7gmzxv
Tags: 3.0.16-4
Etch has been released which means that this version can be uploaded
to unstable.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/sbin/runscript
 
2
# Copyright 1999-2005 Gentoo Foundation
 
3
# Distributed under the terms of the GNU General Public License v2
 
4
# $Header: /var/www/viewcvs.gentoo.org/raw_cvs/gentoo-x86/sys-cluster/vzctl/files/vz-3.0.10.initd,v 1.2 2006/07/09 10:29:24 phreak Exp $
 
5
 
 
6
depend() {
 
7
        after net
 
8
}
 
9
 
 
10
check_config() {
 
11
        # if we don't want openvz running, say so
 
12
        [ "${VIRTUOZZO}" = "yes" ] || return 1
 
13
 
 
14
        # set default values
 
15
        : ${VZCTL:=@SBINDIR@/vzctl}
 
16
        : ${VZQUOTA:=@SBINDIR@/vzquota}
 
17
        : ${VZVEINFO:=/proc/vz/veinfo}
 
18
        : ${VESTAT:=/proc/vz/vestat}
 
19
        : ${VPSCONFDIR:=@VPSCONFDIR@}
 
20
        : ${VZDEV:=venet0}
 
21
        : ${SRC_CRONSCRIPT_DIR:=@CRONDDIR@}
 
22
        : ${DST_CRONSCRIPT_DIR:=@DST_CRONDDIR@}
 
23
 
 
24
        if [ "${MODULES_DISABLED}" != "yes" ]; then
 
25
                : ${PRELOAD_MODULES:="af_packet"}
 
26
                : ${MODULES:="vzmon vzdquota vzdev"}
 
27
                : ${MIGRATE_MODULES:="vzcpt vzrst"}
 
28
                : ${NET_MODULES="vznetdev vznet"}
 
29
 
 
30
                # check if you should load vzwdog module
 
31
                [ "${VZWDOG}" = "yes" ] && MODULES="${MODULES} vzwdog"
 
32
        fi
 
33
 
 
34
        # we need a working vzctl
 
35
        if [ ! -x "${VZCTL}" ]; then
 
36
                eerror "vzctl missing (${VZCTL})"
 
37
                return 1
 
38
        fi
 
39
 
 
40
        if [ -z "${VE0CPUUNITS}" ]; then
 
41
                ewarn "VE0CPUUNITS is not set in /etc/conf.d/vz; using default value of 1000"
 
42
                VE0CPUUNITS=1000
 
43
        fi
 
44
        return 0
 
45
}
 
46
 
 
47
# We used to install OpenVZ cron job when the vzctl package was
 
48
# installed, irrespective of whether OpenVZ was actually being
 
49
# run. Although the cron jobs didn't create any problems if someone
 
50
# wasn't running OpenVZ some users complained about the cron log file
 
51
# filling up, resource usage, and power consumption since systems
 
52
# wouldn't really idle. It really only makes sense to run the OpenVZ
 
53
# cron job if the vz service is turned on and not just merely
 
54
# having the package installed. This init.d script is an obvious place
 
55
# to install or remove the cron jobs based on the service
 
56
# being enabled or not.
 
57
setup_cron()
 
58
{
 
59
       [ -z "$SRC_CRONSCRIPT_DIR" ] && return
 
60
       [ -d "$SRC_CRONSCRIPT_DIR" ] || return
 
61
       install -m644 -o root -g root $SRC_CRONSCRIPT_DIR/vz \
 
62
               $DST_CRONSCRIPT_DIR
 
63
}
 
64
 
 
65
remove_cron()
 
66
{
 
67
       [ -z "$SRC_CRONSCRIPT_DIR" ] && return
 
68
       [ -d "$SRC_CRONSCRIPT_DIR" ] || return
 
69
       cat > $DST_CRONSCRIPT_DIR/vz <<EOF
 
70
# DO NOT EDIT THIS FILE!
 
71
#
 
72
# Contents of this file managed by /etc/init.d/vz script
 
73
# Master copy is $SRC_CRONSCRIPT_DIR/vz.
 
74
# Consult that file for documentation.
 
75
EOF
 
76
}
 
77
 
 
78
setup_ve0() {
 
79
        local msg ve0conf="${VPSCONFDIR}/0.conf"
 
80
 
 
81
        msg=$(${VZCTL} set 0 --cpuunits ${VE0CPUUNITS} 2>&1)
 
82
        [ $? -ne 0 ] && ewarn "vzctl set 0 --cpuunits ${VE0CPUUNITS} failed: ${msg}"
 
83
 
 
84
        test -f ${ve0conf} || return
 
85
        egrep -q '^ONBOOT=yes\|^ONBOOT=\"yes\"' ${ve0conf} || return
 
86
 
 
87
        ebegin "Configuring hardware node UB resources: "
 
88
        msg=$(${VZCTL} set 0 --reset_ub 2>&1)
 
89
        eend $? ${msg}
 
90
}
 
91
 
 
92
start_net() {
 
93
        local mod
 
94
 
 
95
        # we don't operate on a running interface
 
96
        if /sbin/ip addr ls | grep -q "venet0:.*UP" 2>/dev/null; then
 
97
                return 0
 
98
        fi
 
99
 
 
100
        # load necessary modules
 
101
        for mod in ${NET_MODULES}; do
 
102
                /sbin/modprobe ${mod} 2>/dev/null
 
103
        done
 
104
 
 
105
        if [ ! -f ${VZVEINFO} ]; then
 
106
                return 0
 
107
        fi
 
108
 
 
109
        # configure the device
 
110
        ebegin "Bringing up interface ${VZDEV}"
 
111
                /sbin/ip link set ${VZDEV} up
 
112
        eend $?
 
113
 
 
114
        /sbin/ip addr add 0.0.0.0/0 dev ${VZDEV}
 
115
 
 
116
        ebegin "Configuring interface ${VZDEV}"
 
117
                /sbin/sysctl -q -w net.ipv4.conf.${VZDEV}.send_redirects=0
 
118
        eend $?
 
119
}
 
120
 
 
121
stop_net() {
 
122
        local mod
 
123
 
 
124
        if /sbin/ip a l | grep -q "venet0:.*UP" 2>/dev/null; then
 
125
                ebegin "Bringing down interface ${VZDEV}"
 
126
                        /sbin/ip link set ${VZDEV} down 2>/dev/null
 
127
                eend $?
 
128
        fi
 
129
 
 
130
        # remove all modules we probably loaded on start_net
 
131
        for mod in ${NET_MODULES}; do
 
132
                /sbin/modprobe -r ${mod} > /dev/null 2>&1
 
133
        done
 
134
}
 
135
 
 
136
start_ve() {
 
137
        local veid velist msg need_restart=""
 
138
 
 
139
        # get all VEs we should start on boot
 
140
        if ! cd ${VPSCONFDIR}; then
 
141
                eerror $? "Unable to cd to ${VPSCONFDIR}"
 
142
                return 1
 
143
        fi
 
144
        velist=$(grep -l '^ONBOOT=yes\|^ONBOOT=\"yes\"' [0-9]*.conf 2>/dev/null | sed -e 's/.conf//g' | sort -n)
 
145
        cd - >/dev/null
 
146
 
 
147
        /sbin/sysctl -q -w net.ipv4.route.src_check=0
 
148
 
 
149
        for veid in ${velist}; do
 
150
                ebegin "Starting VE ${veid}"
 
151
                if [ "${VZFASTBOOT}" = "yes" -a "${DISK_QUOTA}" = "yes" ]; then
 
152
                        ${VZQUOTA} stat ${veid} >/dev/null 2>&1
 
153
                        if [ $? -eq 6 ]; then
 
154
                                if ${VZQUOTA} show ${veid} 2>&1 | grep "vzquota : (warning) Quota is running" >/dev/null 2>&1; then
 
155
                                        ${VZQUOTA} on ${veid} --nocheck >/dev/null 2>&1
 
156
                                        need_restart="${need_restart} ${veid}"
 
157
                                fi
 
158
                        fi
 
159
                fi
 
160
                msg=$(${VZCTL} start ${veid} 2>&1)
 
161
                eend $? "${msg}"
 
162
        done
 
163
 
 
164
        for veid in ${need_restart}; do
 
165
                ebegin "Stopping VE ${veid}"
 
166
                msg=$(${VZCTL} stop ${veid})
 
167
                eend $? "${msg}"
 
168
 
 
169
                ebegin "Starting VE ${veid}"
 
170
                msg=$($VZCTL start ${veid} 2>&1)
 
171
                eend $? "${msg}"
 
172
        done
 
173
 
 
174
        # we're ok even if some VEs failed to start
 
175
        return 0
 
176
}
 
177
 
 
178
get_parallel()
 
179
{
 
180
        [ -n "${PARALLEL}" ] && return
 
181
        PARALLEL=`awk '
 
182
BEGIN { num=0; }
 
183
$1 == "processor" { num++; }
 
184
END { print num * 4; }' /proc/cpuinfo`
 
185
}
 
186
 
 
187
stop_ve() {
 
188
        local veid velist msg m mounts fail i iter pid pids quota
 
189
 
 
190
        if [ -f ${VESTAT} ]; then
 
191
                get_parallel
 
192
                for ((i = 0; i <= 2; i++)); do
 
193
                        iter=0
 
194
                        pids=
 
195
                        velist=$(awk '$1 != "VEID" && $1 != "Version:" {print $1}' ${VESTAT})
 
196
                        for veid in ${velist}; do
 
197
                                ebegin "Shutting down VE $veid"
 
198
                                # Set fairsched parameters to maximum so
 
199
                                # VE will stop fast
 
200
                                ${VZCTL} set ${veid} --cpuunits 2000 --cpulimit 0 >/dev/null 2>&1
 
201
                                ${VZCTL} --skiplock stop ${veid} >/dev/null 2>&1 &
 
202
                                pids="${pids} $!"
 
203
                                let iter++
 
204
                                if [ ${iter} -gt ${PARALLEL} ]; then
 
205
                                        for pid in ${pids}; do
 
206
                                                wait ${pid}
 
207
                                        done
 
208
                                        pids=
 
209
                                        iter=0
 
210
                                fi
 
211
                        done
 
212
 
 
213
                        for pid in ${pids}; do
 
214
                                wait ${pid}
 
215
                        done
 
216
                done
 
217
        fi
 
218
 
 
219
        iter=0
 
220
        fail=1
 
221
 
 
222
        while [ ${iter} -lt 5 -a ${fail} -ne 0 ]; do
 
223
                fail=0
 
224
                mounts=$(awk '{if ($3=="simfs") print $2}' /proc/mounts)
 
225
 
 
226
                for m in ${mounts}; do
 
227
                        ebegin "Unmounting VE area ${m}"
 
228
                        msg=$(umount ${m} 2>&1)
 
229
                        eend $? "${msg}"
 
230
                        if [ $? -ne 0 ]; then
 
231
                                let fail++
 
232
                                fuser -k -m ${m} > /dev/null 2>&1
 
233
                        fi
 
234
                done
 
235
 
 
236
                let iter++
 
237
        done
 
238
 
 
239
        # turn quota off
 
240
        quota=$(awk -F: '/^[0-9]+:/{print $1}' /proc/vz/vzquota 2>/dev/null)
 
241
 
 
242
        for m in ${quota}; do
 
243
                ebegin "Turning quota off for VE ${m}"
 
244
                msg=$(vzquota off ${m} 2>&1)
 
245
                eend $? "${msg}"
 
246
        done
 
247
}
 
248
 
 
249
start() {
 
250
        check_config || return
 
251
 
 
252
        local mod rc
 
253
 
 
254
        ebegin "Loading OpenVZ modules"
 
255
        for mod in ${PRELOAD_MODULES}; do
 
256
                /sbin/modprobe -r ${mod} >/dev/null 2>&1
 
257
                /sbin/modprobe ${mod} >/dev/null 2>&1
 
258
        done
 
259
 
 
260
        for mod in ${MODULES}; do
 
261
                /sbin/modprobe ${mod} >/dev/null 2>&1
 
262
                rc=$?
 
263
                if [ ${rc} -ne 0 ]; then
 
264
                        eend ${rc} "failed to load module ${mod}"
 
265
                        return ${rc}
 
266
                fi
 
267
        done
 
268
 
 
269
        for mod in ${MIGRATE_MODULES}; do
 
270
                /sbin/modprobe ${mod} >/dev/null 2>&1
 
271
        done
 
272
        eend
 
273
 
 
274
        if [ ! -e /dev/vzctl ]; then
 
275
                eerror "Missing device node /dev/vzctl"
 
276
                einfo
 
277
                einfo "Please create the vzctl device node using the following command:"
 
278
                einfo "   /bin/mknod /dev/vzctl c 126 0"
 
279
                einfo
 
280
                return 1
 
281
        fi
 
282
 
 
283
        start_net
 
284
        setup_ve0
 
285
        setup_cron
 
286
        start_ve
 
287
}
 
288
 
 
289
stop() {
 
290
        check_config || return
 
291
 
 
292
        local mod
 
293
 
 
294
        stop_ve
 
295
        remove_cron
 
296
        stop_net
 
297
 
 
298
        for mod in ${MODULES}; do
 
299
                /sbin/modprobe -r ${mod} > /dev/null 2>&1
 
300
        done
 
301
 
 
302
        for mod in ${PRELOAD_MODULES}; do
 
303
                /sbin/modprobe -r ${mod} > /dev/null 2>&1
 
304
        done
 
305
 
 
306
        # Even if some modules failed to unload (say they were not loaded)
 
307
        # we return 0 for the service to be marked as stopped.
 
308
        return 0
 
309
}