VirtualBox

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

Last change on this file since 74412 was 74412, checked in by vboxsync, 6 years ago

Additions/linux: remove attempt to suppress a log message.
The build logs for kernel modules start with a test for autoconf.h which
includes the text of an error message in the text. This historically confused
users who thought it was a real error, so we tried to suppress it from our
logs, but the egrep command failed on Ubuntu 14.04. Since though we now only
include the build log in case of error anyway there is no longer a risk that
users will think that a successful build failed, so just remove the
suppression.

  • Property svn:eol-style set to LF
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 15.9 KB
Line 
1#! /bin/sh
2# $Id: vboxadd.sh 74412 2018-09-21 16:47:56Z vboxsync $
3## @file
4# Linux Additions kernel module init script ($Revision: 74412 $)
5#
6
7#
8# Copyright (C) 2006-2017 Oracle Corporation
9#
10# This file is part of VirtualBox Open Source Edition (OSE), as
11# available from http://www.virtualbox.org. This file is free software;
12# you can redistribute it and/or modify it under the terms of the GNU
13# General Public License (GPL) as published by the Free Software
14# Foundation, in version 2 as it comes in the "COPYING" file of the
15# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17#
18
19# X-Start-Before is a Debian Addition which we use when converting to
20# a systemd unit. X-Service-Type is our own invention, also for systemd.
21
22# chkconfig: 345 10 90
23# description: VirtualBox Linux Additions kernel modules
24#
25### BEGIN INIT INFO
26# Provides: vboxadd
27# Required-Start:
28# Required-Stop:
29# Default-Start: 2 3 4 5
30# Default-Stop: 0 1 6
31# X-Start-Before: display-manager
32# X-Service-Type: oneshot
33# Description: VirtualBox Linux Additions kernel modules
34### END INIT INFO
35
36## @todo This file duplicates a lot of script with vboxdrv.sh. When making
37# changes please try to reduce differences between the two wherever possible.
38
39# Testing:
40# * Should fail if the configuration file is missing or missing INSTALL_DIR or
41# INSTALL_VER entries.
42# * vboxadd user and vboxsf groups should be created if they do not exist - test
43# by removing them before installing.
44# * Shared folders can be mounted and auto-mounts accessible to vboxsf group,
45# including on recent Fedoras with SELinux.
46# * Setting INSTALL_NO_MODULE_BUILDS inhibits modules and module automatic
47# rebuild script creation; otherwise modules, user, group, rebuild script,
48# udev rule and shared folder mount helper should be created/set up.
49# * Setting INSTALL_NO_MODULE_BUILDS inhibits module load and unload on start
50# and stop.
51# * Uninstalling the Additions and re-installing them does not trigger warnings.
52
53PATH=$PATH:/bin:/sbin:/usr/sbin
54PACKAGE=VBoxGuestAdditions
55MODPROBE=/sbin/modprobe
56OLDMODULES="vboxguest vboxadd vboxsf vboxvfs vboxvideo"
57SERVICE="VirtualBox Guest Additions"
58QUICKSETUP=
59## systemd logs information about service status, otherwise do that ourselves.
60QUIET=
61
62setup_log()
63{
64 test -n "${LOG}" && return 0
65 # Rotate log files
66 LOG="/var/log/vboxadd-setup.log"
67 mv "${LOG}.3" "${LOG}.4" 2>/dev/null
68 mv "${LOG}.2" "${LOG}.3" 2>/dev/null
69 mv "${LOG}.1" "${LOG}.2" 2>/dev/null
70 mv "${LOG}" "${LOG}.1" 2>/dev/null
71}
72
73if $MODPROBE -c 2>/dev/null | grep -q '^allow_unsupported_modules *0'; then
74 MODPROBE="$MODPROBE --allow-unsupported-modules"
75fi
76
77# Check architecture
78cpu=`uname -m`;
79case "$cpu" in
80 i[3456789]86|x86)
81 cpu="x86"
82 ldconfig_arch="(libc6)"
83 lib_candidates="/usr/lib/i386-linux-gnu /usr/lib /lib"
84 ;;
85 x86_64|amd64)
86 cpu="amd64"
87 ldconfig_arch="(libc6,x86-64)"
88 lib_candidates="/usr/lib/x86_64-linux-gnu /usr/lib64 /usr/lib /lib64 /lib"
89 ;;
90esac
91for i in $lib_candidates; do
92 if test -d "$i/VBoxGuestAdditions"; then
93 lib_path=$i
94 break
95 fi
96done
97
98# Preamble for Gentoo
99if [ "`which $0`" = "/sbin/rc" ]; then
100 shift
101fi
102
103begin()
104{
105 test -z "${QUIET}" && echo "${SERVICE}: ${1}"
106}
107
108info()
109{
110 if test -z "${QUIET}"; then
111 echo "${SERVICE}: $1"
112 else
113 echo "$1"
114 fi
115}
116
117fail()
118{
119 log "${1}"
120 echo "$1" >&2
121 echo "The log file $LOG may contain further information." >&2
122 exit 1
123}
124
125log()
126{
127 setup_log
128 echo "${1}" >> "${LOG}"
129}
130
131module_build_log()
132{
133 log "Error building the module. Build output follows."
134 echo ""
135 echo "${1}" >> "${LOG}"
136}
137
138dev=/dev/vboxguest
139userdev=/dev/vboxuser
140config=/var/lib/VBoxGuestAdditions/config
141owner=vboxadd
142group=1
143
144if test -r $config; then
145 . $config
146else
147 fail "Configuration file $config not found"
148fi
149test -n "$INSTALL_DIR" -a -n "$INSTALL_VER" ||
150 fail "Configuration file $config not complete"
151
152running_vboxguest()
153{
154 lsmod | grep -q "vboxguest[^_-]"
155}
156
157running_vboxadd()
158{
159 lsmod | grep -q "vboxadd[^_-]"
160}
161
162running_vboxsf()
163{
164 lsmod | grep -q "vboxsf[^_-]"
165}
166
167running_vboxvideo()
168{
169 lsmod | grep -q "vboxvideo[^_-]"
170}
171
172do_vboxguest_non_udev()
173{
174 if [ ! -c $dev ]; then
175 maj=`sed -n 's;\([0-9]\+\) vboxguest;\1;p' /proc/devices`
176 if [ ! -z "$maj" ]; then
177 min=0
178 else
179 min=`sed -n 's;\([0-9]\+\) vboxguest;\1;p' /proc/misc`
180 if [ ! -z "$min" ]; then
181 maj=10
182 fi
183 fi
184 test -z "$maj" && {
185 rmmod vboxguest 2>/dev/null
186 fail "Cannot locate the VirtualBox device"
187 }
188
189 mknod -m 0664 $dev c $maj $min || {
190 rmmod vboxguest 2>/dev/null
191 fail "Cannot create device $dev with major $maj and minor $min"
192 }
193 fi
194 chown $owner:$group $dev 2>/dev/null || {
195 rm -f $dev 2>/dev/null
196 rm -f $userdev 2>/dev/null
197 rmmod vboxguest 2>/dev/null
198 fail "Cannot change owner $owner:$group for device $dev"
199 }
200
201 if [ ! -c $userdev ]; then
202 maj=10
203 min=`sed -n 's;\([0-9]\+\) vboxuser;\1;p' /proc/misc`
204 if [ ! -z "$min" ]; then
205 mknod -m 0666 $userdev c $maj $min || {
206 rm -f $dev 2>/dev/null
207 rmmod vboxguest 2>/dev/null
208 fail "Cannot create device $userdev with major $maj and minor $min"
209 }
210 chown $owner:$group $userdev 2>/dev/null || {
211 rm -f $dev 2>/dev/null
212 rm -f $userdev 2>/dev/null
213 rmmod vboxguest 2>/dev/null
214 fail "Cannot change owner $owner:$group for device $userdev"
215 }
216 fi
217 fi
218}
219
220start()
221{
222 begin "Starting."
223 # If we got this far assume that the slow set-up has been done.
224 QUICKSETUP=yes
225 if test -z "${INSTALL_NO_MODULE_BUILDS}"; then
226 uname -r | grep -q -E '^2\.6|^3|^4' 2>/dev/null &&
227 ps -A -o comm | grep -q '/*udevd$' 2>/dev/null ||
228 no_udev=1
229 running_vboxguest || {
230 rm -f $dev || {
231 fail "Cannot remove $dev"
232 }
233
234 rm -f $userdev || {
235 fail "Cannot remove $userdev"
236 }
237
238 $MODPROBE vboxguest >/dev/null 2>&1 || {
239 setup
240 $MODPROBE vboxguest >/dev/null 2>&1 ||
241 fail "modprobe vboxguest failed"
242 }
243 case "$no_udev" in 1)
244 sleep .5;;
245 esac
246 }
247 case "$no_udev" in 1)
248 do_vboxguest_non_udev;;
249 esac
250
251 running_vboxsf || {
252 $MODPROBE vboxsf > /dev/null 2>&1 || {
253 if dmesg | grep "VbglR0SfConnect failed" > /dev/null 2>&1; then
254 info "Unable to start shared folders support. Make sure that your VirtualBox build supports this feature."
255 else
256 info "modprobe vboxsf failed"
257 fi
258 }
259 }
260 fi # INSTALL_NO_MODULE_BUILDS
261
262 # Put the X.Org driver in place. This is harmless if it is not needed.
263 myerr=`"${INSTALL_DIR}/init/vboxadd-x11" setup 2>&1`
264 test -z "${myerr}" || log "${myerr}"
265 # Install the guest OpenGL drivers. For now we don't support
266 # multi-architecture installations
267 rm -f /etc/ld.so.conf.d/00vboxvideo.conf
268 rm -Rf /var/lib/VBoxGuestAdditions/lib
269 if /usr/bin/VBoxClient --check3d 2>/dev/null; then
270 mkdir -p /var/lib/VBoxGuestAdditions/lib
271 ln -sf "${INSTALL_DIR}/lib/VBoxOGL.so" /var/lib/VBoxGuestAdditions/lib/libGL.so.1
272 # SELinux for the OpenGL libraries, so that gdm can load them during the
273 # acceleration support check. This prevents an "Oh no, something has gone
274 # wrong!" error when starting EL7 guests.
275 if test -e /etc/selinux/config; then
276 if command -v semanage > /dev/null; then
277 semanage fcontext -a -t lib_t "/var/lib/VBoxGuestAdditions/lib/libGL.so.1"
278 fi
279 chcon -h -t lib_t "/var/lib/VBoxGuestAdditions/lib/libGL.so.1"
280 fi
281 echo "/var/lib/VBoxGuestAdditions/lib" > /etc/ld.so.conf.d/00vboxvideo.conf
282 fi
283 ldconfig
284
285 # Mount all shared folders from /etc/fstab. Normally this is done by some
286 # other startup script but this requires the vboxdrv kernel module loaded.
287 # This isn't necessary anymore as the vboxsf module is autoloaded.
288 # mount -a -t vboxsf
289
290 return 0
291}
292
293stop()
294{
295 begin "Stopping."
296 if test -r /etc/ld.so.conf.d/00vboxvideo.conf; then
297 rm /etc/ld.so.conf.d/00vboxvideo.conf
298 ldconfig
299 fi
300 if ! umount -a -t vboxsf 2>/dev/null; then
301 fail "Cannot unmount vboxsf folders"
302 fi
303 test -n "${INSTALL_NO_MODULE_BUILDS}" ||
304 info "You may need to restart your guest system to finish removing the guest drivers."
305 return 0
306}
307
308restart()
309{
310 stop && start
311 return 0
312}
313
314# Remove any existing VirtualBox guest kernel modules from the disk, but not
315# from the kernel as they may still be in use
316cleanup_modules()
317{
318 for i in ${OLDMODULES}; do
319 # We no longer support DKMS, remove any leftovers.
320 rm -rf "/var/lib/dkms/${i}"*
321 # And remove old modules.
322 rm -f /lib/modules/*/misc/"${i}"*
323 done
324 # Remove leftover module folders.
325 for i in /lib/modules/*/misc; do
326 test -d "${i}" && rmdir -p "${i}" 2>/dev/null
327 done
328 rm -f /etc/depmod.d/vboxvideo-upstream.conf
329}
330
331# Build and install the VirtualBox guest kernel modules
332setup_modules()
333{
334 # don't stop the old modules here -- they might be in use
335 test -z "${QUICKSETUP}" && cleanup_modules
336 # This does not work for 2.4 series kernels. How sad.
337 test -n "${QUICKSETUP}" && test -f "${MODULE_DIR}/vboxguest.ko" && return 0
338 info "Building the VirtualBox Guest Additions kernel modules. This may take a while."
339
340 log "Building the main Guest Additions module."
341 if ! myerr=`$BUILDINTMP \
342 --save-module-symvers /tmp/vboxguest-Module.symvers \
343 --module-source $MODULE_SRC/vboxguest \
344 --no-print-directory install 2>&1`; then
345 # If check_module_dependencies.sh fails it prints a message itself.
346 module_build_log "$myerr"
347 "${INSTALL_DIR}"/other/check_module_dependencies.sh 2>&1 &&
348 info "Look at $LOG to find out what went wrong"
349 return 0
350 fi
351 log "Building the shared folder support module."
352 if ! myerr=`$BUILDINTMP \
353 --use-module-symvers /tmp/vboxguest-Module.symvers \
354 --module-source $MODULE_SRC/vboxsf \
355 --no-print-directory install 2>&1`; then
356 module_build_log "$myerr"
357 info "Look at $LOG to find out what went wrong"
358 return 0
359 fi
360 log "Building the graphics driver module."
361 if ! myerr=`$BUILDINTMP \
362 --use-module-symvers /tmp/vboxguest-Module.symvers \
363 --module-source $MODULE_SRC/vboxvideo \
364 --no-print-directory install 2>&1`; then
365 module_build_log "$myerr"
366 info "Look at $LOG to find out what went wrong"
367 fi
368 [ -d /etc/depmod.d ] || mkdir /etc/depmod.d
369 echo "override vboxguest * misc" > /etc/depmod.d/vboxvideo-upstream.conf
370 echo "override vboxsf * misc" >> /etc/depmod.d/vboxvideo-upstream.conf
371 echo "override vboxvideo * misc" >> /etc/depmod.d/vboxvideo-upstream.conf
372 depmod
373 return 0
374}
375
376create_vbox_user()
377{
378 # This is the LSB version of useradd and should work on recent
379 # distributions
380 useradd -d /var/run/vboxadd -g 1 -r -s /bin/false vboxadd >/dev/null 2>&1
381 # And for the others, we choose a UID ourselves
382 useradd -d /var/run/vboxadd -g 1 -u 501 -o -s /bin/false vboxadd >/dev/null 2>&1
383
384}
385
386create_udev_rule()
387{
388 # Create udev description file
389 if [ -d /etc/udev/rules.d ]; then
390 udev_call=""
391 udev_app=`which udevadm 2> /dev/null`
392 if [ $? -eq 0 ]; then
393 udev_call="${udev_app} version 2> /dev/null"
394 else
395 udev_app=`which udevinfo 2> /dev/null`
396 if [ $? -eq 0 ]; then
397 udev_call="${udev_app} -V 2> /dev/null"
398 fi
399 fi
400 udev_fix="="
401 if [ "${udev_call}" != "" ]; then
402 udev_out=`${udev_call}`
403 udev_ver=`expr "$udev_out" : '[^0-9]*\([0-9]*\)'`
404 if [ "$udev_ver" = "" -o "$udev_ver" -lt 55 ]; then
405 udev_fix=""
406 fi
407 fi
408 ## @todo 60-vboxadd.rules -> 60-vboxguest.rules ?
409 echo "KERNEL=${udev_fix}\"vboxguest\", NAME=\"vboxguest\", OWNER=\"vboxadd\", MODE=\"0660\"" > /etc/udev/rules.d/60-vboxadd.rules
410 echo "KERNEL=${udev_fix}\"vboxuser\", NAME=\"vboxuser\", OWNER=\"vboxadd\", MODE=\"0666\"" >> /etc/udev/rules.d/60-vboxadd.rules
411 fi
412}
413
414create_module_rebuild_script()
415{
416 # And a post-installation script for rebuilding modules when a new kernel
417 # is installed.
418 mkdir -p /etc/kernel/postinst.d /etc/kernel/prerm.d
419 cat << EOF > /etc/kernel/postinst.d/vboxadd
420#!/bin/sh
421test -d "/lib/modules/\${1}/build" || exit 0
422KERN_VER="\${1}" /sbin/rcvboxadd quicksetup
423exit 0
424EOF
425 cat << EOF > /etc/kernel/prerm.d/vboxadd
426#!/bin/sh
427for i in ${OLDMODULES}; do rm -f /lib/modules/"\${1}"/misc/"\${i}".ko; done
428rmdir -p /lib/modules/"\$1"/misc 2>/dev/null
429exit 0
430EOF
431 chmod 0755 /etc/kernel/postinst.d/vboxadd /etc/kernel/prerm.d/vboxadd
432}
433
434shared_folder_setup()
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 -r -f vboxsf >/dev/null 2>&1
440
441 # Put the mount.vboxsf mount helper in the right place.
442 ## @todo It would be nicer if the kernel module just parsed parameters
443 # itself instead of needing a separate binary to do that.
444 ln -sf "${INSTALL_DIR}/other/mount.vboxsf" /sbin
445 # SELinux security context for the mount helper.
446 if test -e /etc/selinux/config; then
447 # This is correct. semanage maps this to the real path, and it aborts
448 # with an error, telling you what you should have typed, if you specify
449 # the real path. The "chcon" is there as a back-up for old guests.
450 command -v semanage > /dev/null &&
451 semanage fcontext -a -t mount_exec_t "${INSTALL_DIR}/other/mount.vboxsf"
452 chcon -t mount_exec_t "${INSTALL_DIR}/other/mount.vboxsf"
453 fi
454}
455
456# setup_script
457setup()
458{
459 export BUILD_TYPE
460 export USERNAME
461
462 MODULE_SRC="$INSTALL_DIR/src/vboxguest-$INSTALL_VER"
463 BUILDINTMP="$MODULE_SRC/build_in_tmp"
464 chcon -t bin_t "$BUILDINTMP" > /dev/null 2>&1
465
466 test -z "${INSTALL_NO_MODULE_BUILDS}" && setup_modules
467 create_vbox_user
468 create_udev_rule
469 test -z "${INSTALL_NO_MODULE_BUILDS}" && create_module_rebuild_script
470 test -n "${QUICKSETUP}" && return 0
471 shared_folder_setup
472 if running_vboxguest || running_vboxadd; then
473 info "Running kernel modules will not be replaced until the system is restarted"
474 fi
475 return 0
476}
477
478# cleanup_script
479cleanup()
480{
481 if test -z "${INSTALL_NO_MODULE_BUILDS}"; then
482 # Delete old versions of VBox modules.
483 cleanup_modules
484 depmod
485
486 # Remove old module sources
487 for i in $OLDMODULES; do
488 rm -rf /usr/src/$i-*
489 done
490 fi
491
492 # Clean-up X11-related bits
493 "${INSTALL_DIR}/init/vboxadd-x11" cleanup
494
495 # Remove other files
496 rm /sbin/mount.vboxsf 2>/dev/null
497 if test -z "${INSTALL_NO_MODULE_BUILDS}"; then
498 rm -f /etc/kernel/postinst.d/vboxadd /etc/kernel/prerm.d/vboxadd
499 rmdir -p /etc/kernel/postinst.d /etc/kernel/prerm.d 2>/dev/null
500 fi
501 rm /etc/udev/rules.d/60-vboxadd.rules 2>/dev/null
502}
503
504dmnstatus()
505{
506 if running_vboxguest; then
507 echo "The VirtualBox Additions are currently running."
508 else
509 echo "The VirtualBox Additions are not currently running."
510 fi
511}
512
513case "$2" in quiet)
514 QUIET=yes;;
515esac
516case "$1" in
517start)
518 start
519 ;;
520stop)
521 stop
522 ;;
523restart)
524 restart
525 ;;
526setup)
527 setup
528 start
529 ;;
530quicksetup)
531 QUICKSETUP=yes
532 setup
533 ;;
534cleanup)
535 cleanup
536 ;;
537status)
538 dmnstatus
539 ;;
540*)
541 echo "Usage: $0 {start|stop|restart|status|setup|quicksetup|cleanup} [quiet]"
542 exit 1
543esac
544
545exit
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use