Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #! /bin/sh
- # Oracle VM VirtualBox
- # Linux kernel module init script
- #
- # Copyright (C) 2006-2012 Oracle Corporation
- #
- # This file is part of VirtualBox Open Source Edition (OSE), as
- # available from http://www.virtualbox.org. This file is free software;
- # you can redistribute it and/or modify it under the terms of the GNU
- # General Public License (GPL) as published by the Free Software
- # Foundation, in version 2 as it comes in the "COPYING" file of the
- # VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- # hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- #
- # chkconfig: 35 20 80
- # description: VirtualBox Linux kernel module
- #
- ### BEGIN INIT INFO
- # Provides: vboxdrv
- # Required-Start: $syslog
- # Required-Stop:
- # Default-Start: 2 3 4 5
- # Default-Stop: 0 1 6
- # Short-Description: VirtualBox Linux kernel module
- ### END INIT INFO
- PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
- DEVICE=/dev/vboxdrv
- LOG="/var/log/vbox-install.log"
- NOLSB=
- DEBIAN=yes
- VERSION=4.2.18
- MODPROBE=/sbin/modprobe
- if $MODPROBE -c | grep -q '^allow_unsupported_modules *0'; then
- MODPROBE="$MODPROBE --allow-unsupported-modules"
- fi
- [ -f /lib/lsb/init-functions ] || NOLSB=yes
- [ -f /etc/vbox/vbox.cfg ] && . /etc/vbox/vbox.cfg
- export BUILD_TYPE
- export USERNAME
- export USER=$USERNAME
- if [ -n "$INSTALL_DIR" ]; then
- VBOXMANAGE="$INSTALL_DIR/VBoxManage"
- MODULE_SRC="$INSTALL_DIR/src/vboxhost"
- else
- VBOXMANAGE="/usr/lib/virtualbox/VBoxManage"
- MODULE_SRC="/usr/share/virtualbox/src/vboxhost"
- fi
- BUILDINTMP="$MODULE_SRC/build_in_tmp"
- DODKMS="$MODULE_SRC/do_dkms"
- # silently exit if the package was uninstalled but not purged,
- # applies to Debian packages only
- [ -z "$DEBIAN" -o -x $VBOXMANAGE -a -x $BUILDINTMP ] || exit 0
- if [ -n "$NOLSB" ]; then
- if [ -f /etc/redhat-release ]; then
- system=redhat
- elif [ -f /etc/SuSE-release ]; then
- system=suse
- elif [ -f /etc/gentoo-release ]; then
- system=gentoo
- fi
- fi
- [ -r /etc/default/virtualbox ] && . /etc/default/virtualbox
- if [ -z "$NOLSB" ]; then
- . /lib/lsb/init-functions
- fail_msg() {
- echo ""
- log_failure_msg "$1"
- }
- succ_msg() {
- log_end_msg 0
- }
- 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 [ -d /proc/xen ]; then
- failure "Running VirtualBox in a Xen environment is not supported"
- fi
- if ! running vboxdrv; then
- if ! rm -f $DEVICE; then
- failure "Cannot remove $DEVICE"
- 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 :root $DEVICE 2>/dev/null; then
- rmmod vboxpci 2>/dev/null
- rmmod vboxnetadp 2>/dev/null
- rmmod vboxnetflt 2>/dev/null
- rmmod vboxdrv 2>/dev/null
- failure "Cannot change group root 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
- if ! $MODPROBE vboxpci > /dev/null 2>&1; then
- failure "modprobe vboxpci failed. Please use 'dmesg' to find out why"
- fi
- # Create the /dev/vboxusb directory if the host supports that method
- # of USB access. The USB code checks for the existance of that path.
- if grep -q usb_device /proc/devices; then
- mkdir -p -m 0750 /dev/vboxusb 2>/dev/null
- chown root:vboxusers /dev/vboxusb 2>/dev/null
- fi
- succ_msg
- }
- stop()
- {
- begin_msg "Stopping VirtualBox kernel modules"
- if running vboxpci; then
- if ! rmmod vboxpci 2>/dev/null; then
- failure "Cannot unload module vboxpci"
- fi
- fi
- 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/virtualbox:
- # 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
- DKMS=`which dkms 2>/dev/null`
- if [ -n "$DKMS" ]; then
- begin_msg "Uninstalling old VirtualBox DKMS kernel modules"
- $DODKMS uninstall vboxhost vboxdrv vboxnetflt vboxnetadp > $LOG
- succ_msg
- fi
- if find /lib/modules/`uname -r` -name "vboxpci\.*" 2>/dev/null|grep -q vboxpci; then
- begin_msg "Removing old VirtualBox pci kernel module"
- find /lib/modules/`uname -r` -name "vboxpci\.*" 2>/dev/null|xargs rm -f 2>/dev/null
- succ_msg
- fi
- 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
- if [ -n "$DKMS" ]; then
- begin_msg "Trying to register the VirtualBox kernel modules using DKMS"
- if ! $DODKMS install vboxhost $VERSION >> $LOG; then
- fail_msg "Failed, trying without DKMS"
- DKMS=""
- fi
- fi
- if [ -z "$DKMS" ]; then
- begin_msg "Recompiling VirtualBox kernel modules"
- if ! $BUILDINTMP \
- --save-module-symvers /tmp/vboxdrv-Module.symvers \
- --module-source "$MODULE_SRC/vboxdrv" \
- --no-print-directory install >> $LOG 2>&1; then
- failure "Look at $LOG to find out what went wrong"
- fi
- if ! $BUILDINTMP \
- --use-module-symvers /tmp/vboxdrv-Module.symvers \
- --module-source "$MODULE_SRC/vboxnetflt" \
- --no-print-directory install >> $LOG 2>&1; then
- failure "Look at $LOG to find out what went wrong"
- fi
- if ! $BUILDINTMP \
- --use-module-symvers /tmp/vboxdrv-Module.symvers \
- --module-source "$MODULE_SRC/vboxnetadp" \
- --no-print-directory install >> $LOG 2>&1; then
- failure "Look at $LOG to find out what went wrong"
- fi
- if ! $BUILDINTMP \
- --use-module-symvers /tmp/vboxdrv-Module.symvers \
- --module-source "$MODULE_SRC/vboxpci" \
- --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
- str="vboxdrv"
- if running vboxnetflt; then
- str="$str, vboxnetflt"
- if running vboxnetadp; then
- str="$str, vboxnetadp"
- fi
- fi
- if running vboxpci; then
- str="$str, vboxpci"
- fi
- echo "VirtualBox kernel modules ($str) are loaded."
- 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
Advertisement
Add Comment
Please, Sign In to add comment