VirtualBox

source: vbox/trunk/src/VBox/Installer/linux/vboxdrv.sh.in@ 32766

Last change on this file since 32766 was 32548, checked in by vboxsync, 14 years ago

Installer/linux: do not unload the kernel module on host shutdown or reboot

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 11.3 KB
Line 
1#! /bin/sh
2# Oracle VM VirtualBox
3# Linux kernel module init script
4
5#
6# Copyright (C) 2006-2010 Oracle Corporation
7#
8# This file is part of VirtualBox Open Source Edition (OSE), as
9# available from http://www.virtualbox.org. This file is free software;
10# you can redistribute it and/or modify it under the terms of the GNU
11# General Public License (GPL) as published by the Free Software
12# Foundation, in version 2 as it comes in the "COPYING" file of the
13# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15#
16
17# chkconfig: 35 30 70
18# description: VirtualBox Linux kernel module
19#
20### BEGIN INIT INFO
21# Provides: vboxdrv
22# Required-Start: $syslog
23# Required-Stop:
24# Default-Start: 2 3 4 5
25# Default-Stop: 1
26# Short-Description: VirtualBox Linux kernel module
27### END INIT INFO
28
29PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
30DEVICE=/dev/vboxdrv
31GROUPNAME=vboxusers
32LOG="/var/log/vbox-install.log"
33NOLSB=%NOLSB%
34DEBIAN=%DEBIAN%
35MODPROBE=/sbin/modprobe
36
37if $MODPROBE -c | grep -q '^allow_unsupported_modules *0'; then
38 MODPROBE="$MODPROBE --allow-unsupported-modules"
39fi
40
41[ -f /lib/lsb/init-functions ] || NOLSB=yes
42[ -f /etc/vbox/vbox.cfg ] && . /etc/vbox/vbox.cfg
43
44if [ -n "$INSTALL_DIR" ]; then
45 VBOXMANAGE="$INSTALL_DIR/VBoxManage"
46 DODKMS="$INSTALL_DIR/src/vboxhost/do_dkms"
47 BUILDVBOXDRV="$INSTALL_DIR/src/vboxhost/vboxdrv/build_in_tmp"
48 BUILDVBOXNETFLT="$INSTALL_DIR/src/vboxhost/vboxnetflt/build_in_tmp"
49 BUILDVBOXNETADP="$INSTALL_DIR/src/vboxhost/vboxnetadp/build_in_tmp"
50else
51 VBOXMANAGE="/usr/lib/%PACKAGE%/VBoxManage"
52 DODKMS="/usr/share/%PACKAGE%/src/vboxhost/do_dkms"
53 BUILDVBOXDRV="/usr/share/%PACKAGE%/src/vboxhost/vboxdrv/build_in_tmp"
54 BUILDVBOXNETFLT="/usr/share/%PACKAGE%/src/vboxhost/vboxnetflt/build_in_tmp"
55 BUILDVBOXNETADP="/usr/share/%PACKAGE%/src/vboxhost/vboxnetadp/build_in_tmp"
56fi
57
58# silently exit if the package was uninstalled but not purged,
59# applies to Debian packages only
60[ -z "$DEBIAN" -o -x $VBOXMANAGE -a -x $BUILDVBOXDRV ] || exit 0
61
62if [ -n "$NOLSB" ]; then
63 if [ -f /etc/redhat-release ]; then
64 system=redhat
65 elif [ -f /etc/SuSE-release ]; then
66 system=suse
67 elif [ -f /etc/gentoo-release ]; then
68 system=gentoo
69 fi
70fi
71
72[ -r /etc/default/%PACKAGE% ] && . /etc/default/%PACKAGE%
73
74if [ -z "$NOLSB" ]; then
75 . /lib/lsb/init-functions
76 fail_msg() {
77 echo ""
78 log_failure_msg "$1"
79 }
80 succ_msg() {
81 log_success_msg " done."
82 }
83 begin_msg() {
84 log_daemon_msg "$@"
85 }
86else
87 if [ "$system" = "redhat" ]; then
88 . /etc/init.d/functions
89 fail_msg() {
90 echo -n " "
91 echo_failure
92 echo
93 echo " ($1)"
94 }
95 succ_msg() {
96 echo -n " "
97 echo_success
98 echo
99 }
100 elif [ "$system" = "suse" ]; then
101 . /etc/rc.status
102 fail_msg() {
103 rc_failed 1
104 rc_status -v
105 echo " ($1)"
106 }
107 succ_msg() {
108 rc_reset
109 rc_status -v
110 }
111 elif [ "$system" = "gentoo" ]; then
112 if [ -f /sbin/functions.sh ]; then
113 . /sbin/functions.sh
114 elif [ -f /etc/init.d/functions.sh ]; then
115 . /etc/init.d/functions.sh
116 fi
117 fail_msg() {
118 eerror "$1"
119 }
120 succ_msg() {
121 eend "$?"
122 }
123 begin_msg() {
124 ebegin "$1"
125 }
126 if [ "`which $0`" = "/sbin/rc" ]; then
127 shift
128 fi
129 else
130 fail_msg() {
131 echo " ...failed!"
132 echo " ($1)"
133 }
134 succ_msg() {
135 echo " ...done."
136 }
137 fi
138 if [ "$system" != "gentoo" ]; then
139 begin_msg() {
140 [ -z "${1:-}" ] && return 1
141 if [ -z "${2:-}" ]; then
142 echo -n "$1"
143 else
144 echo -n "$1: $2"
145 fi
146 }
147 fi
148fi
149
150failure()
151{
152 fail_msg "$1"
153 exit 0
154}
155
156running()
157{
158 lsmod | grep -q "$1[^_-]"
159}
160
161start()
162{
163 begin_msg "Starting VirtualBox kernel modules"
164 if ! running vboxdrv; then
165 if ! rm -f $DEVICE; then
166 failure "Cannot remove $DEVICE"
167 fi
168 # HACK: disable the hardware performance counter framework
169 if [ -e /proc/sys/kernel/perf_counter_paranoid ]; then
170 echo 2 > /proc/sys/kernel/perf_counter_paranoid
171 fi
172 if ! $MODPROBE vboxdrv > /dev/null 2>&1; then
173 failure "modprobe vboxdrv failed. Please use 'dmesg' to find out why"
174 fi
175 sleep .2
176 fi
177 # ensure the character special exists
178 if [ ! -c $DEVICE ]; then
179 MAJOR=`sed -n 's;\([0-9]\+\) vboxdrv;\1;p' /proc/devices`
180 if [ ! -z "$MAJOR" ]; then
181 MINOR=0
182 else
183 MINOR=`sed -n 's;\([0-9]\+\) vboxdrv;\1;p' /proc/misc`
184 if [ ! -z "$MINOR" ]; then
185 MAJOR=10
186 fi
187 fi
188 if [ -z "$MAJOR" ]; then
189 rmmod vboxdrv 2>/dev/null
190 failure "Cannot locate the VirtualBox device"
191 fi
192 if ! mknod -m 0660 $DEVICE c $MAJOR $MINOR 2>/dev/null; then
193 rmmod vboxdrv 2>/dev/null
194 failure "Cannot create device $DEVICE with major $MAJOR and minor $MINOR"
195 fi
196 fi
197 # ensure permissions
198 if ! chown :$GROUPNAME $DEVICE 2>/dev/null; then
199 rmmod vboxnetadp 2>/dev/null
200 rmmod vboxnetflt 2>/dev/null
201 rmmod vboxdrv 2>/dev/null
202 failure "Cannot change owner $GROUPNAME for device $DEVICE"
203 fi
204 if ! $MODPROBE vboxnetflt > /dev/null 2>&1; then
205 failure "modprobe vboxnetflt failed. Please use 'dmesg' to find out why"
206 fi
207 if ! $MODPROBE vboxnetadp > /dev/null 2>&1; then
208 failure "modprobe vboxnetadp failed. Please use 'dmesg' to find out why"
209 fi
210 succ_msg
211}
212
213stop()
214{
215 begin_msg "Stopping VirtualBox kernel modules"
216 if running vboxnetadp; then
217 if ! rmmod vboxnetadp 2>/dev/null; then
218 failure "Cannot unload module vboxnetadp"
219 fi
220 fi
221 if running vboxdrv; then
222 if running vboxnetflt; then
223 if ! rmmod vboxnetflt 2>/dev/null; then
224 failure "Cannot unload module vboxnetflt"
225 fi
226 fi
227 if ! rmmod vboxdrv 2>/dev/null; then
228 failure "Cannot unload module vboxdrv"
229 fi
230 if ! rm -f $DEVICE; then
231 failure "Cannot unlink $DEVICE"
232 fi
233 fi
234 succ_msg
235}
236
237# enter the following variables in /etc/default/%PACKAGE%:
238# SHUTDOWN_USERS="foo bar"
239# check for running VMs of user foo and user bar
240# SHUTDOWN=poweroff
241# SHUTDOWN=acpibutton
242# SHUTDOWN=savestate
243# select one of these shutdown methods for running VMs
244stop_vms()
245{
246 wait=0
247 for i in $SHUTDOWN_USERS; do
248 # don't create the ipcd directory with wrong permissions!
249 if [ -d /tmp/.vbox-$i-ipc ]; then
250 export VBOX_IPC_SOCKETID="$i"
251 VMS=`$VBOXMANAGE --nologo list runningvms | sed -e 's/^".*".*{\(.*\)}/\1/' 2>/dev/null`
252 if [ -n "$VMS" ]; then
253 if [ "$SHUTDOWN" = "poweroff" ]; then
254 begin_msg "Powering off remaining VMs"
255 for v in $VMS; do
256 $VBOXMANAGE --nologo controlvm $v poweroff
257 done
258 succ_msg
259 elif [ "$SHUTDOWN" = "acpibutton" ]; then
260 begin_msg "Sending ACPI power button event to remaining VMs"
261 for v in $VMS; do
262 $VBOXMANAGE --nologo controlvm $v acpipowerbutton
263 wait=30
264 done
265 succ_msg
266 elif [ "$SHUTDOWN" = "savestate" ]; then
267 begin_msg "Saving state of remaining VMs"
268 for v in $VMS; do
269 $VBOXMANAGE --nologo controlvm $v savestate
270 done
271 succ_msg
272 fi
273 fi
274 fi
275 done
276 # wait for some seconds when doing ACPI shutdown
277 if [ "$wait" -ne 0 ]; then
278 begin_msg "Waiting for $wait seconds for VM shutdown"
279 sleep $wait
280 succ_msg
281 fi
282}
283
284# setup_script
285setup()
286{
287 stop
288 begin_msg "Uninstalling old VirtualBox DKMS kernel modules"
289 $DODKMS uninstall > $LOG
290 succ_msg
291 if find /lib/modules/`uname -r` -name "vboxnetadp\.*" 2>/dev/null|grep -q vboxnetadp; then
292 begin_msg "Removing old VirtualBox netadp kernel module"
293 find /lib/modules/`uname -r` -name "vboxnetadp\.*" 2>/dev/null|xargs rm -f 2>/dev/null
294 succ_msg
295 fi
296 if find /lib/modules/`uname -r` -name "vboxnetflt\.*" 2>/dev/null|grep -q vboxnetflt; then
297 begin_msg "Removing old VirtualBox netflt kernel module"
298 find /lib/modules/`uname -r` -name "vboxnetflt\.*" 2>/dev/null|xargs rm -f 2>/dev/null
299 succ_msg
300 fi
301 if find /lib/modules/`uname -r` -name "vboxdrv\.*" 2>/dev/null|grep -q vboxdrv; then
302 begin_msg "Removing old VirtualBox kernel module"
303 find /lib/modules/`uname -r` -name "vboxdrv\.*" 2>/dev/null|xargs rm -f 2>/dev/null
304 succ_msg
305 fi
306 begin_msg "Trying to register the VirtualBox kernel modules using DKMS"
307 if ! $DODKMS install >> $LOG; then
308 fail_msg "Failed, trying without DKMS"
309 begin_msg "Recompiling VirtualBox kernel modules"
310 if ! $BUILDVBOXDRV \
311 --save-module-symvers /tmp/vboxdrv-Module.symvers \
312 --no-print-directory install >> $LOG 2>&1; then
313 failure "Look at $LOG to find out what went wrong"
314 fi
315 if ! $BUILDVBOXNETFLT \
316 --use-module-symvers /tmp/vboxdrv-Module.symvers \
317 --no-print-directory install >> $LOG 2>&1; then
318 failure "Look at $LOG to find out what went wrong"
319 fi
320 if ! $BUILDVBOXNETADP \
321 --use-module-symvers /tmp/vboxdrv-Module.symvers \
322 --no-print-directory install >> $LOG 2>&1; then
323 failure "Look at $LOG to find out what went wrong"
324 fi
325 fi
326 rm -f /etc/vbox/module_not_compiled
327 succ_msg
328 start
329}
330
331dmnstatus()
332{
333 if running vboxdrv; then
334 if running vboxnetflt; then
335 if running vboxnetadp; then
336 echo "VirtualBox kernel modules (vboxdrv, vboxnetflt and vboxnetadp) are loaded."
337 else
338 echo "VirtualBox kernel modules (vboxdrv and vboxnetflt) are loaded."
339 fi
340 else
341 echo "VirtualBox kernel module is loaded."
342 fi
343 for i in $SHUTDOWN_USERS; do
344 # don't create the ipcd directory with wrong permissions!
345 if [ -d /tmp/.vbox-$i-ipc ]; then
346 export VBOX_IPC_SOCKETID="$i"
347 VMS=`$VBOXMANAGE --nologo list runningvms | sed -e 's/^".*".*{\(.*\)}/\1/' 2>/dev/null`
348 if [ -n "$VMS" ]; then
349 echo "The following VMs are currently running:"
350 for v in $VMS; do
351 echo " $v"
352 done
353 fi
354 fi
355 done
356 else
357 echo "VirtualBox kernel module is not loaded."
358 fi
359}
360
361case "$1" in
362start)
363 start
364 ;;
365stop)
366 stop_vms
367 stop
368 ;;
369stop_vms)
370 stop_vms
371 ;;
372restart)
373 stop && start
374 ;;
375force-reload)
376 stop
377 start
378 ;;
379setup)
380 setup
381 ;;
382status)
383 dmnstatus
384 ;;
385*)
386 echo "Usage: $0 {start|stop|stop_vms|restart|force-reload|status|setup}"
387 exit 1
388esac
389
390exit 0
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette