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
RevLine 
[301]1#! /bin/sh
[69327]2# $Id: vboxadd.sh 74412 2018-09-21 16:47:56Z vboxsync $
3## @file
[21412]4# Linux Additions kernel module init script ($Revision: 74412 $)
[1]5#
[21412]6
7#
[69500]8# Copyright (C) 2006-2017 Oracle Corporation
[5999]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#
[1]18
[67736]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.
[1]21
[60317]22# chkconfig: 345 10 90
[15585]23# description: VirtualBox Linux Additions kernel modules
[1]24#
25### BEGIN INIT INFO
26# Provides: vboxadd
[1520]27# Required-Start:
[1]28# Required-Stop:
[11274]29# Default-Start: 2 3 4 5
30# Default-Stop: 0 1 6
[67736]31# X-Start-Before: display-manager
32# X-Service-Type: oneshot
[15585]33# Description: VirtualBox Linux Additions kernel modules
[1]34### END INIT INFO
35
[61199]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
[66401]39# Testing:
[66423]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.
[66401]44# * Shared folders can be mounted and auto-mounts accessible to vboxsf group,
45# including on recent Fedoras with SELinux.
[66423]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.
[66413]51# * Uninstalling the Additions and re-installing them does not trigger warnings.
[66401]52
[301]53PATH=$PATH:/bin:/sbin:/usr/sbin
[24402]54PACKAGE=VBoxGuestAdditions
[25687]55MODPROBE=/sbin/modprobe
[39358]56OLDMODULES="vboxguest vboxadd vboxsf vboxvfs vboxvideo"
[63870]57SERVICE="VirtualBox Guest Additions"
[61199]58QUICKSETUP=
[63870]59## systemd logs information about service status, otherwise do that ourselves.
60QUIET=
[301]61
[68705]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}
[63870]72
[51193]73if $MODPROBE -c 2>/dev/null | grep -q '^allow_unsupported_modules *0'; then
[25687]74 MODPROBE="$MODPROBE --allow-unsupported-modules"
75fi
76
[25139]77# Check architecture
78cpu=`uname -m`;
79case "$cpu" in
80 i[3456789]86|x86)
81 cpu="x86"
[59180]82 ldconfig_arch="(libc6)"
[50925]83 lib_candidates="/usr/lib/i386-linux-gnu /usr/lib /lib"
[25139]84 ;;
85 x86_64|amd64)
86 cpu="amd64"
[59180]87 ldconfig_arch="(libc6,x86-64)"
[50925]88 lib_candidates="/usr/lib/x86_64-linux-gnu /usr/lib64 /usr/lib /lib64 /lib"
[25139]89 ;;
90esac
[50925]91for i in $lib_candidates; do
92 if test -d "$i/VBoxGuestAdditions"; then
93 lib_path=$i
94 break
95 fi
96done
[25139]97
[57945]98# Preamble for Gentoo
99if [ "`which $0`" = "/sbin/rc" ]; then
100 shift
[9108]101fi
[1]102
[57945]103begin()
104{
[63870]105 test -z "${QUIET}" && echo "${SERVICE}: ${1}"
[57945]106}
[1]107
[63870]108info()
[57945]109{
[63870]110 if test -z "${QUIET}"; then
111 echo "${SERVICE}: $1"
112 else
113 echo "$1"
114 fi
[57945]115}
[9108]116
[63870]117fail()
[39358]118{
[63870]119 log "${1}"
120 echo "$1" >&2
121 echo "The log file $LOG may contain further information." >&2
122 exit 1
[39358]123}
124
[63870]125log()
[39358]126{
[68705]127 setup_log
[63870]128 echo "${1}" >> "${LOG}"
[39358]129}
130
[72196]131module_build_log()
132{
[74412]133 log "Error building the module. Build output follows."
134 echo ""
135 echo "${1}" >> "${LOG}"
[72196]136}
137
[21412]138dev=/dev/vboxguest
[17859]139userdev=/dev/vboxuser
[39358]140config=/var/lib/VBoxGuestAdditions/config
[6969]141owner=vboxadd
142group=1
[1]143
[66401]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
[21412]152running_vboxguest()
[15585]153{
[21412]154 lsmod | grep -q "vboxguest[^_-]"
[1]155}
156
[24640]157running_vboxadd()
158{
159 lsmod | grep -q "vboxadd[^_-]"
160}
161
[28998]162running_vboxsf()
[15585]163{
[28998]164 lsmod | grep -q "vboxsf[^_-]"
[15585]165}
166
[43742]167running_vboxvideo()
168{
169 lsmod | grep -q "vboxvideo[^_-]"
170}
171
[35202]172do_vboxguest_non_udev()
[15585]173{
[1]174 if [ ! -c $dev ]; then
[21412]175 maj=`sed -n 's;\([0-9]\+\) vboxguest;\1;p' /proc/devices`
[423]176 if [ ! -z "$maj" ]; then
177 min=0
178 else
[21412]179 min=`sed -n 's;\([0-9]\+\) vboxguest;\1;p' /proc/misc`
[423]180 if [ ! -z "$min" ]; then
181 maj=10
182 fi
183 fi
[301]184 test -z "$maj" && {
[21412]185 rmmod vboxguest 2>/dev/null
[9108]186 fail "Cannot locate the VirtualBox device"
[1]187 }
188
[9108]189 mknod -m 0664 $dev c $maj $min || {
[21412]190 rmmod vboxguest 2>/dev/null
[9108]191 fail "Cannot create device $dev with major $maj and minor $min"
[1]192 }
193 fi
[18056]194 chown $owner:$group $dev 2>/dev/null || {
195 rm -f $dev 2>/dev/null
196 rm -f $userdev 2>/dev/null
[21412]197 rmmod vboxguest 2>/dev/null
[18056]198 fail "Cannot change owner $owner:$group for device $dev"
199 }
200
[17859]201 if [ ! -c $userdev ]; then
[17950]202 maj=10
[17859]203 min=`sed -n 's;\([0-9]\+\) vboxuser;\1;p' /proc/misc`
204 if [ ! -z "$min" ]; then
[17950]205 mknod -m 0666 $userdev c $maj $min || {
206 rm -f $dev 2>/dev/null
[21412]207 rmmod vboxguest 2>/dev/null
[17950]208 fail "Cannot create device $userdev with major $maj and minor $min"
209 }
[18056]210 chown $owner:$group $userdev 2>/dev/null || {
211 rm -f $dev 2>/dev/null
212 rm -f $userdev 2>/dev/null
[21412]213 rmmod vboxguest 2>/dev/null
[18056]214 fail "Cannot change owner $owner:$group for device $userdev"
215 }
[17859]216 fi
217 fi
[35202]218}
[6969]219
[35202]220start()
221{
[63870]222 begin "Starting."
[61199]223 # If we got this far assume that the slow set-up has been done.
224 QUICKSETUP=yes
[66423]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 }
[35202]233
[66423]234 rm -f $userdev || {
235 fail "Cannot remove $userdev"
236 }
[35202]237
[59234]238 $MODPROBE vboxguest >/dev/null 2>&1 || {
[66423]239 setup
[68709]240 $MODPROBE vboxguest >/dev/null 2>&1 ||
[66423]241 fail "modprobe vboxguest failed"
[59234]242 }
[66423]243 case "$no_udev" in 1)
244 sleep .5;;
245 esac
[35202]246 }
247 case "$no_udev" in 1)
[66423]248 do_vboxguest_non_udev;;
[35202]249 esac
250
[66423]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 }
[15585]259 }
[66423]260 fi # INSTALL_NO_MODULE_BUILDS
[15585]261
[60317]262 # Put the X.Org driver in place. This is harmless if it is not needed.
[72196]263 myerr=`"${INSTALL_DIR}/init/vboxadd-x11" setup 2>&1`
264 test -z "${myerr}" || log "${myerr}"
[59197]265 # Install the guest OpenGL drivers. For now we don't support
266 # multi-architecture installations
[62201]267 rm -f /etc/ld.so.conf.d/00vboxvideo.conf
[67736]268 rm -Rf /var/lib/VBoxGuestAdditions/lib
[61090]269 if /usr/bin/VBoxClient --check3d 2>/dev/null; then
[62551]270 mkdir -p /var/lib/VBoxGuestAdditions/lib
[60940]271 ln -sf "${INSTALL_DIR}/lib/VBoxOGL.so" /var/lib/VBoxGuestAdditions/lib/libGL.so.1
[62394]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
[62749]276 if command -v semanage > /dev/null; then
277 semanage fcontext -a -t lib_t "/var/lib/VBoxGuestAdditions/lib/libGL.so.1"
[62759]278 fi
[62394]279 chcon -h -t lib_t "/var/lib/VBoxGuestAdditions/lib/libGL.so.1"
280 fi
[60940]281 echo "/var/lib/VBoxGuestAdditions/lib" > /etc/ld.so.conf.d/00vboxvideo.conf
[59180]282 fi
[60940]283 ldconfig
[43742]284
[15585]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.
[29016]287 # This isn't necessary anymore as the vboxsf module is autoloaded.
288 # mount -a -t vboxsf
[15585]289
[1]290 return 0
291}
292
[15585]293stop()
294{
[63870]295 begin "Stopping."
[59180]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
[22314]300 if ! umount -a -t vboxsf 2>/dev/null; then
[15585]301 fail "Cannot unmount vboxsf folders"
302 fi
[69564]303 test -n "${INSTALL_NO_MODULE_BUILDS}" ||
[63870]304 info "You may need to restart your guest system to finish removing the guest drivers."
[1]305 return 0
306}
307
[15585]308restart()
309{
[1]310 stop && start
311 return 0
312}
313
[35200]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()
[15585]317{
[62676]318 for i in ${OLDMODULES}; do
319 # We no longer support DKMS, remove any leftovers.
[57969]320 rm -rf "/var/lib/dkms/${i}"*
[62676]321 # And remove old modules.
322 rm -f /lib/modules/*/misc/"${i}"*
[57969]323 done
[61176]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
[63738]328 rm -f /etc/depmod.d/vboxvideo-upstream.conf
[35200]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
[61199]335 test -z "${QUICKSETUP}" && cleanup_modules
[61206]336 # This does not work for 2.4 series kernels. How sad.
337 test -n "${QUICKSETUP}" && test -f "${MODULE_DIR}/vboxguest.ko" && return 0
[72196]338 info "Building the VirtualBox Guest Additions kernel modules. This may take a while."
[35200]339
[63870]340 log "Building the main Guest Additions module."
[72196]341 if ! myerr=`$BUILDINTMP \
[61206]342 --save-module-symvers /tmp/vboxguest-Module.symvers \
343 --module-source $MODULE_SRC/vboxguest \
[72196]344 --no-print-directory install 2>&1`; then
[64718]345 # If check_module_dependencies.sh fails it prints a message itself.
[72196]346 module_build_log "$myerr"
[64718]347 "${INSTALL_DIR}"/other/check_module_dependencies.sh 2>&1 &&
348 info "Look at $LOG to find out what went wrong"
[66401]349 return 0
[61206]350 fi
[72196]351 log "Building the shared folder support module."
352 if ! myerr=`$BUILDINTMP \
[61206]353 --use-module-symvers /tmp/vboxguest-Module.symvers \
354 --module-source $MODULE_SRC/vboxsf \
[72196]355 --no-print-directory install 2>&1`; then
356 module_build_log "$myerr"
[63870]357 info "Look at $LOG to find out what went wrong"
[66401]358 return 0
[61206]359 fi
[72196]360 log "Building the graphics driver module."
361 if ! myerr=`$BUILDINTMP \
[61206]362 --use-module-symvers /tmp/vboxguest-Module.symvers \
363 --module-source $MODULE_SRC/vboxvideo \
[72196]364 --no-print-directory install 2>&1`; then
365 module_build_log "$myerr"
[63870]366 info "Look at $LOG to find out what went wrong"
[61206]367 fi
[65872]368 [ -d /etc/depmod.d ] || mkdir /etc/depmod.d
[64311]369 echo "override vboxguest * misc" > /etc/depmod.d/vboxvideo-upstream.conf
[64705]370 echo "override vboxsf * misc" >> /etc/depmod.d/vboxvideo-upstream.conf
371 echo "override vboxvideo * misc" >> /etc/depmod.d/vboxvideo-upstream.conf
[62844]372 depmod
[35200]373 return 0
374}
[24361]375
[66401]376create_vbox_user()
[35200]377{
[24361]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
[66401]384}
[31315]385
[66401]386create_udev_rule()
387{
[24361]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
[66401]412}
[24361]413
[66401]414create_module_rebuild_script()
415{
[61199]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
[61206]421test -d "/lib/modules/\${1}/build" || exit 0
[69086]422KERN_VER="\${1}" /sbin/rcvboxadd quicksetup
[61199]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
[66401]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
[62394]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
[62749]449 # the real path. The "chcon" is there as a back-up for old guests.
450 command -v semanage > /dev/null &&
[63890]451 semanage fcontext -a -t mount_exec_t "${INSTALL_DIR}/other/mount.vboxsf"
452 chcon -t mount_exec_t "${INSTALL_DIR}/other/mount.vboxsf"
[62394]453 fi
[35200]454}
455
456# setup_script
457setup()
458{
[39358]459 export BUILD_TYPE
460 export USERNAME
461
462 MODULE_SRC="$INSTALL_DIR/src/vboxguest-$INSTALL_VER"
463 BUILDINTMP="$MODULE_SRC/build_in_tmp"
[39756]464 chcon -t bin_t "$BUILDINTMP" > /dev/null 2>&1
[39358]465
[66423]466 test -z "${INSTALL_NO_MODULE_BUILDS}" && setup_modules
[66401]467 create_vbox_user
468 create_udev_rule
[66423]469 test -z "${INSTALL_NO_MODULE_BUILDS}" && create_module_rebuild_script
[66401]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"
[58820]474 fi
[66401]475 return 0
[15585]476}
477
[24361]478# cleanup_script
479cleanup()
480{
[66423]481 if test -z "${INSTALL_NO_MODULE_BUILDS}"; then
482 # Delete old versions of VBox modules.
483 cleanup_modules
484 depmod
[24361]485
[66423]486 # Remove old module sources
487 for i in $OLDMODULES; do
488 rm -rf /usr/src/$i-*
489 done
490 fi
[24531]491
[60103]492 # Clean-up X11-related bits
[72196]493 "${INSTALL_DIR}/init/vboxadd-x11" cleanup
[60103]494
[24361]495 # Remove other files
496 rm /sbin/mount.vboxsf 2>/dev/null
[66423]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
[24402]501 rm /etc/udev/rules.d/60-vboxadd.rules 2>/dev/null
[24361]502}
503
[15585]504dmnstatus()
505{
[21412]506 if running_vboxguest; then
[1]507 echo "The VirtualBox Additions are currently running."
508 else
509 echo "The VirtualBox Additions are not currently running."
510 fi
511}
512
[63870]513case "$2" in quiet)
514 QUIET=yes;;
515esac
[1]516case "$1" in
517start)
518 start
519 ;;
520stop)
521 stop
522 ;;
523restart)
524 restart
525 ;;
[15585]526setup)
[66423]527 setup
[66401]528 start
[15585]529 ;;
[61199]530quicksetup)
531 QUICKSETUP=yes
[61206]532 setup
[61199]533 ;;
[66413]534cleanup)
[66423]535 cleanup
[66413]536 ;;
[1]537status)
538 dmnstatus
539 ;;
540*)
[66423]541 echo "Usage: $0 {start|stop|restart|status|setup|quicksetup|cleanup} [quiet]"
[1]542 exit 1
543esac
544
545exit
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use