VirtualBox

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

Last change on this file since 44760 was 44528, checked in by vboxsync, 12 years ago

header (C) fixes

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 12.4 KB
Line 
1#! /bin/sh
2# Oracle VM VirtualBox
3# Linux kernel module init script
4
5#
6# Copyright (C) 2006-2013 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 20 80
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: 0 1 6
26# Short-Description: VirtualBox Linux kernel module
27### END INIT INFO
28
29PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
30DEVICE=/dev/vboxdrv
31LOG="/var/log/vbox-install.log"
32MODPROBE=/sbin/modprobe
33
34if $MODPROBE -c | grep -q '^allow_unsupported_modules *0'; then
35 MODPROBE="$MODPROBE --allow-unsupported-modules"
36fi
37
38[ -f /etc/debian_release -a -f /lib/lsb/init-functions ] || NOLSB=yes
39[ -f /etc/vbox/vbox.cfg ] && . /etc/vbox/vbox.cfg
40export BUILD_TYPE
41export USERNAME
42export USER=$USERNAME
43
44if [ -n "$INSTALL_DIR" ]; then
45 VBOXMANAGE="$INSTALL_DIR/VBoxManage"
46 MODULE_SRC="$INSTALL_DIR/src/vboxhost"
47else
48 VBOXMANAGE="/usr/lib/virtualbox/VBoxManage"
49 MODULE_SRC="/usr/share/virtualbox/src/vboxhost"
50fi
51BUILDINTMP="$MODULE_SRC/build_in_tmp"
52DODKMS="$MODULE_SRC/do_dkms"
53
54# silently exit if the package was uninstalled but not purged,
55# applies to Debian packages only (but shouldn't hurt elsewhere)
56[ ! -f /etc/debian_release -o -x $VBOXMANAGE -a -x $BUILDINTMP ] || exit 0
57
58if [ -n "$NOLSB" ]; then
59 if [ -f /etc/redhat-release ]; then
60 system=redhat
61 elif [ -f /etc/SuSE-release ]; then
62 system=suse
63 elif [ -f /etc/gentoo-release ]; then
64 system=gentoo
65 fi
66fi
67
68[ -r /etc/default/virtualbox ] && . /etc/default/virtualbox
69
70if [ -z "$NOLSB" ]; then
71 . /lib/lsb/init-functions
72 fail_msg() {
73 echo ""
74 log_failure_msg "$1"
75 }
76 succ_msg() {
77 log_end_msg 0
78 }
79 begin_msg() {
80 log_daemon_msg "$@"
81 }
82else
83 if [ "$system" = "redhat" ]; then
84 . /etc/init.d/functions
85 fail_msg() {
86 echo -n " "
87 echo_failure
88 echo
89 echo " ($1)"
90 }
91 succ_msg() {
92 echo -n " "
93 echo_success
94 echo
95 }
96 elif [ "$system" = "suse" ]; then
97 . /etc/rc.status
98 fail_msg() {
99 rc_failed 1
100 rc_status -v
101 echo " ($1)"
102 }
103 succ_msg() {
104 rc_reset
105 rc_status -v
106 }
107 elif [ "$system" = "gentoo" ]; then
108 if [ -f /sbin/functions.sh ]; then
109 . /sbin/functions.sh
110 elif [ -f /etc/init.d/functions.sh ]; then
111 . /etc/init.d/functions.sh
112 fi
113 fail_msg() {
114 eerror "$1"
115 }
116 succ_msg() {
117 eend "$?"
118 }
119 begin_msg() {
120 ebegin "$1"
121 }
122 if [ "`which $0`" = "/sbin/rc" ]; then
123 shift
124 fi
125 else
126 fail_msg() {
127 echo " ...failed!"
128 echo " ($1)"
129 }
130 succ_msg() {
131 echo " ...done."
132 }
133 fi
134 if [ "$system" != "gentoo" ]; then
135 begin_msg() {
136 [ -z "${1:-}" ] && return 1
137 if [ -z "${2:-}" ]; then
138 echo -n "$1"
139 else
140 echo -n "$1: $2"
141 fi
142 }
143 fi
144fi
145
146failure()
147{
148 fail_msg "$1"
149 exit 0
150}
151
152running()
153{
154 lsmod | grep -q "$1[^_-]"
155}
156
157start()
158{
159 begin_msg "Starting VirtualBox kernel modules"
160 if [ -d /proc/xen ]; then
161 failure "Running VirtualBox in a Xen environment is not supported"
162 fi
163 if ! running vboxdrv; then
164 if ! rm -f $DEVICE; then
165 failure "Cannot remove $DEVICE"
166 fi
167 if ! $MODPROBE vboxdrv > /dev/null 2>&1; then
168 failure "modprobe vboxdrv failed. Please use 'dmesg' to find out why"
169 fi
170 sleep .2
171 fi
172 # ensure the character special exists
173 if [ ! -c $DEVICE ]; then
174 MAJOR=`sed -n 's;\([0-9]\+\) vboxdrv;\1;p' /proc/devices`
175 if [ ! -z "$MAJOR" ]; then
176 MINOR=0
177 else
178 MINOR=`sed -n 's;\([0-9]\+\) vboxdrv;\1;p' /proc/misc`
179 if [ ! -z "$MINOR" ]; then
180 MAJOR=10
181 fi
182 fi
183 if [ -z "$MAJOR" ]; then
184 rmmod vboxdrv 2>/dev/null
185 failure "Cannot locate the VirtualBox device"
186 fi
187 if ! mknod -m 0660 $DEVICE c $MAJOR $MINOR 2>/dev/null; then
188 rmmod vboxdrv 2>/dev/null
189 failure "Cannot create device $DEVICE with major $MAJOR and minor $MINOR"
190 fi
191 fi
192 # ensure permissions
193 if ! chown :%GROUP% $DEVICE 2>/dev/null; then
194 rmmod vboxpci 2>/dev/null
195 rmmod vboxnetadp 2>/dev/null
196 rmmod vboxnetflt 2>/dev/null
197 rmmod vboxdrv 2>/dev/null
198 failure "Cannot change group %GROUP% for device $DEVICE"
199 fi
200 if ! $MODPROBE vboxnetflt > /dev/null 2>&1; then
201 failure "modprobe vboxnetflt failed. Please use 'dmesg' to find out why"
202 fi
203 if ! $MODPROBE vboxnetadp > /dev/null 2>&1; then
204 failure "modprobe vboxnetadp failed. Please use 'dmesg' to find out why"
205 fi
206 if ! $MODPROBE vboxpci > /dev/null 2>&1; then
207 failure "modprobe vboxpci failed. Please use 'dmesg' to find out why"
208 fi
209 # Create the /dev/vboxusb directory if the host supports that method
210 # of USB access. The USB code checks for the existance of that path.
211 if grep -q usb_device /proc/devices; then
212 mkdir -p -m 0750 /dev/vboxusb 2>/dev/null
213 chown root:vboxusers /dev/vboxusb 2>/dev/null
214 fi
215 succ_msg
216}
217
218stop()
219{
220 begin_msg "Stopping VirtualBox kernel modules"
221 if running vboxpci; then
222 if ! rmmod vboxpci 2>/dev/null; then
223 failure "Cannot unload module vboxpci"
224 fi
225 fi
226 if running vboxnetadp; then
227 if ! rmmod vboxnetadp 2>/dev/null; then
228 failure "Cannot unload module vboxnetadp"
229 fi
230 fi
231 if running vboxdrv; then
232 if running vboxnetflt; then
233 if ! rmmod vboxnetflt 2>/dev/null; then
234 failure "Cannot unload module vboxnetflt"
235 fi
236 fi
237 if ! rmmod vboxdrv 2>/dev/null; then
238 failure "Cannot unload module vboxdrv"
239 fi
240 if ! rm -f $DEVICE; then
241 failure "Cannot unlink $DEVICE"
242 fi
243 fi
244 succ_msg
245}
246
247# enter the following variables in /etc/default/virtualbox:
248# SHUTDOWN_USERS="foo bar"
249# check for running VMs of user foo and user bar
250# SHUTDOWN=poweroff
251# SHUTDOWN=acpibutton
252# SHUTDOWN=savestate
253# select one of these shutdown methods for running VMs
254stop_vms()
255{
256 wait=0
257 for i in $SHUTDOWN_USERS; do
258 # don't create the ipcd directory with wrong permissions!
259 if [ -d /tmp/.vbox-$i-ipc ]; then
260 export VBOX_IPC_SOCKETID="$i"
261 VMS=`$VBOXMANAGE --nologo list runningvms | sed -e 's/^".*".*{\(.*\)}/\1/' 2>/dev/null`
262 if [ -n "$VMS" ]; then
263 if [ "$SHUTDOWN" = "poweroff" ]; then
264 begin_msg "Powering off remaining VMs"
265 for v in $VMS; do
266 $VBOXMANAGE --nologo controlvm $v poweroff
267 done
268 succ_msg
269 elif [ "$SHUTDOWN" = "acpibutton" ]; then
270 begin_msg "Sending ACPI power button event to remaining VMs"
271 for v in $VMS; do
272 $VBOXMANAGE --nologo controlvm $v acpipowerbutton
273 wait=30
274 done
275 succ_msg
276 elif [ "$SHUTDOWN" = "savestate" ]; then
277 begin_msg "Saving state of remaining VMs"
278 for v in $VMS; do
279 $VBOXMANAGE --nologo controlvm $v savestate
280 done
281 succ_msg
282 fi
283 fi
284 fi
285 done
286 # wait for some seconds when doing ACPI shutdown
287 if [ "$wait" -ne 0 ]; then
288 begin_msg "Waiting for $wait seconds for VM shutdown"
289 sleep $wait
290 succ_msg
291 fi
292}
293
294# setup_script
295setup()
296{
297 stop
298 DKMS=`which dkms 2>/dev/null`
299 if [ -n "$DKMS" ]; then
300 begin_msg "Uninstalling old VirtualBox DKMS kernel modules"
301 $DODKMS uninstall vboxhost vboxdrv vboxnetflt vboxnetadp > $LOG
302 succ_msg
303 fi
304 if find /lib/modules/`uname -r` -name "vboxpci\.*" 2>/dev/null|grep -q vboxpci; then
305 begin_msg "Removing old VirtualBox pci kernel module"
306 find /lib/modules/`uname -r` -name "vboxpci\.*" 2>/dev/null|xargs rm -f 2>/dev/null
307 succ_msg
308 fi
309 if find /lib/modules/`uname -r` -name "vboxnetadp\.*" 2>/dev/null|grep -q vboxnetadp; then
310 begin_msg "Removing old VirtualBox netadp kernel module"
311 find /lib/modules/`uname -r` -name "vboxnetadp\.*" 2>/dev/null|xargs rm -f 2>/dev/null
312 succ_msg
313 fi
314 if find /lib/modules/`uname -r` -name "vboxnetflt\.*" 2>/dev/null|grep -q vboxnetflt; then
315 begin_msg "Removing old VirtualBox netflt kernel module"
316 find /lib/modules/`uname -r` -name "vboxnetflt\.*" 2>/dev/null|xargs rm -f 2>/dev/null
317 succ_msg
318 fi
319 if find /lib/modules/`uname -r` -name "vboxdrv\.*" 2>/dev/null|grep -q vboxdrv; then
320 begin_msg "Removing old VirtualBox kernel module"
321 find /lib/modules/`uname -r` -name "vboxdrv\.*" 2>/dev/null|xargs rm -f 2>/dev/null
322 succ_msg
323 fi
324 if [ -n "$DKMS" ]; then
325 begin_msg "Trying to register the VirtualBox kernel modules using DKMS"
326 if ! $DODKMS install vboxhost $INSTALL_VER >> $LOG; then
327 fail_msg "Failed, trying without DKMS"
328 DKMS=""
329 fi
330 fi
331 if [ -z "$DKMS" ]; then
332 begin_msg "Recompiling VirtualBox kernel modules"
333 if ! $BUILDINTMP \
334 --save-module-symvers /tmp/vboxdrv-Module.symvers \
335 --module-source "$MODULE_SRC/vboxdrv" \
336 --no-print-directory install >> $LOG 2>&1; then
337 failure "Look at $LOG to find out what went wrong"
338 fi
339 if ! $BUILDINTMP \
340 --use-module-symvers /tmp/vboxdrv-Module.symvers \
341 --module-source "$MODULE_SRC/vboxnetflt" \
342 --no-print-directory install >> $LOG 2>&1; then
343 failure "Look at $LOG to find out what went wrong"
344 fi
345 if ! $BUILDINTMP \
346 --use-module-symvers /tmp/vboxdrv-Module.symvers \
347 --module-source "$MODULE_SRC/vboxnetadp" \
348 --no-print-directory install >> $LOG 2>&1; then
349 failure "Look at $LOG to find out what went wrong"
350 fi
351 if ! $BUILDINTMP \
352 --use-module-symvers /tmp/vboxdrv-Module.symvers \
353 --module-source "$MODULE_SRC/vboxpci" \
354 --no-print-directory install >> $LOG 2>&1; then
355 failure "Look at $LOG to find out what went wrong"
356 fi
357 fi
358 rm -f /etc/vbox/module_not_compiled
359 succ_msg
360 start
361}
362
363dmnstatus()
364{
365 if running vboxdrv; then
366 str="vboxdrv"
367 if running vboxnetflt; then
368 str="$str, vboxnetflt"
369 if running vboxnetadp; then
370 str="$str, vboxnetadp"
371 fi
372 fi
373 if running vboxpci; then
374 str="$str, vboxpci"
375 fi
376 echo "VirtualBox kernel modules ($str) are loaded."
377 for i in $SHUTDOWN_USERS; do
378 # don't create the ipcd directory with wrong permissions!
379 if [ -d /tmp/.vbox-$i-ipc ]; then
380 export VBOX_IPC_SOCKETID="$i"
381 VMS=`$VBOXMANAGE --nologo list runningvms | sed -e 's/^".*".*{\(.*\)}/\1/' 2>/dev/null`
382 if [ -n "$VMS" ]; then
383 echo "The following VMs are currently running:"
384 for v in $VMS; do
385 echo " $v"
386 done
387 fi
388 fi
389 done
390 else
391 echo "VirtualBox kernel module is not loaded."
392 fi
393}
394
395case "$1" in
396start)
397 start
398 ;;
399stop)
400 stop_vms
401 stop
402 ;;
403stop_vms)
404 stop_vms
405 ;;
406restart)
407 stop && start
408 ;;
409force-reload)
410 stop
411 start
412 ;;
413setup)
414 setup
415 ;;
416status)
417 dmnstatus
418 ;;
419*)
420 echo "Usage: $0 {start|stop|stop_vms|restart|force-reload|status|setup}"
421 exit 1
422esac
423
424exit 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