VirtualBox

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

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

Additions/linux/installer: really finish the rest of the installation if building the kernel modules fails

  • Property svn:eol-style set to LF
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 14.6 KB
Line 
1#! /bin/sh
2#
3# Linux Additions kernel module init script ($Revision: 38542 $)
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_for_gcc_and_make()
172{
173 which make > /dev/null 2>&1 || printf "\nThe make utility was not found. If the following module compilation fails then\nthis could be the reason and you should try installing it.\n"
174 which gcc > /dev/null 2>&1 || printf "\nThe gcc utility was not found. If the following module compilation fails then\nthis could be the reason and you should try installing it.\n"
175}
176
177test_sane_kernel_dir()
178{
179 KERN_VER=`uname -r`
180 KERN_DIR="/lib/modules/$KERN_VER/build"
181 if [ -d "$KERN_DIR" ]; then
182 KERN_REL=`make -sC $KERN_DIR --no-print-directory kernelrelease 2>/dev/null || true`
183 if [ -z "$KERN_REL" -o "x$KERN_REL" = "x$KERN_VER" ]; then
184 return 0
185 fi
186 fi
187 printf "\nThe headers for the current running kernel were not found. If the following\nmodule compilation fails then this could be the reason.\n"
188 if [ "$system" = "redhat" ]; then
189 printf "The missing package can be probably installed with\nyum install kernel-devel-$KERN_VER\n"
190 elif [ "$system" = "suse" ]; then
191 KERN_VER_SUSE=`echo "$KERN_VER" | sed 's/.*-\([^-]*\)/\1/g'`
192 KERN_VER_BASE=`echo "$KERN_VER" | sed 's/\(.*\)-[^-]*/\1/g'`
193 printf "The missing package can be probably installed with\nzypper install kernel-$KERN_VER_SUSE-devel-$KERN_VER_BASE\n"
194 elif [ "$system" = "debian" ]; then
195 printf "The missing package can be probably installed with\napt-get install linux-headers-$KERN_VER\n"
196 fi
197}
198
199show_error()
200{
201 if [ "$system" = "gentoo" ]; then
202 eerror $1
203 fi
204 fail_msg
205 echo "($1)"
206}
207
208fail()
209{
210 show_error "$1"
211 exit 1
212}
213
214running_vboxguest()
215{
216 lsmod | grep -q "vboxguest[^_-]"
217}
218
219running_vboxadd()
220{
221 lsmod | grep -q "vboxadd[^_-]"
222}
223
224running_vboxsf()
225{
226 lsmod | grep -q "vboxsf[^_-]"
227}
228
229do_vboxguest_non_udev()
230{
231 if [ ! -c $dev ]; then
232 maj=`sed -n 's;\([0-9]\+\) vboxguest;\1;p' /proc/devices`
233 if [ ! -z "$maj" ]; then
234 min=0
235 else
236 min=`sed -n 's;\([0-9]\+\) vboxguest;\1;p' /proc/misc`
237 if [ ! -z "$min" ]; then
238 maj=10
239 fi
240 fi
241 test -z "$maj" && {
242 rmmod vboxguest 2>/dev/null
243 fail "Cannot locate the VirtualBox device"
244 }
245
246 mknod -m 0664 $dev c $maj $min || {
247 rmmod vboxguest 2>/dev/null
248 fail "Cannot create device $dev with major $maj and minor $min"
249 }
250 fi
251 chown $owner:$group $dev 2>/dev/null || {
252 rm -f $dev 2>/dev/null
253 rm -f $userdev 2>/dev/null
254 rmmod vboxguest 2>/dev/null
255 fail "Cannot change owner $owner:$group for device $dev"
256 }
257
258 if [ ! -c $userdev ]; then
259 maj=10
260 min=`sed -n 's;\([0-9]\+\) vboxuser;\1;p' /proc/misc`
261 if [ ! -z "$min" ]; then
262 mknod -m 0666 $userdev c $maj $min || {
263 rm -f $dev 2>/dev/null
264 rmmod vboxguest 2>/dev/null
265 fail "Cannot create device $userdev with major $maj and minor $min"
266 }
267 chown $owner:$group $userdev 2>/dev/null || {
268 rm -f $dev 2>/dev/null
269 rm -f $userdev 2>/dev/null
270 rmmod vboxguest 2>/dev/null
271 fail "Cannot change owner $owner:$group for device $userdev"
272 }
273 fi
274 fi
275}
276
277start()
278{
279 begin "Starting the VirtualBox Guest Additions ";
280 uname -r | grep -q '^2\.6' 2>/dev/null &&
281 ps -A -o comm | grep -q '/*udevd$' 2>/dev/null ||
282 no_udev=1
283 running_vboxguest || {
284 rm -f $dev || {
285 fail "Cannot remove $dev"
286 }
287
288 rm -f $userdev || {
289 fail "Cannot remove $userdev"
290 }
291
292 $MODPROBE vboxguest >/dev/null 2>&1 || {
293 fail "modprobe vboxguest failed"
294 }
295 case "$no_udev" in 1)
296 sleep .5;;
297 esac
298 }
299 case "$no_udev" in 1)
300 do_vboxguest_non_udev;;
301 esac
302
303 if [ -n "$BUILDVBOXSF" ]; then
304 running_vboxsf || {
305 $MODPROBE vboxsf > /dev/null 2>&1 || {
306 if dmesg | grep "vboxConnect failed" > /dev/null 2>&1; then
307 fail_msg
308 echo "Unable to start shared folders support. Make sure that your VirtualBox build"
309 echo "supports this feature."
310 exit 1
311 fi
312 fail "modprobe vboxsf failed"
313 }
314 }
315 fi
316
317 # Mount all shared folders from /etc/fstab. Normally this is done by some
318 # other startup script but this requires the vboxdrv kernel module loaded.
319 # This isn't necessary anymore as the vboxsf module is autoloaded.
320 # mount -a -t vboxsf
321
322 succ_msg
323 return 0
324}
325
326stop()
327{
328 begin "Stopping VirtualBox Additions ";
329 if ! umount -a -t vboxsf 2>/dev/null; then
330 fail "Cannot unmount vboxsf folders"
331 fi
332 if [ -n "$BUILDVBOXSF" ]; then
333 if running_vboxsf; then
334 rmmod vboxsf 2>/dev/null || fail "Cannot unload module vboxsf"
335 fi
336 fi
337 if running_vboxguest; then
338 rmmod vboxguest 2>/dev/null || fail "Cannot unload module vboxguest"
339 rm -f $userdev || fail "Cannot unlink $userdev"
340 rm -f $dev || fail "Cannot unlink $dev"
341 fi
342 succ_msg
343 return 0
344}
345
346restart()
347{
348 stop && start
349 return 0
350}
351
352# Remove any existing VirtualBox guest kernel modules from the disk, but not
353# from the kernel as they may still be in use
354cleanup_modules()
355{
356 begin "Removing existing VirtualBox DKMS kernel modules"
357 $DODKMS uninstall > $LOG
358 succ_msg
359 begin "Removing existing VirtualBox non-DKMS kernel modules"
360 find /lib/modules -name vboxadd\* | xargs rm 2>/dev/null
361 find /lib/modules -name vboxguest\* | xargs rm 2>/dev/null
362 find /lib/modules -name vboxvfs\* | xargs rm 2>/dev/null
363 find /lib/modules -name vboxsf\* | xargs rm 2>/dev/null
364 find /lib/modules -name vboxvideo\* | xargs rm 2>/dev/null
365 succ_msg
366}
367
368# Build and install the VirtualBox guest kernel modules
369setup_modules()
370{
371 # don't stop the old modules here -- they might be in use
372 cleanup_modules
373 begin "Building the VirtualBox Guest Additions kernel modules"
374
375 # Short cut out if a dkms build succeeds
376 if $DODKMS install >> $LOG 2>&1; then
377 succ_msg
378 return 0
379 fi
380
381 test_for_gcc_and_make
382 test_sane_kernel_dir
383
384 echo
385 if expr `uname -r` '<' '2.6.27' > /dev/null; then
386 echo "Not building the VirtualBox advanced graphics driver as this Linux version is"
387 echo "too old to use it."
388 BUILDVBOXVIDEO=
389 fi
390 if [ -n "$BUILDVBOXGUEST" ]; then
391 begin "Building the main Guest Additions module"
392 if ! $BUILDVBOXGUEST \
393 --save-module-symvers /tmp/vboxguest-Module.symvers \
394 --no-print-directory install >> $LOG 2>&1; then
395 show_error "Look at $LOG to find out what went wrong"
396 return 1
397 fi
398 succ_msg
399 fi
400 if [ -n "$BUILDVBOXSF" ]; then
401 begin "Building the shared folder support module"
402 if ! $BUILDVBOXSF \
403 --use-module-symvers /tmp/vboxguest-Module.symvers \
404 --no-print-directory install >> $LOG 2>&1; then
405 show_error "Look at $LOG to find out what went wrong"
406 return 1
407 fi
408 succ_msg
409 fi
410 if [ -n "$BUILDVBOXVIDEO" ]; then
411 begin "Building the OpenGL support module"
412 if ! $BUILDVBOXVIDEO \
413 --use-module-symvers /tmp/vboxguest-Module.symvers \
414 --no-print-directory install >> $LOG 2>&1; then
415 show_error "Look at $LOG to find out what went wrong"
416 return 1
417 fi
418 succ_msg
419 fi
420 depmod
421 return 0
422}
423
424# Do non-kernel bits needed for the kernel modules to work properly (user
425# creation, udev, mount helper...)
426extra_setup()
427{
428 begin "Doing non-kernel setup of the Guest Additions"
429 echo "Creating user for the Guest Additions." >> $LOG
430 # This is the LSB version of useradd and should work on recent
431 # distributions
432 useradd -d /var/run/vboxadd -g 1 -r -s /bin/false vboxadd >/dev/null 2>&1
433 # And for the others, we choose a UID ourselves
434 useradd -d /var/run/vboxadd -g 1 -u 501 -o -s /bin/false vboxadd >/dev/null 2>&1
435
436 # Add a group "vboxsf" for Shared Folders access
437 # All users which want to access the auto-mounted Shared Folders have to
438 # be added to this group.
439 groupadd -f vboxsf >/dev/null 2>&1
440
441 # Create udev description file
442 if [ -d /etc/udev/rules.d ]; then
443 echo "Creating udev rule for the Guest Additions kernel module." >> $LOG
444 udev_call=""
445 udev_app=`which udevadm 2> /dev/null`
446 if [ $? -eq 0 ]; then
447 udev_call="${udev_app} version 2> /dev/null"
448 else
449 udev_app=`which udevinfo 2> /dev/null`
450 if [ $? -eq 0 ]; then
451 udev_call="${udev_app} -V 2> /dev/null"
452 fi
453 fi
454 udev_fix="="
455 if [ "${udev_call}" != "" ]; then
456 udev_out=`${udev_call}`
457 udev_ver=`expr "$udev_out" : '[^0-9]*\([0-9]*\)'`
458 if [ "$udev_ver" = "" -o "$udev_ver" -lt 55 ]; then
459 udev_fix=""
460 fi
461 fi
462 ## @todo 60-vboxadd.rules -> 60-vboxguest.rules ?
463 echo "KERNEL=${udev_fix}\"vboxguest\", NAME=\"vboxguest\", OWNER=\"vboxadd\", MODE=\"0660\"" > /etc/udev/rules.d/60-vboxadd.rules
464 echo "KERNEL=${udev_fix}\"vboxuser\", NAME=\"vboxuser\", OWNER=\"vboxadd\", MODE=\"0666\"" >> /etc/udev/rules.d/60-vboxadd.rules
465 fi
466
467 # Put mount.vboxsf in the right place
468 ln -sf "$lib_path/$PACKAGE/mount.vboxsf" /sbin
469 # At least Fedora 11 and Fedora 12 require the correct security context when
470 # executing this command from service scripts. Shouldn't hurt for other
471 # distributions.
472 chcon -u system_u -t mount_exec_t "$lib_path/$PACKAGE/mount.vboxsf" > /dev/null 2>&1
473 # And at least Fedora 15 needs this for the acceleration support check to
474 # work
475 redhat_release=`cat /etc/redhat-release 2> /dev/null`
476 case "$redhat_release" in Fedora\ release\ 15* )
477 for i in "$lib_path"/*.so
478 do
479 restorecon "$i" >/dev/null
480 done
481 ;;
482 esac
483
484 succ_msg
485}
486
487# setup_script
488setup()
489{
490 setup_modules
491 mod_succ="$?"
492 extra_setup
493 if [ "$mod_succ" -eq "0" ]; then
494 if running_vboxguest || running_vboxadd; then
495 printf "You should restart your guest to make sure the new modules are actually used\n\n"
496 else
497 start
498 fi
499 fi
500}
501
502# cleanup_script
503cleanup()
504{
505 # Delete old versions of VBox modules.
506 cleanup_modules
507 depmod
508
509 # Remove old module sources
510 rm -rf /usr/src/vboxadd-* /usr/src/vboxguest-* /usr/src/vboxvfs-* /usr/src/vboxsf-* /usr/src/vboxvideo-*
511
512 # Remove other files
513 rm /sbin/mount.vboxsf 2>/dev/null
514 rm /etc/udev/rules.d/60-vboxadd.rules 2>/dev/null
515}
516
517dmnstatus()
518{
519 if running_vboxguest; then
520 echo "The VirtualBox Additions are currently running."
521 else
522 echo "The VirtualBox Additions are not currently running."
523 fi
524}
525
526case "$1" in
527start)
528 start
529 ;;
530stop)
531 stop
532 ;;
533restart)
534 restart
535 ;;
536setup)
537 setup
538 ;;
539cleanup)
540 cleanup
541 ;;
542status)
543 dmnstatus
544 ;;
545*)
546 echo "Usage: $0 {start|stop|restart|status|setup}"
547 exit 1
548esac
549
550exit
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