VirtualBox

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

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

Linux installer: small cosmetical fix

  • 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: 36006 $)
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 succ_msg
364 return 0
365 fi
366
367 test_sane_kernel_dir
368
369 if ! sh /usr/share/$PACKAGE/test/build_in_tmp \
370 --no-print-directory >> $LOG 2>&1; then
371 fail_msg
372 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"
373 return 1
374 else
375 if ! sh /usr/share/$PACKAGE/test_drm/build_in_tmp \
376 --no-print-directory >> $LOG 2>&1; then
377 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"
378 BUILDVBOXVIDEO=""
379 fi
380 fi
381 echo
382 if [ -n "$BUILDVBOXGUEST" ]; then
383 begin "Building the main Guest Additions module"
384 if ! $BUILDVBOXGUEST \
385 --save-module-symvers /tmp/vboxguest-Module.symvers \
386 --no-print-directory install >> $LOG 2>&1; then
387 fail "Look at $LOG to find out what went wrong"
388 fi
389 succ_msg
390 fi
391 if [ -n "$BUILDVBOXSF" ]; then
392 begin "Building the shared folder support module"
393 if ! $BUILDVBOXSF \
394 --use-module-symvers /tmp/vboxguest-Module.symvers \
395 --no-print-directory install >> $LOG 2>&1; then
396 fail "Look at $LOG to find out what went wrong"
397 fi
398 succ_msg
399 fi
400 if [ -n "$BUILDVBOXVIDEO" ]; then
401 begin "Building the OpenGL support module"
402 if ! $BUILDVBOXVIDEO \
403 --use-module-symvers /tmp/vboxguest-Module.symvers \
404 --no-print-directory install >> $LOG 2>&1; then
405 fail "Look at $LOG to find out what went wrong"
406 fi
407 succ_msg
408 fi
409 depmod
410 return 0
411}
412
413# Do non-kernel bits needed for the kernel modules to work properly (user
414# creation, udev, mount helper...)
415extra_setup()
416{
417 begin "Doing non-kernel setup of the Guest Additions"
418 echo "Creating user for the Guest Additions." >> $LOG
419 # This is the LSB version of useradd and should work on recent
420 # distributions
421 useradd -d /var/run/vboxadd -g 1 -r -s /bin/false vboxadd >/dev/null 2>&1
422 # And for the others, we choose a UID ourselves
423 useradd -d /var/run/vboxadd -g 1 -u 501 -o -s /bin/false vboxadd >/dev/null 2>&1
424
425 # Add a group "vboxsf" for Shared Folders access
426 # All users which want to access the auto-mounted Shared Folders have to
427 # be added to this group.
428 groupadd -f vboxsf >/dev/null 2>&1
429
430 # Create udev description file
431 if [ -d /etc/udev/rules.d ]; then
432 echo "Creating udev rule for the Guest Additions kernel module." >> $LOG
433 udev_call=""
434 udev_app=`which udevadm 2> /dev/null`
435 if [ $? -eq 0 ]; then
436 udev_call="${udev_app} version 2> /dev/null"
437 else
438 udev_app=`which udevinfo 2> /dev/null`
439 if [ $? -eq 0 ]; then
440 udev_call="${udev_app} -V 2> /dev/null"
441 fi
442 fi
443 udev_fix="="
444 if [ "${udev_call}" != "" ]; then
445 udev_out=`${udev_call}`
446 udev_ver=`expr "$udev_out" : '[^0-9]*\([0-9]*\)'`
447 if [ "$udev_ver" = "" -o "$udev_ver" -lt 55 ]; then
448 udev_fix=""
449 fi
450 fi
451 ## @todo 60-vboxadd.rules -> 60-vboxguest.rules ?
452 echo "KERNEL=${udev_fix}\"vboxguest\", NAME=\"vboxguest\", OWNER=\"vboxadd\", MODE=\"0660\"" > /etc/udev/rules.d/60-vboxadd.rules
453 echo "KERNEL=${udev_fix}\"vboxuser\", NAME=\"vboxuser\", OWNER=\"vboxadd\", MODE=\"0666\"" >> /etc/udev/rules.d/60-vboxadd.rules
454 fi
455
456 # Put mount.vboxsf in the right place
457 ln -sf "$lib_path/$PACKAGE/mount.vboxsf" /sbin
458 # At least Fedora 11 and Fedora 12 demand on the correct security context when
459 # executing this command from service scripts. Shouldn't hurt for other distributions.
460 chcon -u system_u -t mount_exec_t "$lib_path/$PACKAGE/mount.vboxsf" > /dev/null 2>&1
461
462 succ_msg
463}
464
465# setup_script
466setup()
467{
468 setup_modules
469 mod_succ="$?"
470 extra_setup
471 if [ "$mod_succ" -eq "0" ]; then
472 if running_vboxguest || running_vboxadd; then
473 printf "You should restart your guest to make sure the new modules are actually used\n\n"
474 else
475 start
476 fi
477 fi
478}
479
480# cleanup_script
481cleanup()
482{
483 # Delete old versions of VBox modules.
484 cleanup_modules
485 depmod
486
487 # Remove old module sources
488 rm -rf /usr/src/vboxadd-* /usr/src/vboxguest-* /usr/src/vboxvfs-* /usr/src/vboxsf-* /usr/src/vboxvideo-*
489
490 # Remove other files
491 rm /sbin/mount.vboxsf 2>/dev/null
492 rm /etc/udev/rules.d/60-vboxadd.rules 2>/dev/null
493}
494
495dmnstatus()
496{
497 if running_vboxguest; then
498 echo "The VirtualBox Additions are currently running."
499 else
500 echo "The VirtualBox Additions are not currently running."
501 fi
502}
503
504case "$1" in
505start)
506 start
507 ;;
508stop)
509 stop
510 ;;
511restart)
512 restart
513 ;;
514setup)
515 setup
516 ;;
517cleanup)
518 cleanup
519 ;;
520status)
521 dmnstatus
522 ;;
523*)
524 echo "Usage: $0 {start|stop|restart|status}"
525 exit 1
526esac
527
528exit
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