vboxdrv.sh.in revision 31620f279590f4ccc82e9e8ca1d81961095e9404
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync#! /bin/sh
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# Oracle VM VirtualBox
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# Linux kernel module init script
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync#
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# Copyright (C) 2006-2010 Oracle Corporation
304e26e9a9c1422dbc299ed139eceacca271a9ddvboxsync#
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# This file is part of VirtualBox Open Source Edition (OSE), as
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# available from http://www.virtualbox.org. This file is free software;
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# you can redistribute it and/or modify it under the terms of the GNU
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# General Public License (GPL) as published by the Free Software
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# Foundation, in version 2 as it comes in the "COPYING" file of the
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync#
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# chkconfig: 35 30 70
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# description: VirtualBox Linux kernel module
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync#
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync### BEGIN INIT INFO
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# Provides: vboxdrv
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# Required-Start: $syslog
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# Required-Stop:
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# Default-Start: 2 3 4 5
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# Default-Stop: 1
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync# Short-Description: VirtualBox Linux kernel module
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync### END INIT INFO
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync
5bf0ee311caa414469f26237ff607cb1b3591508vboxsyncPATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
5bf0ee311caa414469f26237ff607cb1b3591508vboxsyncDEVICE=/dev/vboxdrv
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsyncGROUPNAME=vboxusers
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsyncLOG="/var/log/vbox-install.log"
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsyncNOLSB=%NOLSB%
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsyncDEBIAN=%DEBIAN%
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsyncMODPROBE=/sbin/modprobe
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync
5bf0ee311caa414469f26237ff607cb1b3591508vboxsyncif $MODPROBE -c | grep -q '^allow_unsupported_modules *0'; then
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync MODPROBE="$MODPROBE --allow-unsupported-modules"
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsyncfi
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync[ -f /lib/lsb/init-functions ] || NOLSB=yes
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync[ -f /etc/vbox/vbox.cfg ] && . /etc/vbox/vbox.cfg
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsyncif [ -n "$INSTALL_DIR" ]; then
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync VBOXMANAGE="$INSTALL_DIR/VBoxManage"
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync DODKMS="$INSTALL_DIR/src/vboxhost/do_dkms"
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync BUILDVBOXDRV="$INSTALL_DIR/src/vboxhost/vboxdrv/build_in_tmp"
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync BUILDVBOXNETFLT="$INSTALL_DIR/src/vboxhost/vboxnetflt/build_in_tmp"
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync BUILDVBOXNETADP="$INSTALL_DIR/src/vboxhost/vboxnetadp/build_in_tmp"
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsyncelse
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync VBOXMANAGE="/usr/lib/%PACKAGE%/VBoxManage"
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync DODKMS="/usr/share/%PACKAGE%/src/vboxhost/do_dkms"
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync BUILDVBOXDRV="/usr/share/%PACKAGE%/src/vboxhost/vboxdrv/build_in_tmp"
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync BUILDVBOXNETFLT="/usr/share/%PACKAGE%/src/vboxhost/vboxnetflt/build_in_tmp"
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync BUILDVBOXNETADP="/usr/share/%PACKAGE%/src/vboxhost/vboxnetadp/build_in_tmp"
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsyncfi
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync# silently exit if the package was uninstalled but not purged,
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync# applies to Debian packages only
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync[ -z "$DEBIAN" -o -x $VBOXMANAGE -a -x $BUILDVBOXDRV ] || exit 0
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsyncif [ -n "$NOLSB" ]; then
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync if [ -f /etc/redhat-release ]; then
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync system=redhat
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync elif [ -f /etc/SuSE-release ]; then
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync system=suse
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync elif [ -f /etc/gentoo-release ]; then
6f82db701c69ae6925eb7e8bf1dfe25c9f951bddvboxsync system=gentoo
5bf0ee311caa414469f26237ff607cb1b3591508vboxsync fi
5bf0ee311caa414469f26237ff607cb1b3591508vboxsyncfi
[ -r /etc/default/%PACKAGE% ] && . /etc/default/%PACKAGE%
if [ -z "$NOLSB" ]; then
. /lib/lsb/init-functions
fail_msg() {
echo ""
log_failure_msg "$1"
}
succ_msg() {
log_success_msg " done."
}
begin_msg() {
log_daemon_msg "$@"
}
else
if [ "$system" = "redhat" ]; then
. /etc/init.d/functions
fail_msg() {
echo -n " "
echo_failure
echo
echo " ($1)"
}
succ_msg() {
echo -n " "
echo_success
echo
}
elif [ "$system" = "suse" ]; then
. /etc/rc.status
fail_msg() {
rc_failed 1
rc_status -v
echo " ($1)"
}
succ_msg() {
rc_reset
rc_status -v
}
elif [ "$system" = "gentoo" ]; then
if [ -f /sbin/functions.sh ]; then
. /sbin/functions.sh
elif [ -f /etc/init.d/functions.sh ]; then
. /etc/init.d/functions.sh
fi
fail_msg() {
eerror "$1"
}
succ_msg() {
eend "$?"
}
begin_msg() {
ebegin "$1"
}
if [ "`which $0`" = "/sbin/rc" ]; then
shift
fi
else
fail_msg() {
echo " ...failed!"
echo " ($1)"
}
succ_msg() {
echo " ...done."
}
fi
if [ "$system" != "gentoo" ]; then
begin_msg() {
[ -z "${1:-}" ] && return 1
if [ -z "${2:-}" ]; then
echo -n "$1"
else
echo -n "$1: $2"
fi
}
fi
fi
failure()
{
fail_msg "$1"
exit 0
}
running()
{
lsmod | grep -q "$1[^_-]"
}
start()
{
begin_msg "Starting VirtualBox kernel modules"
if ! running vboxdrv; then
if ! rm -f $DEVICE; then
failure "Cannot remove $DEVICE"
fi
# HACK: disable the hardware performance counter framework
if [ -e /proc/sys/kernel/perf_counter_paranoid ]; then
echo 2 > /proc/sys/kernel/perf_counter_paranoid
fi
if ! $MODPROBE vboxdrv > /dev/null 2>&1; then
failure "modprobe vboxdrv failed. Please use 'dmesg' to find out why"
fi
sleep .2
fi
# ensure the character special exists
if [ ! -c $DEVICE ]; then
MAJOR=`sed -n 's;\([0-9]\+\) vboxdrv;\1;p' /proc/devices`
if [ ! -z "$MAJOR" ]; then
MINOR=0
else
MINOR=`sed -n 's;\([0-9]\+\) vboxdrv;\1;p' /proc/misc`
if [ ! -z "$MINOR" ]; then
MAJOR=10
fi
fi
if [ -z "$MAJOR" ]; then
rmmod vboxdrv 2>/dev/null
failure "Cannot locate the VirtualBox device"
fi
if ! mknod -m 0660 $DEVICE c $MAJOR $MINOR 2>/dev/null; then
rmmod vboxdrv 2>/dev/null
failure "Cannot create device $DEVICE with major $MAJOR and minor $MINOR"
fi
fi
# ensure permissions
if ! chown :$GROUPNAME $DEVICE 2>/dev/null; then
rmmod vboxnetadp 2>/dev/null
rmmod vboxnetflt 2>/dev/null
rmmod vboxdrv 2>/dev/null
failure "Cannot change owner $GROUPNAME for device $DEVICE"
fi
if ! $MODPROBE vboxnetflt > /dev/null 2>&1; then
failure "modprobe vboxnetflt failed. Please use 'dmesg' to find out why"
fi
if ! $MODPROBE vboxnetadp > /dev/null 2>&1; then
failure "modprobe vboxnetadp failed. Please use 'dmesg' to find out why"
fi
succ_msg
}
stop()
{
begin_msg "Stopping VirtualBox kernel modules"
if running vboxnetadp; then
if ! rmmod vboxnetadp 2>/dev/null; then
failure "Cannot unload module vboxnetadp"
fi
fi
if running vboxdrv; then
if running vboxnetflt; then
if ! rmmod vboxnetflt 2>/dev/null; then
failure "Cannot unload module vboxnetflt"
fi
fi
if ! rmmod vboxdrv 2>/dev/null; then
failure "Cannot unload module vboxdrv"
fi
if ! rm -f $DEVICE; then
failure "Cannot unlink $DEVICE"
fi
fi
succ_msg
}
# enter the following variables in /etc/default/%PACKAGE%:
# SHUTDOWN_USERS="foo bar"
# check for running VMs of user foo and user bar
# SHUTDOWN=poweroff
# SHUTDOWN=acpibutton
# SHUTDOWN=savestate
# select one of these shutdown methods for running VMs
stop_vms()
{
wait=0
for i in $SHUTDOWN_USERS; do
# don't create the ipcd directory with wrong permissions!
if [ -d /tmp/.vbox-$i-ipc ]; then
export VBOX_IPC_SOCKETID="$i"
VMS=`$VBOXMANAGE --nologo list runningvms | sed -e 's/^".*".*{\(.*\)}/\1/' 2>/dev/null`
if [ -n "$VMS" ]; then
if [ "$SHUTDOWN" = "poweroff" ]; then
begin_msg "Powering off remaining VMs"
for v in $VMS; do
$VBOXMANAGE --nologo controlvm $v poweroff
done
succ_msg
elif [ "$SHUTDOWN" = "acpibutton" ]; then
begin_msg "Sending ACPI power button event to remaining VMs"
for v in $VMS; do
$VBOXMANAGE --nologo controlvm $v acpipowerbutton
wait=30
done
succ_msg
elif [ "$SHUTDOWN" = "savestate" ]; then
begin_msg "Saving state of remaining VMs"
for v in $VMS; do
$VBOXMANAGE --nologo controlvm $v savestate
done
succ_msg
fi
fi
fi
done
# wait for some seconds when doing ACPI shutdown
if [ "$wait" -ne 0 ]; then
begin_msg "Waiting for $wait seconds for VM shutdown"
sleep $wait
succ_msg
fi
}
# setup_script
setup()
{
stop
begin_msg "Uninstalling old VirtualBox DKMS kernel modules"
$DODKMS uninstall > $LOG
succ_msg
if find /lib/modules/`uname -r` -name "vboxnetadp\.*" 2>/dev/null|grep -q vboxnetadp; then
begin_msg "Removing old VirtualBox netadp kernel module"
find /lib/modules/`uname -r` -name "vboxnetadp\.*" 2>/dev/null|xargs rm -f 2>/dev/null
succ_msg
fi
if find /lib/modules/`uname -r` -name "vboxnetflt\.*" 2>/dev/null|grep -q vboxnetflt; then
begin_msg "Removing old VirtualBox netflt kernel module"
find /lib/modules/`uname -r` -name "vboxnetflt\.*" 2>/dev/null|xargs rm -f 2>/dev/null
succ_msg
fi
if find /lib/modules/`uname -r` -name "vboxdrv\.*" 2>/dev/null|grep -q vboxdrv; then
begin_msg "Removing old VirtualBox kernel module"
find /lib/modules/`uname -r` -name "vboxdrv\.*" 2>/dev/null|xargs rm -f 2>/dev/null
succ_msg
fi
begin_msg "Trying to register the VirtualBox kernel modules using DKMS"
if ! $DODKMS install >> $LOG; then
fail_msg "Failed, trying without DKMS"
begin_msg "Recompiling VirtualBox kernel modules"
if ! $BUILDVBOXDRV \
--save-module-symvers /tmp/vboxdrv-Module.symvers \
--no-print-directory install >> $LOG 2>&1; then
failure "Look at $LOG to find out what went wrong"
fi
if ! $BUILDVBOXNETFLT \
--use-module-symvers /tmp/vboxdrv-Module.symvers \
--no-print-directory install >> $LOG 2>&1; then
failure "Look at $LOG to find out what went wrong"
fi
if ! $BUILDVBOXNETADP \
--use-module-symvers /tmp/vboxdrv-Module.symvers \
--no-print-directory install >> $LOG 2>&1; then
failure "Look at $LOG to find out what went wrong"
fi
fi
rm -f /etc/vbox/module_not_compiled
succ_msg
start
}
dmnstatus()
{
if running vboxdrv; then
if running vboxnetflt; then
if running vboxnetadp; then
echo "VirtualBox kernel modules (vboxdrv, vboxnetflt and vboxnetadp) are loaded."
else
echo "VirtualBox kernel modules (vboxdrv and vboxnetflt) are loaded."
fi
else
echo "VirtualBox kernel module is loaded."
fi
for i in $SHUTDOWN_USERS; do
# don't create the ipcd directory with wrong permissions!
if [ -d /tmp/.vbox-$i-ipc ]; then
export VBOX_IPC_SOCKETID="$i"
VMS=`$VBOXMANAGE --nologo list runningvms | sed -e 's/^".*".*{\(.*\)}/\1/' 2>/dev/null`
if [ -n "$VMS" ]; then
echo "The following VMs are currently running:"
for v in $VMS; do
echo " $v"
done
fi
fi
done
else
echo "VirtualBox kernel module is not loaded."
fi
}
case "$1" in
start)
start
;;
stop)
stop_vms
stop
;;
stop_vms)
stop_vms
;;
restart)
stop && start
;;
force-reload)
stop
start
;;
setup)
setup
;;
status)
dmnstatus
;;
*)
echo "Usage: $0 {start|stop|stop_vms|restart|force-reload|status|setup}"
exit 1
esac
exit 0