VirtualBox

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

Last change on this file since 34497 was 33939, checked in by vboxsync, 14 years ago

Support/linux: the user does not need to disable the Local APIC anymore (this is now done during a world switch)

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 11.1 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 if ! $MODPROBE vboxdrv > /dev/null 2>&1; then
169 failure "modprobe vboxdrv failed. Please use 'dmesg' to find out why"
170 fi
171 sleep .2
172 fi
173 # ensure the character special exists
174 if [ ! -c $DEVICE ]; then
175 MAJOR=`sed -n 's;\([0-9]\+\) vboxdrv;\1;p' /proc/devices`
176 if [ ! -z "$MAJOR" ]; then
177 MINOR=0
178 else
179 MINOR=`sed -n 's;\([0-9]\+\) vboxdrv;\1;p' /proc/misc`
180 if [ ! -z "$MINOR" ]; then
181 MAJOR=10
182 fi
183 fi
184 if [ -z "$MAJOR" ]; then
185 rmmod vboxdrv 2>/dev/null
186 failure "Cannot locate the VirtualBox device"
187 fi
188 if ! mknod -m 0660 $DEVICE c $MAJOR $MINOR 2>/dev/null; then
189 rmmod vboxdrv 2>/dev/null
190 failure "Cannot create device $DEVICE with major $MAJOR and minor $MINOR"
191 fi
192 fi
193 # ensure permissions
194 if ! chown :$GROUPNAME $DEVICE 2>/dev/null; then
195 rmmod vboxnetadp 2>/dev/null
196 rmmod vboxnetflt 2>/dev/null
197 rmmod vboxdrv 2>/dev/null
198 failure "Cannot change owner $GROUPNAME 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 succ_msg
207}
208
209stop()
210{
211 begin_msg "Stopping VirtualBox kernel modules"
212 if running vboxnetadp; then
213 if ! rmmod vboxnetadp 2>/dev/null; then
214 failure "Cannot unload module vboxnetadp"
215 fi
216 fi
217 if running vboxdrv; then
218 if running vboxnetflt; then
219 if ! rmmod vboxnetflt 2>/dev/null; then
220 failure "Cannot unload module vboxnetflt"
221 fi
222 fi
223 if ! rmmod vboxdrv 2>/dev/null; then
224 failure "Cannot unload module vboxdrv"
225 fi
226 if ! rm -f $DEVICE; then
227 failure "Cannot unlink $DEVICE"
228 fi
229 fi
230 succ_msg
231}
232
233# enter the following variables in /etc/default/%PACKAGE%:
234# SHUTDOWN_USERS="foo bar"
235# check for running VMs of user foo and user bar
236# SHUTDOWN=poweroff
237# SHUTDOWN=acpibutton
238# SHUTDOWN=savestate
239# select one of these shutdown methods for running VMs
240stop_vms()
241{
242 wait=0
243 for i in $SHUTDOWN_USERS; do
244 # don't create the ipcd directory with wrong permissions!
245 if [ -d /tmp/.vbox-$i-ipc ]; then
246 export VBOX_IPC_SOCKETID="$i"
247 VMS=`$VBOXMANAGE --nologo list runningvms | sed -e 's/^".*".*{\(.*\)}/\1/' 2>/dev/null`
248 if [ -n "$VMS" ]; then
249 if [ "$SHUTDOWN" = "poweroff" ]; then
250 begin_msg "Powering off remaining VMs"
251 for v in $VMS; do
252 $VBOXMANAGE --nologo controlvm $v poweroff
253 done
254 succ_msg
255 elif [ "$SHUTDOWN" = "acpibutton" ]; then
256 begin_msg "Sending ACPI power button event to remaining VMs"
257 for v in $VMS; do
258 $VBOXMANAGE --nologo controlvm $v acpipowerbutton
259 wait=30
260 done
261 succ_msg
262 elif [ "$SHUTDOWN" = "savestate" ]; then
263 begin_msg "Saving state of remaining VMs"
264 for v in $VMS; do
265 $VBOXMANAGE --nologo controlvm $v savestate
266 done
267 succ_msg
268 fi
269 fi
270 fi
271 done
272 # wait for some seconds when doing ACPI shutdown
273 if [ "$wait" -ne 0 ]; then
274 begin_msg "Waiting for $wait seconds for VM shutdown"
275 sleep $wait
276 succ_msg
277 fi
278}
279
280# setup_script
281setup()
282{
283 stop
284 begin_msg "Uninstalling old VirtualBox DKMS kernel modules"
285 $DODKMS uninstall > $LOG
286 succ_msg
287 if find /lib/modules/`uname -r` -name "vboxnetadp\.*" 2>/dev/null|grep -q vboxnetadp; then
288 begin_msg "Removing old VirtualBox netadp kernel module"
289 find /lib/modules/`uname -r` -name "vboxnetadp\.*" 2>/dev/null|xargs rm -f 2>/dev/null
290 succ_msg
291 fi
292 if find /lib/modules/`uname -r` -name "vboxnetflt\.*" 2>/dev/null|grep -q vboxnetflt; then
293 begin_msg "Removing old VirtualBox netflt kernel module"
294 find /lib/modules/`uname -r` -name "vboxnetflt\.*" 2>/dev/null|xargs rm -f 2>/dev/null
295 succ_msg
296 fi
297 if find /lib/modules/`uname -r` -name "vboxdrv\.*" 2>/dev/null|grep -q vboxdrv; then
298 begin_msg "Removing old VirtualBox kernel module"
299 find /lib/modules/`uname -r` -name "vboxdrv\.*" 2>/dev/null|xargs rm -f 2>/dev/null
300 succ_msg
301 fi
302 begin_msg "Trying to register the VirtualBox kernel modules using DKMS"
303 if ! $DODKMS install >> $LOG; then
304 fail_msg "Failed, trying without DKMS"
305 begin_msg "Recompiling VirtualBox kernel modules"
306 if ! $BUILDVBOXDRV \
307 --save-module-symvers /tmp/vboxdrv-Module.symvers \
308 --no-print-directory install >> $LOG 2>&1; then
309 failure "Look at $LOG to find out what went wrong"
310 fi
311 if ! $BUILDVBOXNETFLT \
312 --use-module-symvers /tmp/vboxdrv-Module.symvers \
313 --no-print-directory install >> $LOG 2>&1; then
314 failure "Look at $LOG to find out what went wrong"
315 fi
316 if ! $BUILDVBOXNETADP \
317 --use-module-symvers /tmp/vboxdrv-Module.symvers \
318 --no-print-directory install >> $LOG 2>&1; then
319 failure "Look at $LOG to find out what went wrong"
320 fi
321 fi
322 rm -f /etc/vbox/module_not_compiled
323 succ_msg
324 start
325}
326
327dmnstatus()
328{
329 if running vboxdrv; then
330 if running vboxnetflt; then
331 if running vboxnetadp; then
332 echo "VirtualBox kernel modules (vboxdrv, vboxnetflt and vboxnetadp) are loaded."
333 else
334 echo "VirtualBox kernel modules (vboxdrv and vboxnetflt) are loaded."
335 fi
336 else
337 echo "VirtualBox kernel module is loaded."
338 fi
339 for i in $SHUTDOWN_USERS; do
340 # don't create the ipcd directory with wrong permissions!
341 if [ -d /tmp/.vbox-$i-ipc ]; then
342 export VBOX_IPC_SOCKETID="$i"
343 VMS=`$VBOXMANAGE --nologo list runningvms | sed -e 's/^".*".*{\(.*\)}/\1/' 2>/dev/null`
344 if [ -n "$VMS" ]; then
345 echo "The following VMs are currently running:"
346 for v in $VMS; do
347 echo " $v"
348 done
349 fi
350 fi
351 done
352 else
353 echo "VirtualBox kernel module is not loaded."
354 fi
355}
356
357case "$1" in
358start)
359 start
360 ;;
361stop)
362 stop_vms
363 stop
364 ;;
365stop_vms)
366 stop_vms
367 ;;
368restart)
369 stop && start
370 ;;
371force-reload)
372 stop
373 start
374 ;;
375setup)
376 setup
377 ;;
378status)
379 dmnstatus
380 ;;
381*)
382 echo "Usage: $0 {start|stop|stop_vms|restart|force-reload|status|setup}"
383 exit 1
384esac
385
386exit 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