divx118

vboxdrv

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