VirtualBox

source: vbox/trunk/src/VBox/Additions/linux/installer/vboxadd.sh@ 35265

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

Additions/linux/installer: make sure the udev rule gets installed before the kernel modules are first loaded

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 14.0 KB
Line 
1#! /bin/sh
2#
3# Linux Additions kernel module init script ($Revision: 35265 $)
4#
5
6#
7# Copyright (C) 2006-2010 Oracle Corporation
8#
9# This file is part of VirtualBox Open Source Edition (OSE), as
10# available from http://www.virtualbox.org. This file is free software;
11# you can redistribute it and/or modify it under the terms of the GNU
12# General Public License (GPL) as published by the Free Software
13# Foundation, in version 2 as it comes in the "COPYING" file of the
14# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16#
17
18
19# chkconfig: 357 30 70
20# description: VirtualBox Linux Additions kernel modules
21#
22### BEGIN INIT INFO
23# Provides: vboxadd
24# Required-Start:
25# Required-Stop:
26# Default-Start: 2 3 4 5
27# Default-Stop: 0 1 6
28# Description: VirtualBox Linux Additions kernel modules
29### END INIT INFO
30
31PATH=$PATH:/bin:/sbin:/usr/sbin
32PACKAGE=VBoxGuestAdditions
33BUILDVBOXGUEST=`/bin/ls /usr/src/vboxguest*/vboxguest/build_in_tmp 2>/dev/null|cut -d' ' -f1`
34BUILDVBOXSF=`/bin/ls /usr/src/vboxguest*/vboxsf/build_in_tmp 2>/dev/null|cut -d' ' -f1`
35BUILDVBOXVIDEO=`/bin/ls /usr/src/vboxguest*/vboxvideo/build_in_tmp 2>/dev/null|cut -d' ' -f1`
36DODKMS=`/bin/ls /usr/src/vboxguest*/do_dkms 2>/dev/null|cut -d' ' -f1`
37LOG="/var/log/vboxadd-install.log"
38MODPROBE=/sbin/modprobe
39
40if $MODPROBE -c | grep -q '^allow_unsupported_modules *0'; then
41 MODPROBE="$MODPROBE --allow-unsupported-modules"
42fi
43
44# Check architecture
45cpu=`uname -m`;
46case "$cpu" in
47 i[3456789]86|x86)
48 cpu="x86"
49 lib_path="/usr/lib"
50 ;;
51 x86_64|amd64)
52 cpu="amd64"
53 if test -d "/usr/lib64"; then
54 lib_path="/usr/lib64"
55 else
56 lib_path="/usr/lib"
57 fi
58 ;;
59esac
60
61if [ -f /etc/arch-release ]; then
62 system=arch
63elif [ -f /etc/redhat-release ]; then
64 system=redhat
65elif [ -f /etc/SuSE-release ]; then
66 system=suse
67elif [ -f /etc/gentoo-release ]; then
68 system=gentoo
69elif [ -f /etc/lfs-release -a -d /etc/rc.d/init.d ]; then
70 system=lfs
71else
72 system=other
73fi
74
75if [ "$system" = "arch" ]; then
76 USECOLOR=yes
77 . /etc/rc.d/functions
78 fail_msg() {
79 stat_fail
80 }
81
82 succ_msg() {
83 stat_done
84 }
85
86 begin() {
87 stat_busy "$1"
88 }
89fi
90
91if [ "$system" = "redhat" ]; then
92 . /etc/init.d/functions
93 fail_msg() {
94 echo_failure
95 echo
96 }
97 succ_msg() {
98 echo_success
99 echo
100 }
101 begin() {
102 echo -n "$1"
103 }
104fi
105
106if [ "$system" = "suse" ]; then
107 . /etc/rc.status
108 fail_msg() {
109 rc_failed 1
110 rc_status -v
111 }
112 succ_msg() {
113 rc_reset
114 rc_status -v
115 }
116 begin() {
117 echo -n "$1"
118 }
119fi
120
121if [ "$system" = "gentoo" ]; then
122 if [ -f /sbin/functions.sh ]; then
123 . /sbin/functions.sh
124 elif [ -f /etc/init.d/functions.sh ]; then
125 . /etc/init.d/functions.sh
126 fi
127 fail_msg() {
128 eend 1
129 }
130 succ_msg() {
131 eend $?
132 }
133 begin() {
134 ebegin $1
135 }
136 if [ "`which $0`" = "/sbin/rc" ]; then
137 shift
138 fi
139fi
140
141if [ "$system" = "lfs" ]; then
142 . /etc/rc.d/init.d/functions
143 fail_msg() {
144 echo_failure
145 }
146 succ_msg() {
147 echo_ok
148 }
149 begin() {
150 echo $1
151 }
152fi
153
154if [ "$system" = "other" ]; then
155 fail_msg() {
156 echo " ...fail!"
157 }
158 succ_msg() {
159 echo " ...done."
160 }
161 begin() {
162 echo -n $1
163 }
164fi
165
166dev=/dev/vboxguest
167userdev=/dev/vboxuser
168owner=vboxadd
169group=1
170
171test_sane_kernel_dir()
172{
173 KERN_VER=`uname -r`
174 KERN_DIR="/lib/modules/$KERN_VER/build"
175 if [ -d "$KERN_DIR" ]; then
176 KERN_REL=`make -sC $KERN_DIR --no-print-directory kernelrelease 2>/dev/null || true`
177 if [ -z "$KERN_REL" -o "x$KERN_REL" = "x$KERN_VER" ]; then
178 return 0
179 fi
180 fi
181 printf "\nThe headers for the current running kernel were not found. If the following\nmodule compilation fails then this could be the reason.\n"
182 if [ "$system" = "redhat" ]; then
183 printf "The missing package can be probably installed with\nyum install kernel-devel-$KERN_VER\n"
184 elif [ "$system" = "suse" ]; then
185 printf "The missing package can be probably installed with\nzypper install kernel-$KERN_VER\n"
186 elif [ "$system" = "debian" ]; then
187 printf "The missing package can be probably installed with\napt-get install linux-headers-$KERN_VER\n"
188 fi
189}
190
191fail()
192{
193 if [ "$system" = "gentoo" ]; then
194 eerror $1
195 exit 1
196 fi
197 fail_msg
198 echo "($1)"
199 exit 1
200}
201
202running_vboxguest()
203{
204 lsmod | grep -q "vboxguest[^_-]"
205}
206
207running_vboxadd()
208{
209 lsmod | grep -q "vboxadd[^_-]"
210}
211
212running_vboxsf()
213{
214 lsmod | grep -q "vboxsf[^_-]"
215}
216
217do_vboxguest_non_udev()
218{
219 if [ ! -c $dev ]; then
220 maj=`sed -n 's;\([0-9]\+\) vboxguest;\1;p' /proc/devices`
221 if [ ! -z "$maj" ]; then
222 min=0
223 else
224 min=`sed -n 's;\([0-9]\+\) vboxguest;\1;p' /proc/misc`
225 if [ ! -z "$min" ]; then
226 maj=10
227 fi
228 fi
229 test -z "$maj" && {
230 rmmod vboxguest 2>/dev/null
231 fail "Cannot locate the VirtualBox device"
232 }
233
234 mknod -m 0664 $dev c $maj $min || {
235 rmmod vboxguest 2>/dev/null
236 fail "Cannot create device $dev with major $maj and minor $min"
237 }
238 fi
239 chown $owner:$group $dev 2>/dev/null || {
240 rm -f $dev 2>/dev/null
241 rm -f $userdev 2>/dev/null
242 rmmod vboxguest 2>/dev/null
243 fail "Cannot change owner $owner:$group for device $dev"
244 }
245
246 if [ ! -c $userdev ]; then
247 maj=10
248 min=`sed -n 's;\([0-9]\+\) vboxuser;\1;p' /proc/misc`
249 if [ ! -z "$min" ]; then
250 mknod -m 0666 $userdev c $maj $min || {
251 rm -f $dev 2>/dev/null
252 rmmod vboxguest 2>/dev/null
253 fail "Cannot create device $userdev with major $maj and minor $min"
254 }
255 chown $owner:$group $userdev 2>/dev/null || {
256 rm -f $dev 2>/dev/null
257 rm -f $userdev 2>/dev/null
258 rmmod vboxguest 2>/dev/null
259 fail "Cannot change owner $owner:$group for device $userdev"
260 }
261 fi
262 fi
263}
264
265start()
266{
267 begin "Starting the VirtualBox Guest Additions ";
268 which udevd >/dev/null 2>&1 || no_udev=1
269 running_vboxguest || {
270 rm -f $dev || {
271 fail "Cannot remove $dev"
272 }
273
274 rm -f $userdev || {
275 fail "Cannot remove $userdev"
276 }
277
278 $MODPROBE vboxguest >/dev/null 2>&1 || {
279 fail "modprobe vboxguest failed"
280 }
281 case "$no_udev" in 1)
282 sleep .5;;
283 esac
284 }
285 case "$no_udev" in 1)
286 do_vboxguest_non_udev;;
287 esac
288
289 if [ -n "$BUILDVBOXSF" ]; then
290 running_vboxsf || {
291 $MODPROBE vboxsf > /dev/null 2>&1 || {
292 if dmesg | grep "vboxConnect failed" > /dev/null 2>&1; then
293 fail_msg
294 echo "Unable to start shared folders support. Make sure that your VirtualBox build"
295 echo "supports this feature."
296 exit 1
297 fi
298 fail "modprobe vboxsf failed"
299 }
300 }
301 fi
302
303 # Mount all shared folders from /etc/fstab. Normally this is done by some
304 # other startup script but this requires the vboxdrv kernel module loaded.
305 # This isn't necessary anymore as the vboxsf module is autoloaded.
306 # mount -a -t vboxsf
307
308 succ_msg
309 return 0
310}
311
312stop()
313{
314 begin "Stopping VirtualBox Additions ";
315 if ! umount -a -t vboxsf 2>/dev/null; then
316 fail "Cannot unmount vboxsf folders"
317 fi
318 if [ -n "$BUILDVBOXSF" ]; then
319 if running_vboxsf; then
320 rmmod vboxsf 2>/dev/null || fail "Cannot unload module vboxsf"
321 fi
322 fi
323 if running_vboxguest; then
324 rmmod vboxguest 2>/dev/null || fail "Cannot unload module vboxguest"
325 rm -f $userdev || fail "Cannot unlink $userdev"
326 rm -f $dev || fail "Cannot unlink $dev"
327 fi
328 succ_msg
329 return 0
330}
331
332restart()
333{
334 stop && start
335 return 0
336}
337
338# Remove any existing VirtualBox guest kernel modules from the disk, but not
339# from the kernel as they may still be in use
340cleanup_modules()
341{
342 begin "Removing existing VirtualBox DKMS kernel modules"
343 $DODKMS uninstall > $LOG
344 succ_msg
345 begin "Removing existing VirtualBox non-DKMS kernel modules"
346 find /lib/modules -name vboxadd\* | xargs rm 2>/dev/null
347 find /lib/modules -name vboxguest\* | xargs rm 2>/dev/null
348 find /lib/modules -name vboxvfs\* | xargs rm 2>/dev/null
349 find /lib/modules -name vboxsf\* | xargs rm 2>/dev/null
350 find /lib/modules -name vboxvideo\* | xargs rm 2>/dev/null
351 succ_msg
352}
353
354# Build and install the VirtualBox guest kernel modules
355setup_modules()
356{
357 # don't stop the old modules here -- they might be in use
358 cleanup_modules
359 begin "Building the VirtualBox Guest Additions kernel modules"
360
361 # Short cut out if a dkms build succeeds
362 if $DODKMS install >> $LOG 2>&1; then
363 return 0
364 fi
365
366 test_sane_kernel_dir
367
368 if ! sh /usr/share/$PACKAGE/test/build_in_tmp \
369 --no-print-directory >> $LOG 2>&1; then
370 fail_msg
371 printf "Your system does not seem to be set up to build kernel modules.\nLook at $LOG to find out what went wrong.\nOnce you have corrected it, you can run\n\n /etc/init.d/vboxadd setup\n\nto build them.\n\n"
372 return 1
373 else
374 if ! sh /usr/share/$PACKAGE/test_drm/build_in_tmp \
375 --no-print-directory >> $LOG 2>&1; then
376 printf "\nYour guest system does not seem to have sufficient OpenGL support to enable\naccelerated 3D effects (this requires Linux 2.6.27 or later in the guest\nsystem). This Guest Additions feature will be disabled.\n\n"
377 BUILDVBOXVIDEO=""
378 fi
379 fi
380 echo
381 if [ -n "$BUILDVBOXGUEST" ]; then
382 begin "Building the main Guest Additions module"
383 if ! $BUILDVBOXGUEST \
384 --save-module-symvers /tmp/vboxguest-Module.symvers \
385 --no-print-directory install >> $LOG 2>&1; then
386 fail "Look at $LOG to find out what went wrong"
387 fi
388 succ_msg
389 fi
390 if [ -n "$BUILDVBOXSF" ]; then
391 begin "Building the shared folder support module"
392 if ! $BUILDVBOXSF \
393 --use-module-symvers /tmp/vboxguest-Module.symvers \
394 --no-print-directory install >> $LOG 2>&1; then
395 fail "Look at $LOG to find out what went wrong"
396 fi
397 succ_msg
398 fi
399 if [ -n "$BUILDVBOXVIDEO" ]; then
400 begin "Building the OpenGL support module"
401 if ! $BUILDVBOXVIDEO \
402 --use-module-symvers /tmp/vboxguest-Module.symvers \
403 --no-print-directory install >> $LOG 2>&1; then
404 fail "Look at $LOG to find out what went wrong"
405 fi
406 succ_msg
407 fi
408 depmod
409 return 0
410}
411
412# Do non-kernel bits needed for the kernel modules to work properly (user
413# creation, udev, mount helper...)
414extra_setup()
415{
416 begin "Doing non-kernel setup of the Guest Additions"
417 echo "Creating user for the Guest Additions." >> $LOG
418 # This is the LSB version of useradd and should work on recent
419 # distributions
420 useradd -d /var/run/vboxadd -g 1 -r -s /bin/false vboxadd >/dev/null 2>&1
421 # And for the others, we choose a UID ourselves
422 useradd -d /var/run/vboxadd -g 1 -u 501 -o -s /bin/false vboxadd >/dev/null 2>&1
423
424 # Add a group "vboxsf" for Shared Folders access
425 # All users which want to access the auto-mounted Shared Folders have to
426 # be added to this group.
427 groupadd -f vboxsf >/dev/null 2>&1
428
429 # Create udev description file
430 if [ -d /etc/udev/rules.d ]; then
431 echo "Creating udev rule for the Guest Additions kernel module." >> $LOG
432 udev_call=""
433 udev_app=`which udevadm 2> /dev/null`
434 if [ $? -eq 0 ]; then
435 udev_call="${udev_app} version 2> /dev/null"
436 else
437 udev_app=`which udevinfo 2> /dev/null`
438 if [ $? -eq 0 ]; then
439 udev_call="${udev_app} -V 2> /dev/null"
440 fi
441 fi
442 udev_fix="="
443 if [ "${udev_call}" != "" ]; then
444 udev_out=`${udev_call}`
445 udev_ver=`expr "$udev_out" : '[^0-9]*\([0-9]*\)'`
446 if [ "$udev_ver" = "" -o "$udev_ver" -lt 55 ]; then
447 udev_fix=""
448 fi
449 fi
450 ## @todo 60-vboxadd.rules -> 60-vboxguest.rules ?
451 echo "KERNEL=${udev_fix}\"vboxguest\", NAME=\"vboxguest\", OWNER=\"vboxadd\", MODE=\"0660\"" > /etc/udev/rules.d/60-vboxadd.rules
452 echo "KERNEL=${udev_fix}\"vboxuser\", NAME=\"vboxuser\", OWNER=\"vboxadd\", MODE=\"0666\"" >> /etc/udev/rules.d/60-vboxadd.rules
453 fi
454
455 # Put mount.vboxsf in the right place
456 ln -sf "$lib_path/$PACKAGE/mount.vboxsf" /sbin
457 # At least Fedora 11 and Fedora 12 demand on the correct security context when
458 # executing this command from service scripts. Shouldn't hurt for other distributions.
459 chcon -u system_u -t mount_exec_t "$lib_path/$PACKAGE/mount.vboxsf" > /dev/null 2>&1
460
461 succ_msg
462}
463
464# setup_script
465setup()
466{
467 setup_modules
468 mod_succ="$?"
469 extra_setup
470 if [ "$mod_succ" -eq "0" ]; then
471 if running_vboxguest || running_vboxadd; then
472 printf "You should restart your guest to make sure the new modules are actually used\n\n"
473 else
474 start
475 fi
476 fi
477}
478
479# cleanup_script
480cleanup()
481{
482 # Delete old versions of VBox modules.
483 cleanup_modules
484 depmod
485
486 # Remove old module sources
487 rm -rf /usr/src/vboxadd-* /usr/src/vboxguest-* /usr/src/vboxvfs-* /usr/src/vboxsf-* /usr/src/vboxvideo-*
488
489 # Remove other files
490 rm /sbin/mount.vboxsf 2>/dev/null
491 rm /etc/udev/rules.d/60-vboxadd.rules 2>/dev/null
492}
493
494dmnstatus()
495{
496 if running_vboxguest; then
497 echo "The VirtualBox Additions are currently running."
498 else
499 echo "The VirtualBox Additions are not currently running."
500 fi
501}
502
503case "$1" in
504start)
505 start
506 ;;
507stop)
508 stop
509 ;;
510restart)
511 restart
512 ;;
513setup)
514 setup
515 ;;
516cleanup)
517 cleanup
518 ;;
519status)
520 dmnstatus
521 ;;
522*)
523 echo "Usage: $0 {start|stop|restart|status}"
524 exit 1
525esac
526
527exit
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette