VirtualBox

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

Last change on this file since 32183 was 32183, checked in by vboxsync, 15 years ago

Linux Installer/Additions: attempt to properly register the host/guest kernel modules at DKMS and use the setup function of the service script to compile the modules instead of doing this separately in the installer scripts

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 14.9 KB
Line 
1#! /bin/sh
2# Sun VirtualBox
3# Linux Additions kernel module init script ($Revision: 32183 $)
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/vboxvideo*/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 || true`
177 if [ "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
217start()
218{
219 begin "Starting the VirtualBox Guest Additions ";
220 running_vboxguest || {
221 rm -f $dev || {
222 fail "Cannot remove $dev"
223 }
224
225 rm -f $userdev || {
226 fail "Cannot remove $userdev"
227 }
228
229 $MODPROBE vboxguest >/dev/null 2>&1 || {
230 fail "modprobe vboxguest failed"
231 }
232 sleep .5
233 }
234 if [ ! -c $dev ]; then
235 maj=`sed -n 's;\([0-9]\+\) vboxguest;\1;p' /proc/devices`
236 if [ ! -z "$maj" ]; then
237 min=0
238 else
239 min=`sed -n 's;\([0-9]\+\) vboxguest;\1;p' /proc/misc`
240 if [ ! -z "$min" ]; then
241 maj=10
242 fi
243 fi
244 test -z "$maj" && {
245 rmmod vboxguest 2>/dev/null
246 fail "Cannot locate the VirtualBox device"
247 }
248
249 mknod -m 0664 $dev c $maj $min || {
250 rmmod vboxguest 2>/dev/null
251 fail "Cannot create device $dev with major $maj and minor $min"
252 }
253 fi
254 chown $owner:$group $dev 2>/dev/null || {
255 rm -f $dev 2>/dev/null
256 rm -f $userdev 2>/dev/null
257 rmmod vboxguest 2>/dev/null
258 fail "Cannot change owner $owner:$group for device $dev"
259 }
260
261 if [ ! -c $userdev ]; then
262 maj=10
263 min=`sed -n 's;\([0-9]\+\) vboxuser;\1;p' /proc/misc`
264 if [ ! -z "$min" ]; then
265 mknod -m 0666 $userdev c $maj $min || {
266 rm -f $dev 2>/dev/null
267 rmmod vboxguest 2>/dev/null
268 fail "Cannot create device $userdev with major $maj and minor $min"
269 }
270 chown $owner:$group $userdev 2>/dev/null || {
271 rm -f $dev 2>/dev/null
272 rm -f $userdev 2>/dev/null
273 rmmod vboxguest 2>/dev/null
274 fail "Cannot change owner $owner:$group for device $userdev"
275 }
276 fi
277 fi
278
279 if [ -n "$BUILDVBOXSF" ]; then
280 running_vboxsf || {
281 $MODPROBE vboxsf > /dev/null 2>&1 || {
282 if dmesg | grep "vboxConnect failed" > /dev/null 2>&1; then
283 fail_msg
284 echo "Unable to start shared folders support. Make sure that your VirtualBox build"
285 echo "supports this feature."
286 exit 1
287 fi
288 fail "modprobe vboxsf failed"
289 }
290 }
291 fi
292
293 # Mount all shared folders from /etc/fstab. Normally this is done by some
294 # other startup script but this requires the vboxdrv kernel module loaded.
295 # This isn't necessary anymore as the vboxsf module is autoloaded.
296 # mount -a -t vboxsf
297
298 succ_msg
299 return 0
300}
301
302stop()
303{
304 begin "Stopping VirtualBox Additions ";
305 if ! umount -a -t vboxsf 2>/dev/null; then
306 fail "Cannot unmount vboxsf folders"
307 fi
308 if [ -n "$BUILDVBOXSF" ]; then
309 if running_vboxsf; then
310 rmmod vboxsf 2>/dev/null || fail "Cannot unload module vboxsf"
311 fi
312 fi
313 if running_vboxguest; then
314 rmmod vboxguest 2>/dev/null || fail "Cannot unload module vboxguest"
315 rm -f $userdev || fail "Cannot unlink $userdev"
316 rm -f $dev || fail "Cannot unlink $dev"
317 fi
318 succ_msg
319 return 0
320}
321
322restart()
323{
324 stop && start
325 return 0
326}
327
328# setup_script
329setup()
330{
331 # don't stop the old modules here -- they might be in use
332 begin "Uninstalling old VirtualBox DKMS kernel modules"
333 $DODKMS uninstall > $LOG
334 succ_msg
335 if find /lib/modules/`uname -r` -name "vboxvideo\.*" 2>/dev/null|grep -q vboxvideo; then
336 begin "Removing old VirtualBox vboxvideo kernel module"
337 find /lib/modules/`uname -r` -name "vboxvideo\.*" 2>/dev/null|xargs rm -f 2>/dev/null
338 succ_msg
339 fi
340 if find /lib/modules/`uname -r` -name "vboxsf\.*" 2>/dev/null|grep -q vboxsf; then
341 begin "Removing old VirtualBox vboxsf kernel module"
342 find /lib/modules/`uname -r` -name "vboxsf\.*" 2>/dev/null|xargs rm -f 2>/dev/null
343 succ_msg
344 fi
345 if find /lib/modules/`uname -r` -name "vboxguest\.*" 2>/dev/null|grep -q vboxguest; then
346 begin "Removing old VirtualBox vboxguest kernel module"
347 find /lib/modules/`uname -r` -name "vboxguest\.*" 2>/dev/null|xargs rm -f 2>/dev/null
348 succ_msg
349 fi
350 begin "Building the VirtualBox Guest Additions kernel modules"
351 test_sane_kernel_dir
352
353 if ! sh /usr/share/$PACKAGE/test/build_in_tmp \
354 --no-print-directory >> $LOG 2>&1; then
355 fail_msg
356 printf "Your system does not seem to be set up to build kernel modules.\nLook at $LOG to find out what went wrong. Once you have corrected it, you can\nrun\n\n /etc/init.d/vboxadd setup\n\nto build them."
357 BUILDVBOXGUEST=""
358 BUILDVBOXSF=""
359 BUILDVBOXVIDEO=""
360 else
361 if ! sh /usr/share/$PACKAGE/test_drm/build_in_tmp \
362 --no-print-directory >> $LOG 2>&1; then
363 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"
364 BUILDVBOXVIDEO=""
365 fi
366 fi
367 echo
368 if ! $DODKMS install >> $LOG 2>&1; then
369 if [ -n "$BUILDVBOXGUEST" ]; then
370 begin "Building the main Guest Additions module"
371 if ! $BUILDVBOXGUEST \
372 --save-module-symvers /tmp/vboxguest-Module.symvers \
373 --no-print-directory install >> $LOG 2>&1; then
374 fail "Look at $LOG to find out what went wrong"
375 fi
376 succ_msg
377 fi
378 if [ -n "$BUILDVBOXSF" ]; then
379 begin "Building the shared folder support module"
380 if ! $BUILDVBOXSF \
381 --use-module-symvers /tmp/vboxguest-Module.symvers \
382 --no-print-directory install >> $LOG 2>&1; then
383 fail "Look at $LOG to find out what went wrong"
384 fi
385 succ_msg
386 fi
387 if [ -n "$BUILDVBOXVIDEO" ]; then
388 begin "Building the OpenGL support module"
389 if ! $BUILDVBOXVIDEO \
390 --use-module-symvers /tmp/vboxguest-Module.symvers \
391 --no-print-directory install >> $LOG 2>&1; then
392 fail "Look at $LOG to find out what went wrong"
393 fi
394 succ_msg
395 fi
396 depmod
397 fi
398
399 begin "Doing non-kernel setup of the Guest Additions"
400 echo "Creating user for the Guest Additions." >> $LOG
401 # This is the LSB version of useradd and should work on recent
402 # distributions
403 useradd -d /var/run/vboxadd -g 1 -r -s /bin/false vboxadd >/dev/null 2>&1
404 # And for the others, we choose a UID ourselves
405 useradd -d /var/run/vboxadd -g 1 -u 501 -o -s /bin/false vboxadd >/dev/null 2>&1
406
407 # Add a group "vboxsf" for Shared Folders access
408 # All users which want to access the auto-mounted Shared Folders have to
409 # be added to this group.
410 groupadd -f vboxsf >/dev/null 2>&1
411
412 # Create udev description file
413 if [ -d /etc/udev/rules.d ]; then
414 echo "Creating udev rule for the Guest Additions kernel module." >> $LOG
415 udev_call=""
416 udev_app=`which udevadm 2> /dev/null`
417 if [ $? -eq 0 ]; then
418 udev_call="${udev_app} version 2> /dev/null"
419 else
420 udev_app=`which udevinfo 2> /dev/null`
421 if [ $? -eq 0 ]; then
422 udev_call="${udev_app} -V 2> /dev/null"
423 fi
424 fi
425 udev_fix="="
426 if [ "${udev_call}" != "" ]; then
427 udev_out=`${udev_call}`
428 udev_ver=`expr "$udev_out" : '[^0-9]*\([0-9]*\)'`
429 if [ "$udev_ver" = "" -o "$udev_ver" -lt 55 ]; then
430 udev_fix=""
431 fi
432 fi
433 ## @todo 60-vboxadd.rules -> 60-vboxguest.rules ?
434 echo "KERNEL=${udev_fix}\"vboxguest\", NAME=\"vboxguest\", OWNER=\"vboxadd\", MODE=\"0660\"" > /etc/udev/rules.d/60-vboxadd.rules
435 echo "KERNEL=${udev_fix}\"vboxuser\", NAME=\"vboxuser\", OWNER=\"vboxadd\", MODE=\"0666\"" >> /etc/udev/rules.d/60-vboxadd.rules
436 fi
437
438 # Put mount.vboxsf in the right place
439 ln -sf "$lib_path/$PACKAGE/mount.vboxsf" /sbin
440 # At least Fedora 11 and Fedora 12 demand on the correct security context when
441 # executing this command from service scripts. Shouldn't hurt for other distributions.
442 chcon -u system_u -t mount_exec_t "$lib_path/$PACKAGE/mount.vboxsf" > /dev/null 2>&1
443
444 succ_msg
445 if [ -n "$BUILDVBOXGUEST" ]; then
446 if running_vboxguest || running_vboxadd; then
447 printf "You should restart your guest to make sure the new modules are actually used\n\n"
448 else
449 start
450 fi
451 fi
452}
453
454# cleanup_script
455cleanup()
456{
457 # Delete old versions of VBox modules.
458 DKMS=`which dkms 2>/dev/null`
459 if [ -n "$DKMS" ]; then
460 echo "Attempt to remove old DKMS modules..."
461 for mod in vboxadd vboxguest vboxvfs vboxsf vboxvideo; do
462 $DKMS status -m $mod | while read line; do
463 if echo "$line" | grep -q added > /dev/null ||
464 echo "$line" | grep -q built > /dev/null ||
465 echo "$line" | grep -q installed > /dev/null; then
466 version=`echo "$line" | sed "s/$mod,\([^,]*\)[,:].*/\1/;t;d"`
467 echo " removing module $mod version $version"
468 $DKMS remove -m $mod -v $version --all 1>&2
469 fi
470 done
471 done
472 echo "Done."
473 fi
474
475 # Remove old installed modules
476 find /lib/modules -name vboxadd\* | xargs rm 2>/dev/null
477 find /lib/modules -name vboxguest\* | xargs rm 2>/dev/null
478 find /lib/modules -name vboxvfs\* | xargs rm 2>/dev/null
479 find /lib/modules -name vboxsf\* | xargs rm 2>/dev/null
480 find /lib/modules -name vboxvideo\* | xargs rm 2>/dev/null
481 depmod
482
483 # Remove old module sources
484 rm -rf /usr/src/vboxadd-* /usr/src/vboxguest-* /usr/src/vboxvfs-* /usr/src/vboxsf-* /usr/src/vboxvideo-*
485
486 # Remove other files
487 rm /sbin/mount.vboxsf 2>/dev/null
488 rm /etc/udev/rules.d/60-vboxadd.rules 2>/dev/null
489}
490
491dmnstatus()
492{
493 if running_vboxguest; then
494 echo "The VirtualBox Additions are currently running."
495 else
496 echo "The VirtualBox Additions are not currently running."
497 fi
498}
499
500case "$1" in
501start)
502 start
503 ;;
504stop)
505 stop
506 ;;
507restart)
508 restart
509 ;;
510setup)
511 setup
512 ;;
513cleanup)
514 cleanup
515 ;;
516status)
517 dmnstatus
518 ;;
519*)
520 echo "Usage: $0 {start|stop|restart|status}"
521 exit 1
522esac
523
524exit
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