rev |
line source |
erjo@2
|
1 #!/bin/sh
|
erjo@2
|
2 # Copyright (C) 2000-2008, Parallels, Inc. All rights reserved.
|
erjo@2
|
3 #
|
erjo@2
|
4 # This program is free software; you can redistribute it and/or modify
|
erjo@2
|
5 # it under the terms of the GNU General Public License as published by
|
erjo@2
|
6 # the Free Software Foundation; either version 2 of the License, or
|
erjo@2
|
7 # (at your option) any later version.
|
erjo@2
|
8 #
|
erjo@2
|
9 # This program is distributed in the hope that it will be useful,
|
erjo@2
|
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
|
erjo@2
|
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
erjo@2
|
12 # GNU General Public License for more details.
|
erjo@2
|
13 #
|
erjo@2
|
14 # You should have received a copy of the GNU General Public License
|
erjo@2
|
15 # along with this program; if not, write to the Free Software
|
erjo@2
|
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
erjo@2
|
17 #
|
erjo@2
|
18 #
|
erjo@2
|
19 # OpenVZ startup script, used for redhat and debian related distributions.
|
erjo@2
|
20
|
erjo@2
|
21 ###
|
erjo@2
|
22 # description: OpenVZ startup script.
|
erjo@2
|
23 ###
|
erjo@2
|
24
|
erjo@2
|
25 VZCONF=/etc/vz/vz.conf
|
erjo@2
|
26
|
erjo@2
|
27 [ -f ${VZCONF} ] || exit 0
|
erjo@2
|
28 . ${VZCONF}
|
erjo@2
|
29 [ "${VIRTUOZZO}" = "no" ] && exit 0
|
erjo@2
|
30
|
erjo@2
|
31 VZCTL=/usr/sbin/vzctl
|
erjo@2
|
32 [ -x ${VZCTL} ] || exit 0
|
erjo@2
|
33
|
erjo@2
|
34 VZQUOTA=/usr/sbin/vzquota
|
erjo@2
|
35 CONFIG_DIR=/etc/vz/conf
|
erjo@2
|
36 LOCKFILE=/var/lock/subsys/vz_lock
|
erjo@2
|
37 SUBSYS_VZ=/var/lock/subsys/vz
|
erjo@2
|
38 VESTAT=/proc/vz/vestat
|
erjo@2
|
39 VZDEV=venet0
|
erjo@2
|
40 PRELOAD_MODULES=
|
erjo@2
|
41 MODULES=
|
erjo@2
|
42 MODULES_OTHER=
|
erjo@2
|
43 NET_MODULES=
|
erjo@2
|
44 IPT_MODULES=
|
erjo@2
|
45
|
erjo@2
|
46 if [ "${MODULES_DISABLED}" != "yes" ]; then
|
erjo@2
|
47 PRELOAD_MODULES="af_packet"
|
erjo@2
|
48 MODULES="vzmon vzdquota vzdev"
|
erjo@2
|
49 CPT_MODULES="vzcpt vzrst"
|
erjo@2
|
50 MODULES_OTHER="vzcompat ${CPT_MODULES}"
|
erjo@2
|
51 VNET_MODULES="vznetdev vznet"
|
erjo@2
|
52 VETH_MODULES="vzethdev"
|
erjo@2
|
53 NET_MODULES="${VNET_MODULES} ${VETH_MODULES}"
|
erjo@2
|
54 if [ "${VZWDOG}" = "yes" ]; then
|
erjo@2
|
55 MODULES="${MODULES} vzwdog"
|
erjo@2
|
56 fi
|
erjo@2
|
57 IPT_MODULES="ip_tables ${IPTABLES} xt_tcpudp"
|
erjo@2
|
58 if [ "${IPV6}" = "yes" ]; then
|
erjo@2
|
59 IPT_MODULES="${IPT_MODULES} ${IP6TABLES}"
|
erjo@2
|
60 fi
|
erjo@2
|
61 VZFS_MODULES="simfs"
|
erjo@2
|
62 fi
|
erjo@2
|
63
|
erjo@2
|
64
|
erjo@2
|
65 rc_done='..done'
|
erjo@2
|
66 rc_failed='..failed'
|
erjo@2
|
67
|
erjo@2
|
68 # Source function library.
|
erjo@2
|
69 if [ -r /etc/init.d/functions ]; then
|
erjo@2
|
70 source /etc/init.d/functions
|
erjo@2
|
71 if [ -r /etc/redhat-release ] || [ -r /etc/centos-release ]; then
|
erjo@2
|
72 DISTR=redhat
|
erjo@2
|
73 fi
|
erjo@2
|
74 elif [ -r /etc/rc.status ]; then
|
erjo@2
|
75 source /etc/rc.status
|
erjo@2
|
76 if [ -r /etc/SuSE-release ]; then
|
erjo@2
|
77 DISTR=suse
|
erjo@2
|
78 fi
|
erjo@2
|
79 elif [ -r /etc/debian_version ]; then
|
erjo@2
|
80 DISTR=debian
|
erjo@2
|
81 LOCKFILE=/var/lock/vz_lock
|
erjo@2
|
82 SUBSYS_VZ=/var/lock/vz
|
erjo@2
|
83 elif [ -r /etc/slitaz-release ]; then
|
erjo@2
|
84 DISTR=slitaz
|
erjo@2
|
85 LOCKFILE=/var/lock/vz_lock
|
erjo@2
|
86 SUBSYS_VZ=/var/lock/vz
|
erjo@2
|
87 fi
|
erjo@2
|
88
|
erjo@2
|
89 VEINFO=""
|
erjo@2
|
90 RETVAL=0
|
erjo@2
|
91 # Number of the containers to stop in parallel.
|
erjo@2
|
92 # In case of empty value the number of CTs is calculated as 'num_cpu * 4'
|
erjo@2
|
93 PARALLEL=
|
erjo@2
|
94 cd /
|
erjo@2
|
95
|
erjo@2
|
96 # We used to install OpenVZ cron job when the vzctl package was
|
erjo@2
|
97 # installed, irrespective of whether OpenVZ was actually being
|
erjo@2
|
98 # run. Although the cron jobs didn't create any problems if someone
|
erjo@2
|
99 # wasn't running OpenVZ some users complained about the cron log file
|
erjo@2
|
100 # filling up, resource usage, and power consumption since systems
|
erjo@2
|
101 # wouldn't really idle. It really only makes sense to run the OpenVZ
|
erjo@2
|
102 # cron job if the vz service is turned on and not just merely
|
erjo@2
|
103 # having the package installed. This init.d script is an obvious place
|
erjo@2
|
104 # to install or remove the cron jobs based on the service
|
erjo@2
|
105 # being enabled or not.
|
erjo@2
|
106 SRC_CRONSCRIPT_DIR=/etc/vz/cron
|
erjo@2
|
107 DST_CRONSCRIPT_DIR=/etc/cron.d
|
erjo@2
|
108
|
erjo@2
|
109 check_old_cron_files()
|
erjo@2
|
110 {
|
erjo@2
|
111 # avoid double OpenVZ cron settings
|
erjo@2
|
112 local f
|
erjo@2
|
113 for f in vpsreboot vpsnetclean; do
|
erjo@2
|
114 [ -f $DST_CRONSCRIPT_DIR/$f ] && rm -f $DST_CRONSCRIPT_DIR/$f
|
erjo@2
|
115 done
|
erjo@2
|
116 }
|
erjo@2
|
117
|
erjo@2
|
118 setup_cron()
|
erjo@2
|
119 {
|
erjo@2
|
120 check_old_cron_files
|
erjo@2
|
121 [ -z "$SRC_CRONSCRIPT_DIR" ] && return
|
erjo@2
|
122 [ -d "$SRC_CRONSCRIPT_DIR" ] || return
|
erjo@2
|
123 cat $SRC_CRONSCRIPT_DIR/vz* > $DST_CRONSCRIPT_DIR/vz &&
|
erjo@2
|
124 chmod 644 $DST_CRONSCRIPT_DIR/vz
|
erjo@2
|
125 }
|
erjo@2
|
126
|
erjo@2
|
127 remove_cron()
|
erjo@2
|
128 {
|
erjo@2
|
129 check_old_cron_files
|
erjo@2
|
130 [ -z "$SRC_CRONSCRIPT_DIR" ] && return
|
erjo@2
|
131 [ -d "$SRC_CRONSCRIPT_DIR" ] || return
|
erjo@2
|
132 cat > $DST_CRONSCRIPT_DIR/vz <<EOF
|
erjo@2
|
133 # DO NOT EDIT THIS FILE!
|
erjo@2
|
134 #
|
erjo@2
|
135 # Contents of this file managed by /etc/init.d/vz script
|
erjo@2
|
136 # Master copy is in $SRC_CRONSCRIPT_DIR/vz* file(s).
|
erjo@2
|
137 # Consult $SRC_CRONSCRIPT_DIR/vz* for documentation.
|
erjo@2
|
138 EOF
|
erjo@2
|
139 }
|
erjo@2
|
140
|
erjo@2
|
141 # Actualize OpenVZ cron entry:
|
erjo@2
|
142 # if OpenVZ is running, add it, otherwise remove.
|
erjo@2
|
143 update_cron()
|
erjo@2
|
144 {
|
erjo@2
|
145 if is_running; then
|
erjo@2
|
146 __echo "Adding OpenVZ cron entries"
|
erjo@2
|
147 setup_cron
|
erjo@2
|
148 else
|
erjo@2
|
149 __echo "Removing OpenVZ cron entries"
|
erjo@2
|
150 remove_cron
|
erjo@2
|
151 fi
|
erjo@2
|
152 print_result
|
erjo@2
|
153 }
|
erjo@2
|
154
|
erjo@2
|
155 check_kernel()
|
erjo@2
|
156 {
|
erjo@2
|
157 if ! test -d /proc/vz ; then
|
erjo@2
|
158 print_failure "Running kernel is not OpenVZ kernel."
|
erjo@2
|
159 exit 1
|
erjo@2
|
160 fi
|
erjo@2
|
161 }
|
erjo@2
|
162
|
erjo@2
|
163 get_kernel_version()
|
erjo@2
|
164 {
|
erjo@2
|
165 [ ! -z "$KERNEL_MAJOR" ] && return
|
erjo@2
|
166
|
erjo@2
|
167 local ver=$(uname -r)
|
erjo@2
|
168 local kernel=$(echo $ver | sed s/[-+].*//)
|
erjo@2
|
169 KERNEL_MAJOR=$(echo $kernel | awk -F . '{print $1}')
|
erjo@2
|
170 KERNEL_MINOR=$(echo $kernel | awk -F . '{print $2}')
|
erjo@2
|
171 KERNEL_PATCHLEVEL=$(echo $kernel | awk -F . '{print $3}')
|
erjo@2
|
172 }
|
erjo@2
|
173
|
erjo@2
|
174 check_kernel_config()
|
erjo@2
|
175 {
|
erjo@2
|
176 test -r /proc/config.gz || return 0
|
erjo@2
|
177
|
erjo@2
|
178 local conf opt err=0
|
erjo@2
|
179 local opt_must="SIM_FS VE VE_CALLS VZ_GENCALLS"
|
erjo@2
|
180 get_kernel_version
|
erjo@2
|
181 # For kernels >= 2.6.9 VZ_DEV must be set.
|
erjo@2
|
182 test "${KERNEL_MINOR}" -ge 6 &&
|
erjo@2
|
183 test "${KERNEL_PATCHLEVEL}" -gt 9 &&
|
erjo@2
|
184 opt_must="${opt_must} VZ_DEV"
|
erjo@2
|
185 # local opt_rec="SCHED_VCPU FAIRSCHED VZ_QUOTA VZ_QUOTA_UGID VE_NETDEV VE_ETHDEV
|
erjo@2
|
186 # VE_IPTABLES VZ_CHECKPOINT VZ_WDOG"
|
erjo@2
|
187
|
erjo@2
|
188 conf="`zcat /proc/config.gz 2>/dev/null | grep -E -v '^#|^$'`"
|
erjo@2
|
189
|
erjo@2
|
190 for opt in $opt_must; do
|
erjo@2
|
191 if ! echo "$conf" 2>/dev/null | grep -q "$opt="; then
|
erjo@2
|
192 echo "ERROR: Missing kernel config option: CONFIG_$opt"
|
erjo@2
|
193 err=1
|
erjo@2
|
194 fi
|
erjo@2
|
195 done
|
erjo@2
|
196 if [ $err != 0 ]; then
|
erjo@2
|
197 print_failure "Please recompile your kernel."
|
erjo@2
|
198 exit 1
|
erjo@2
|
199 fi
|
erjo@2
|
200 }
|
erjo@2
|
201
|
erjo@2
|
202 get_parallel()
|
erjo@2
|
203 {
|
erjo@2
|
204 [ -n "${PARALLEL}" ] && return
|
erjo@2
|
205 PARALLEL=`awk '
|
erjo@2
|
206 BEGIN { num=0; }
|
erjo@2
|
207 $1 == "processor" { num++; }
|
erjo@2
|
208 END { print num * 4; }' /proc/cpuinfo`
|
erjo@2
|
209 }
|
erjo@2
|
210
|
erjo@2
|
211 get_veinfo()
|
erjo@2
|
212 {
|
erjo@2
|
213 if [ -f /proc/vz/veinfo ]; then
|
erjo@2
|
214 VEINFO=/proc/vz/veinfo
|
erjo@2
|
215 elif [ -f /proc/veinfo ]; then
|
erjo@2
|
216 VEINFO=/proc/veinfo
|
erjo@2
|
217 elif [ ! -f $VESTAT ]; then
|
erjo@2
|
218 return 1
|
erjo@2
|
219 fi
|
erjo@2
|
220 return 0
|
erjo@2
|
221 }
|
erjo@2
|
222
|
erjo@2
|
223 print_success()
|
erjo@2
|
224 {
|
erjo@2
|
225 if [ "$DISTR" = "redhat" ]; then
|
erjo@2
|
226 echo_success
|
erjo@2
|
227 else
|
erjo@2
|
228 echo -n "$rc_done"
|
erjo@2
|
229 fi
|
erjo@2
|
230 echo
|
erjo@2
|
231 }
|
erjo@2
|
232
|
erjo@2
|
233 print_failure()
|
erjo@2
|
234 {
|
erjo@2
|
235 echo -n "$1"
|
erjo@2
|
236 if [ "$DISTR" = "redhat" ]; then
|
erjo@2
|
237 failure $"$1"
|
erjo@2
|
238 else
|
erjo@2
|
239 echo -n "$rc_failed"
|
erjo@2
|
240 fi
|
erjo@2
|
241 echo
|
erjo@2
|
242 }
|
erjo@2
|
243
|
erjo@2
|
244 # Calls either print_success or print_failure, depending on $?
|
erjo@2
|
245 # Optional argument $1 -- an error string passed to print_failure.
|
erjo@2
|
246 print_result()
|
erjo@2
|
247 {
|
erjo@2
|
248 if [ $? -eq 0 ] ; then
|
erjo@2
|
249 print_success
|
erjo@2
|
250 else
|
erjo@2
|
251 print_failure "$1"
|
erjo@2
|
252 fi
|
erjo@2
|
253 }
|
erjo@2
|
254
|
erjo@2
|
255 __echo()
|
erjo@2
|
256 {
|
erjo@2
|
257 if [ "$DISTR" = "redhat" ]; then
|
erjo@2
|
258 echo -n $"$1"
|
erjo@2
|
259 else
|
erjo@2
|
260 echo -n "$1"
|
erjo@2
|
261 fi
|
erjo@2
|
262 }
|
erjo@2
|
263
|
erjo@2
|
264 is_running()
|
erjo@2
|
265 {
|
erjo@2
|
266 get_veinfo || return 1
|
erjo@2
|
267 [ -f $SUBSYS_VZ ] || return 1
|
erjo@2
|
268 }
|
erjo@2
|
269
|
erjo@2
|
270 status()
|
erjo@2
|
271 {
|
erjo@2
|
272 check_kernel
|
erjo@2
|
273
|
erjo@2
|
274 if is_running; then
|
erjo@2
|
275 echo "OpenVZ is running..."
|
erjo@2
|
276 return 0
|
erjo@2
|
277 else
|
erjo@2
|
278 echo "OpenVZ is stopped."
|
erjo@2
|
279 return 3
|
erjo@2
|
280 fi
|
erjo@2
|
281 }
|
erjo@2
|
282
|
erjo@2
|
283 start_net()
|
erjo@2
|
284 {
|
erjo@2
|
285 local mod
|
erjo@2
|
286
|
erjo@2
|
287 # load all kernel modules needed for containers networking
|
erjo@2
|
288 for mod in ${NET_MODULES}; do
|
erjo@2
|
289 modprobe ${mod} 2>/dev/null
|
erjo@2
|
290 done
|
erjo@2
|
291
|
erjo@2
|
292 if ip addr list | grep -q "venet0:.*UP" 2>/dev/null; then
|
erjo@2
|
293 return 0
|
erjo@2
|
294 fi
|
erjo@2
|
295
|
erjo@2
|
296 get_veinfo
|
erjo@2
|
297 if [ -z "$VEINFO" ]; then
|
erjo@2
|
298 return 0
|
erjo@2
|
299 fi
|
erjo@2
|
300 __echo "Bringing up interface $VZDEV: "
|
erjo@2
|
301 ip link set $VZDEV up
|
erjo@2
|
302 print_result
|
erjo@2
|
303 ip addr add 0.0.0.0/0 dev $VZDEV
|
erjo@2
|
304 __echo "Configuring interface $VZDEV: "
|
erjo@2
|
305 sysctl -w net.ipv4.conf.$VZDEV.send_redirects=0
|
erjo@2
|
306 print_result
|
erjo@2
|
307 if [ "${IPV6}" = "yes" ]; then
|
erjo@2
|
308 __echo "Configuring ipv6 $VZDEV: "
|
erjo@2
|
309 # Fix me: ip addres should be generated
|
erjo@2
|
310 ip -6 addr add fe80::1/128 dev $VZDEV
|
erjo@2
|
311 print_result
|
erjo@2
|
312 fi
|
erjo@2
|
313 }
|
erjo@2
|
314
|
erjo@2
|
315 stop_net()
|
erjo@2
|
316 {
|
erjo@2
|
317 local mod
|
erjo@2
|
318
|
erjo@2
|
319 if ip addr list | grep -q "venet0:.*UP" 2>/dev/null; then
|
erjo@2
|
320 __echo "Bringing down interface $VZDEV: "
|
erjo@2
|
321 ip link set $VZDEV down
|
erjo@2
|
322 print_result
|
erjo@2
|
323 fi
|
erjo@2
|
324 for mod in ${NET_MODULES}; do
|
erjo@2
|
325 /sbin/modprobe -r ${mod} > /dev/null 2>&1
|
erjo@2
|
326 done
|
erjo@2
|
327 }
|
erjo@2
|
328
|
erjo@2
|
329 setup_ve0()
|
erjo@2
|
330 {
|
erjo@2
|
331 if test -z "${VE0CPUUNITS}"; then
|
erjo@2
|
332 echo "Warning: VE0CPUUNITS is not set in ${VZCONF}; using value of 1000"
|
erjo@2
|
333 VE0CPUUNITS=1000
|
erjo@2
|
334 fi
|
erjo@2
|
335 msg=`${VZCTL} set 0 --cpuunits ${VE0CPUUNITS} 2>&1`
|
erjo@2
|
336 if [ $? -ne 0 ]; then
|
erjo@2
|
337 print_failure "vzctl set 0 --cpuunits ${VE0CPUUNITS} failed: $msg"
|
erjo@2
|
338 fi
|
erjo@2
|
339
|
erjo@2
|
340 if ! test -f "${CONFIG_DIR}/0.conf"; then
|
erjo@2
|
341 return
|
erjo@2
|
342 fi
|
erjo@2
|
343 if ! grep -q '^ONBOOT=yes\|^ONBOOT=\"yes\"' ${CONFIG_DIR}/0.conf;
|
erjo@2
|
344 then
|
erjo@2
|
345 return
|
erjo@2
|
346 fi
|
erjo@2
|
347 __echo "Configure node UB resources: "
|
erjo@2
|
348 msg=`$VZCTL set 0 --reset_ub 2>&1`
|
erjo@2
|
349 print_result "$msg"
|
erjo@2
|
350 }
|
erjo@2
|
351
|
erjo@2
|
352 start_ves()
|
erjo@2
|
353 {
|
erjo@2
|
354 local veid
|
erjo@2
|
355 local velist
|
erjo@2
|
356 local msg
|
erjo@2
|
357 local need_restart
|
erjo@2
|
358
|
erjo@2
|
359 need_restart=""
|
erjo@2
|
360 cd ${CONFIG_DIR} || return
|
erjo@2
|
361 velist=`grep -l '^ONBOOT=yes\|^ONBOOT=\"yes\"' [0-9]*.conf 2>/dev/null |
|
erjo@2
|
362 sed -e 's/.conf//g' | sort -n`
|
erjo@2
|
363 cd - >/dev/null
|
erjo@2
|
364 sysctl -w net.ipv4.route.src_check=0
|
erjo@2
|
365 for veid in $velist; do
|
erjo@2
|
366 [ "${veid}" = "0" ] && continue
|
erjo@2
|
367 __echo "Starting CT ${veid}: "
|
erjo@2
|
368 if [ "x${VZFASTBOOT}" = "xyes" -a "x${DISK_QUOTA}" = "xyes" ];
|
erjo@2
|
369 then
|
erjo@2
|
370 $VZQUOTA stat ${veid} >/dev/null 2>&1
|
erjo@2
|
371 if [ $? -eq 6 ]; then
|
erjo@2
|
372 if $VZQUOTA show ${veid} 2>&1 | grep "vzquota : (warning) Quota is running" >/dev/null 2>&1; then
|
erjo@2
|
373 $VZQUOTA on ${veid} --nocheck >/dev/null 2>&1
|
erjo@2
|
374 need_restart="${need_restart} ${veid}"
|
erjo@2
|
375 fi
|
erjo@2
|
376 fi
|
erjo@2
|
377 fi
|
erjo@2
|
378 msg=`$VZCTL start ${veid} 2>&1`
|
erjo@2
|
379 print_result "$msg"
|
erjo@2
|
380 done
|
erjo@2
|
381 for veid in ${need_restart}; do
|
erjo@2
|
382 __echo "Stopping CT ${veid}: "
|
erjo@2
|
383 $VZCTL stop ${veid} 2>&1 >/dev/null 2>&1
|
erjo@2
|
384 print_result "$msg"
|
erjo@2
|
385 __echo "Starting CT ${veid}: "
|
erjo@2
|
386 msg=`$VZCTL start ${veid} 2>&1`
|
erjo@2
|
387 print_result "$msg"
|
erjo@2
|
388 done
|
erjo@2
|
389 }
|
erjo@2
|
390
|
erjo@2
|
391 stop_ves()
|
erjo@2
|
392 {
|
erjo@2
|
393 local veid
|
erjo@2
|
394 local velist
|
erjo@2
|
395 local msg
|
erjo@2
|
396 local m
|
erjo@2
|
397 local mounts
|
erjo@2
|
398 local fail
|
erjo@2
|
399 local iter
|
erjo@2
|
400 local quota
|
erjo@2
|
401 local pids
|
erjo@2
|
402
|
erjo@2
|
403 if get_veinfo; then
|
erjo@2
|
404 get_parallel
|
erjo@2
|
405 for i in 0 1 2; do
|
erjo@2
|
406 iter=0;
|
erjo@2
|
407 pids=
|
erjo@2
|
408 velist=`awk '$1 != "VEID" && $1 != "Version:" {print $1}' ${VESTAT}`
|
erjo@2
|
409 for veid in $velist; do
|
erjo@2
|
410 echo "Shutting down CT $veid"
|
erjo@2
|
411 # Set fairsched parameters to maximum so
|
erjo@2
|
412 # CT will stop fast
|
erjo@2
|
413 $VZCTL set $veid --cpuunits 2000 --cpulimit 0 >/dev/null 2>&1
|
erjo@2
|
414 $VZCTL --skiplock stop $veid >/dev/null 2>&1 &
|
erjo@2
|
415 pids="$pids $!"
|
erjo@2
|
416 iter=$(($iter+1))
|
erjo@2
|
417 if [ ${iter} -gt ${PARALLEL} ]; then
|
erjo@2
|
418 for pid in ${pids}; do
|
erjo@2
|
419 wait ${pid}
|
erjo@2
|
420 done
|
erjo@2
|
421 pids=
|
erjo@2
|
422 iter=0
|
erjo@2
|
423 fi
|
erjo@2
|
424 done
|
erjo@2
|
425 for pid in $pids; do
|
erjo@2
|
426 wait $pid
|
erjo@2
|
427 done
|
erjo@2
|
428 done
|
erjo@2
|
429 fi
|
erjo@2
|
430 iter=0
|
erjo@2
|
431 fail=1
|
erjo@2
|
432 while test $iter -lt 5 -a $fail -ne 0; do
|
erjo@2
|
433 fail=0
|
erjo@2
|
434 mounts=`awk '{if ($3=="simfs") print $2}' /proc/mounts`
|
erjo@2
|
435 for m in $mounts; do
|
erjo@2
|
436 __echo "Unmounting CT area "
|
erjo@2
|
437 echo -n $m
|
erjo@2
|
438 msg=`umount $m 2>&1`
|
erjo@2
|
439 if [ $? -eq 0 ]; then
|
erjo@2
|
440 print_success
|
erjo@2
|
441 else
|
erjo@2
|
442 print_failure "$msg"
|
erjo@2
|
443 fail=$((fail+1))
|
erjo@2
|
444 fuser -k -m ${m} > /dev/null 2>&1
|
erjo@2
|
445 fi
|
erjo@2
|
446 done
|
erjo@2
|
447 iter=$(($iter+1))
|
erjo@2
|
448 done
|
erjo@2
|
449 # turn quota off
|
erjo@2
|
450 quota=`awk -F: '/^[0-9]+:/{print $1}' /proc/vz/vzquota 2>/dev/null`
|
erjo@2
|
451 for m in ${quota}; do
|
erjo@2
|
452 __echo "Turn quota off for CT "
|
erjo@2
|
453 echo -n $m
|
erjo@2
|
454 msg=`vzquota off ${m} 2>&1`
|
erjo@2
|
455 print_result "$msg"
|
erjo@2
|
456 done
|
erjo@2
|
457 }
|
erjo@2
|
458
|
erjo@2
|
459 lockfile()
|
erjo@2
|
460 {
|
erjo@2
|
461 local TEMPFILE="${1}.$$"
|
erjo@2
|
462 local LOCKFILE="${1}"
|
erjo@2
|
463
|
erjo@2
|
464 trap -- "rm -f ${LOCKFILE} ${TEMPFILE}" EXIT
|
erjo@2
|
465
|
erjo@2
|
466 echo $$ > ${TEMPFILE} 2> /dev/null || {
|
erjo@2
|
467 echo "Can't write to ${TEMPFILE}"
|
erjo@2
|
468 }
|
erjo@2
|
469 ln ${TEMPFILE} ${LOCKFILE} >/dev/null 2>&1 && {
|
erjo@2
|
470 rm -f ${TEMPFILE};
|
erjo@2
|
471 return 0;
|
erjo@2
|
472 }
|
erjo@2
|
473 kill -0 `cat $LOCKFILE` >/dev/null 2>&1 && {
|
erjo@2
|
474 return 1;
|
erjo@2
|
475 }
|
erjo@2
|
476 ln ${TEMPFILE} ${LOCKFILE} >/dev/null 2>&1 && {
|
erjo@2
|
477 rm -f ${TEMPFILE};
|
erjo@2
|
478 return 0;
|
erjo@2
|
479 }
|
erjo@2
|
480 rm -f ${LOCKFILE}
|
erjo@2
|
481 echo $$ > ${LOCKFILE}
|
erjo@2
|
482 return 0
|
erjo@2
|
483 }
|
erjo@2
|
484
|
erjo@2
|
485 start()
|
erjo@2
|
486 {
|
erjo@2
|
487 local veid
|
erjo@2
|
488 local velist
|
erjo@2
|
489 local msg
|
erjo@2
|
490 local mod
|
erjo@2
|
491
|
erjo@2
|
492 check_kernel
|
erjo@2
|
493 check_kernel_config
|
erjo@2
|
494
|
erjo@2
|
495 if ! lockfile $LOCKFILE; then
|
erjo@2
|
496 __echo "OpenVZ is locked"
|
erjo@2
|
497 print_failure
|
erjo@2
|
498 return 1
|
erjo@2
|
499 fi
|
erjo@2
|
500 if [ -f ${SUBSYS_VZ} ]; then
|
erjo@2
|
501 __echo "OpenVZ already running"
|
erjo@2
|
502 print_failure
|
erjo@2
|
503 return 1
|
erjo@2
|
504 fi
|
erjo@2
|
505 __echo "Starting OpenVZ: "
|
erjo@2
|
506 load_modules "${IPT_MODULES}"
|
erjo@2
|
507 for mod in $PRELOAD_MODULES; do
|
erjo@2
|
508 /sbin/modprobe -r $mod >/dev/null 2>&1
|
erjo@2
|
509 /sbin/modprobe $mod >/dev/null 2>&1
|
erjo@2
|
510 done
|
erjo@2
|
511 for mod in $MODULES; do
|
erjo@2
|
512 /sbin/modprobe $mod >/dev/null 2>&1
|
erjo@2
|
513 RETVAL=$?
|
erjo@2
|
514 if [ $RETVAL -ne 0 ]; then
|
erjo@2
|
515 print_failure "failed to load module ${mod}"
|
erjo@2
|
516 return $RETVAL
|
erjo@2
|
517 fi
|
erjo@2
|
518 done
|
erjo@2
|
519 load_modules "${MODULES_OTHER} ${VZFS_MODULES}"
|
erjo@2
|
520 print_success "loading OpenVZ modules"
|
erjo@2
|
521
|
erjo@2
|
522 if [ ! -e /dev/vzctl ]; then
|
erjo@2
|
523 # On most modern distros udev will create a device for you,
|
erjo@2
|
524 # while on the old distros /dev/vzctl comes with vzctl rpm.
|
erjo@2
|
525 # So the below mknod call is probably not needed at all.
|
erjo@2
|
526 /bin/mknod -m 600 /dev/vzctl c 126 0 > /dev/null 2>&1
|
erjo@2
|
527 RETVAL=$?
|
erjo@2
|
528 if [ $RETVAL -ne 0 ]; then
|
erjo@2
|
529 print_failure "creating /dev/vzctl"
|
erjo@2
|
530 return $RETVAL
|
erjo@2
|
531 fi
|
erjo@2
|
532 fi
|
erjo@2
|
533
|
erjo@2
|
534 start_net
|
erjo@2
|
535 setup_ve0
|
erjo@2
|
536 setup_cron
|
erjo@2
|
537 start_ves
|
erjo@2
|
538
|
erjo@2
|
539 rm -f $LOCKFILE
|
erjo@2
|
540 touch $SUBSYS_VZ
|
erjo@2
|
541 }
|
erjo@2
|
542
|
erjo@2
|
543 stop()
|
erjo@2
|
544 {
|
erjo@2
|
545 local mod
|
erjo@2
|
546
|
erjo@2
|
547 if ! lockfile $LOCKFILE; then
|
erjo@2
|
548 __echo "OpenVZ is locked"
|
erjo@2
|
549 print_failure
|
erjo@2
|
550 RETVAL=1
|
erjo@2
|
551 return 1
|
erjo@2
|
552 fi
|
erjo@2
|
553
|
erjo@2
|
554 stop_ves
|
erjo@2
|
555 remove_cron
|
erjo@2
|
556 stop_net
|
erjo@2
|
557 __echo "Stopping OpenVZ: "
|
erjo@2
|
558 for mod in ${MODULES_OTHER} ${MODULES} ${PRELOAD_MODULES} ${IPT_MODULES} ${VZFS_MODULES}; do
|
erjo@2
|
559 /sbin/modprobe -r ${mod} > /dev/null 2>&1
|
erjo@2
|
560 done
|
erjo@2
|
561 rm -f $LOCKFILE
|
erjo@2
|
562 rm -f $SUBSYS_VZ
|
erjo@2
|
563 print_success
|
erjo@2
|
564 }
|
erjo@2
|
565
|
erjo@2
|
566 load_modules()
|
erjo@2
|
567 {
|
erjo@2
|
568 local modules=$1
|
erjo@2
|
569 local mod
|
erjo@2
|
570
|
erjo@2
|
571 for mod in ${modules}; do
|
erjo@2
|
572 if /sbin/lsmod | grep -qw ${mod}; then
|
erjo@2
|
573 continue
|
erjo@2
|
574 fi
|
erjo@2
|
575 /sbin/modprobe ${mod} >/dev/null 2>&1
|
erjo@2
|
576 done
|
erjo@2
|
577 }
|
erjo@2
|
578
|
erjo@2
|
579 # See how we were called.
|
erjo@2
|
580 case "$1" in
|
erjo@2
|
581 start)
|
erjo@2
|
582 start
|
erjo@2
|
583 ;;
|
erjo@2
|
584 stop)
|
erjo@2
|
585 stop
|
erjo@2
|
586 ;;
|
erjo@2
|
587 restart|force-reload)
|
erjo@2
|
588 stop
|
erjo@2
|
589 start
|
erjo@2
|
590 ;;
|
erjo@2
|
591 status)
|
erjo@2
|
592 status
|
erjo@2
|
593 RETVAL=$?
|
erjo@2
|
594 ;;
|
erjo@2
|
595 update-cron)
|
erjo@2
|
596 update_cron
|
erjo@2
|
597 RETVAL=0
|
erjo@2
|
598 ;;
|
erjo@2
|
599 *)
|
erjo@2
|
600 echo "Usage: $0 {start|stop|status|restart|force-reload|update-cron}"
|
erjo@2
|
601 exit 1
|
erjo@2
|
602 esac
|
erjo@2
|
603
|
erjo@2
|
604 exit $RETVAL
|