VirtualBox

source: vbox/trunk/src/VBox/Additions/linux/installer/install.sh.in@ 72196

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

Additions/linux: check for bzip2 and tar before starting installation.
bugref:9117: Linux GA installer failure on minimal OL7

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 19.4 KB
Line 
1#!/bin/sh
2#
3# Oracle VM VirtualBox
4# VirtualBox Makeself installation starter script
5# for Linux Guest Additions
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# Testing:
20# * After successful installation, 0 is returned if the vboxguest module version
21# built matches the one loaded and 2 is returned otherwise. E.g. VBoxClient
22# running will prevent vboxguest reloading.
23# * If the kernel modules cannot be built (run the installer with KERN_VER=none)
24# or loaded (run with KERN_VER=<installed non-current version>) then 1 is
25# returned.
26
27PATH=$PATH:/bin:/sbin:/usr/sbin
28
29# Note: These variable names must *not* clash with variables in $CONFIG_DIR/$CONFIG!
30PACKAGE="VBoxGuestAdditions"
31PACKAGE_NAME="VirtualBox Guest Additions"
32UNINSTALL="uninstall.sh"
33PUBLIC_UNINSTALL_HOOK="/usr/sbin/vbox-uninstall-guest-additions"
34ROUTINES="routines.sh"
35INSTALLATION_VER="_VERSION_"
36BUILD_TYPE="_BUILDTYPE_"
37USERNAME="_USERNAME_"
38UNINSTALL_SCRIPTS="vboxadd-x11 vboxvfs vboxadd-timesync vboxadd-service vboxadd"
39
40INSTALLATION_DIR="/opt/$PACKAGE-$INSTALLATION_VER"
41CONFIG_DIR="/var/lib/$PACKAGE"
42CONFIG="config"
43CONFIG_FILES="filelist"
44SELF=$1
45LOGFILE="/var/log/vboxadd-install.log"
46
47## Were we able to stop any previously running Additions kernel modules?
48MODULES_STOPPED=1
49
50. "./$ROUTINES"
51
52check_root
53
54check_deps bzip2 tar
55
56create_log "$LOGFILE"
57
58## @todo r=andy: Explain options like "force" and "no_setup" -- not self-explanatory
59# to the user.
60usage()
61{
62 info ""
63 info "Usage: $SELF install [<installation directory>]"
64 info " [--with-<module>] |"
65 info " uninstall"
66 info " [--force] [--no-setup]"
67 info ""
68 info "Example:"
69 info "$SELF install"
70 exit 1
71}
72
73# Create a symlink in the filesystem and add it to the list of package files
74add_symlink()
75{
76 self=add_symlink
77 ## Parameters:
78 # The file the link should point to
79 target="$1"
80 # The name of the actual symlink file. Must be an absolute path to a
81 # non-existing file in an existing directory.
82 link="$2"
83 link_dir="`dirname "$link"`"
84 test -n "$target" ||
85 { echo 1>&2 "$self: no target specified"; return 1; }
86 test -d "$link_dir" ||
87 { echo 1>&2 "$self: link directory $link_dir does not exist"; return 1; }
88 expr "$link" : "/.*" > /dev/null ||
89 { echo 1>&2 "$self: link file name is not absolute"; return 1; }
90 rm -f "$link"
91 ln -s "$target" "$link"
92 echo "$link" >> "$CONFIG_DIR/$CONFIG_FILES"
93}
94
95# Create symbolic links targeting all files in a directory in another
96# directory in the filesystem
97link_into_fs()
98{
99 ## Parameters:
100 # Directory containing the link target files
101 target_branch="$1"
102 # Directory to create the link files in
103 directory="$2"
104 for i in "$INSTALLATION_DIR/$target_branch"/*; do
105 test -e "$i" &&
106 add_symlink "$i" "$directory/`basename $i`"
107 done
108}
109
110# Look for broken installations or installations without a known uninstaller
111# and try to clean them up, asking the user first.
112def_uninstall()
113{
114 ## Parameters:
115 # Whether to force cleanup without asking the user
116 force="$1"
117
118 . ./deffiles
119 found=0
120 for i in "/opt/$PACKAGE-"*; do
121 test -e "$i" && found=1
122 done
123 for i in $DEFAULT_FILE_NAMES; do
124 test "$found" = 0 && test -e "$i" && found=1
125 done
126 test "$found" = 0 &&
127 for i in $DEFAULT_VERSIONED_FILE_NAMES; do
128 for j in $i-*; do
129 test "$found" = 0 && test -e "$j" && found=1
130 done
131 done
132 test "$found" = 0 && return 0
133 if ! test "$1" = "force" ; then
134 # Try to make the promised notification appear on next start.
135 VBoxControl guestproperty delete \
136 /VirtualBox/GuestAdd/HostVerLastChecked 2>&1 > /dev/null
137 cat 1>&2 << EOF
138This system appears to have a version of the VirtualBox Guest Additions
139already installed. If it is part of the operating system and kept up-to-date,
140there is most likely no need to replace it. If it is not up-to-date, you
141should get a notification when you start the system. If you wish to replace
142it with this version, please do not continue with this installation now, but
143instead remove the current version first, following the instructions for the
144operating system.
145
146If your system simply has the remains of a version of the Additions you could
147not remove you should probably continue now, and these will be removed during
148installation.
149
150Do you wish to continue? [yes or no]
151EOF
152 read reply dummy
153 if ! expr "$reply" : [yY] > /dev/null &&
154 ! expr "$reply" : [yY][eE][sS] > /dev/null
155 then
156 info
157 info "Cancelling installation."
158 return 1
159 fi
160 fi
161 # Stop what we can in the way of services and remove them from the
162 # system
163 for i in $UNINSTALL_SCRIPTS; do
164 stop_init_script "$i" 2>> "${LOGFILE}"
165 test -z "$NO_CLEANUP" && test -x "./$i" && "./$i" cleanup 1>&2 2>> "$LOGFILE"
166 delrunlevel "$i" 2>> "${LOGFILE}"
167 remove_init_script "$i" 2>> "${LOGFILE}"
168 done
169 for i in "/opt/$PACKAGE-"*/init; do
170 for j in $UNINSTALL_SCRIPTS; do
171 script="${i}/${j}"
172 test -x "${script}" && test -z "$NO_CLEANUP" &&
173 grep -q '^# *cleanup_script *$' "${script}" &&
174 "${script}" cleanup 1>&2 2>> "$LOGFILE"
175 done
176 done
177
178 # Get rid of any remaining files
179 for i in $DEFAULT_FILE_NAMES; do
180 rm -f "$i" 2> /dev/null
181 done
182 for i in $DEFAULT_VERSIONED_FILE_NAMES; do
183 rm -f "$i-"* 2> /dev/null
184 done
185 rm -f "/usr/lib/$PACKAGE" "/usr/lib64/$PACKAGE" "/usr/share/$PACKAGE" \
186 "/usr/lib/i386-linux-gnu/$PACKAGE" "/usr/lib/x86_64-linux-gnu/$PACKAGE"
187
188 # And any packages left under /opt
189 for i in "/opt/$PACKAGE-"*; do
190 test -d "$i" && rm -rf "$i"
191 done
192 return 0
193}
194
195info "$PACKAGE_NAME installer"
196
197# Check architecture
198cpu=`uname -m`;
199case "$cpu" in
200 i[3456789]86|x86)
201 cpu="x86"
202 lib_candidates="/usr/lib/i386-linux-gnu /usr/lib /lib"
203 ;;
204 x86_64|amd64)
205 cpu="amd64"
206 lib_candidates="/usr/lib/x86_64-linux-gnu /usr/lib64 /usr/lib /lib64 /lib"
207 ;;
208 *)
209 cpu="unknown"
210esac
211ARCH_PACKAGE="$PACKAGE-$cpu.tar.bz2"
212if [ ! -r "$ARCH_PACKAGE" ]; then
213 info "Detected unsupported $cpu machine type."
214 exit 1
215fi
216# Find the most appropriate libary folder by seeing which of the candidate paths
217# are actually in the shared linker path list and choosing the first. We look
218# for Debian-specific paths first, then LSB ones, then the new RedHat ones.
219libs=`ldconfig -v 2>/dev/null | grep -v ^$'\t'`
220for i in $lib_candidates; do
221 if echo $libs | grep -q $i; then
222 lib_path=$i
223 break
224 fi
225done
226if [ ! -x "$lib_path" ]; then
227 info "Unable to determine correct library path."
228 exit 1
229fi
230
231# Sensible default actions
232ACTION="install"
233DO_SETUP="true"
234NO_CLEANUP=""
235FORCE_UPGRADE=""
236
237while [ $# -ge 2 ];
238do
239 ARG=$2
240 shift
241
242 if [ -z "$MY_END_OF_OPTIONS" ]; then
243 case "$ARG" in
244
245 install)
246 ACTION="install"
247 ;;
248
249 uninstall)
250 ACTION="uninstall"
251 ;;
252
253 ## @todo Add per-module options handling, e.g. --lightdm-greeter-dir
254 # or --lightdm-config
255
256 ## @todo Add listing all available modules (+ their options, e.g.
257 # with callback mod_mymod_show_options?)
258
259 --with-*)
260 MODULE_CUR=`expr "$ARG" : '--with-\(.*\)'`
261 # Check if corresponding module in installer/module-$1 exists.
262 # Note: Module names may not contain spaces or other funny things.
263 if [ ! -f "./installer/module-${MODULE_CUR}" ]; then
264 info "Error: Module \"${MODULE_CUR}\" does not exist."
265 usage
266 fi
267 # Give the module the chance of doing initialization work / checks.
268 . "./installer/module-${MODULE_CUR}"
269 mod_${MODULE_CUR}_init
270 if test $? -ne 0; then
271 echo 1>&2 "Module '${MODULE_CUR}' failed to initialize"
272 if ! test "$FORCE_UPGRADE" = "force"; then
273 return 1
274 fi
275 # Continue initialization.
276 fi
277 # Add module to the list of modules to handle later.
278 if test -z "${INSTALLATION_MODULES_LIST}"; then
279 INSTALLATION_MODULES_LIST="${MODULE_CUR}"
280 else
281 INSTALLATION_MODULES_LIST="${INSTALLATION_MODULES_LIST} ${MODULE_CUR}"
282 fi
283 shift
284 ;;
285
286 --force|force) # Keep "force" for backwards compatibility.
287 FORCE_UPGRADE="force"
288 ;;
289
290 --no-setup|no_setup) # Keep "no_setup" for backwards compatibility.
291 DO_SETUP=""
292 ;;
293
294 --no-cleanup|no_cleanup) # Keep "no_cleanup" for backwards compatibility.
295 # Do not do cleanup of old modules when removing them. For
296 # testing purposes only.
297 DO_SETUP=""
298 NO_CLEANUP="no_cleanup"
299 ;;
300
301 --)
302 MY_END_OF_OPTIONS="1"
303 ;;
304
305 *)
306 if [ "`echo $1|cut -c1`" != "/" ]; then
307 info "Please specify an absolute path"
308 usage
309 fi
310 INSTALLATION_DIR="$1"
311 shift
312 ;;
313 esac
314 fi
315done
316
317# uninstall any previous installation
318# If the currently installed Additions have provided an uninstallation hook, try
319# that first.
320if test -x "${PUBLIC_UNINSTALL_HOOK}"; then
321 "${PUBLIC_UNINSTALL_HOOK}" 1>&2 ||
322 abort "Failed to remove existing installation. Aborting..."
323fi
324
325INSTALL_DIR=""
326uninstalled=0
327test -r "$CONFIG_DIR/$CONFIG" &&
328 eval `grep ^INSTALL_DIR= "$CONFIG_DIR/$CONFIG"` 2>/dev/null &&
329 eval `grep ^UNINSTALLER= "$CONFIG_DIR/$CONFIG"` 2>/dev/null
330if test -n "$INSTALL_DIR" -a -x "$INSTALL_DIR/$UNINSTALLER"; then
331 "$INSTALL_DIR/$UNINSTALLER" $NO_CLEANUP 1>&2 ||
332 abort "Failed to remove existing installation. Aborting..."
333 uninstalled=1
334fi
335test "$uninstalled" = 0 && def_uninstall "$FORCE_UPGRADE" && uninstalled=1
336test "$uninstalled" = 0 && exit 1
337rm -f "$CONFIG_DIR/$CONFIG"
338rm -f "$CONFIG_DIR/$CONFIG_FILES"
339rmdir "$CONFIG_DIR" 2>/dev/null
340test "$ACTION" = "install" || exit 0
341
342# Now check whether the kernel modules were stopped.
343lsmod | grep -q vboxguest && MODULES_STOPPED=
344
345# Choose a proper umask
346umask 022
347
348# Set installer modules directory
349INSTALLATION_MODULES_DIR="$INSTALLATION_DIR/installer/"
350
351# install the new version
352mkdir -p -m 755 "$CONFIG_DIR"
353test ! -d "$INSTALLATION_DIR" && REMOVE_INSTALLATION_DIR=1
354mkdir -p -m 755 "$INSTALLATION_DIR"
355
356# install and load installer modules
357if [ -d installer ]; then
358 info "Copying additional installer modules ..."
359 mkdir -p -m 755 "$INSTALLATION_MODULES_DIR"
360 for CUR_FILE in `ls installer/*`; do
361 install -p -m 755 "$CUR_FILE" "$INSTALLATION_MODULES_DIR"
362 if [ $? -ne 0 ]; then
363 info "Error: Failed to copy installer module \"$CUR_FILE\""
364 if ! test "$FORCE_UPGRADE" = "force"; then
365 exit 1
366 fi
367 fi
368 done
369fi
370
371# Create a list of the files in the archive, skipping any directories which
372# already exist in the filesystem.
373bzip2 -d -c "$ARCH_PACKAGE" | tar -tf - |
374 while read name; do
375 fullname="$INSTALLATION_DIR/$name"
376 case "$fullname" in
377 */)
378 test ! -d "$fullname" &&
379 echo "$fullname" >> "$CONFIG_DIR/$CONFIG_FILES"
380 ;;
381 *)
382 echo "$fullname" >> "$CONFIG_DIR/$CONFIG_FILES"
383 ;;
384 esac
385 done
386bzip2 -d -c "$ARCH_PACKAGE" | tar -xf - -C "$INSTALLATION_DIR" || exit 1
387
388# Set symlinks into /usr and /sbin
389link_into_fs "bin" "/usr/bin"
390link_into_fs "sbin" "/usr/sbin"
391link_into_fs "lib" "$lib_path"
392add_symlink "$INSTALLATION_DIR/lib/$PACKAGE" /usr/lib/"$PACKAGE"
393link_into_fs "src" "/usr/src"
394
395if [ -d "$INSTALLATION_MODULES_DIR" ]; then
396 info "Installing additional modules ..."
397 for CUR_MODULE in `find "$INSTALLATION_MODULES_DIR" 2>/dev/null`
398 do
399 echo "$CUR_MODULE" >> "$CONFIG_DIR/$CONFIG_FILES"
400 done
401fi
402
403for CUR_MODULE in ${INSTALLATION_MODULES_LIST}
404do
405 mod_${CUR_MODULE}_install
406 if [ $? -ne 0 ]; then
407 info "Error: Failed to install module \"$CUR_MODULE\""
408 if ! test "$FORCE_UPGRADE" = "force"; then
409 exit 1
410 fi
411 fi
412done
413
414# Remember our installation configuration before we call any init scripts
415cat > "$CONFIG_DIR/$CONFIG" << EOF
416# $PACKAGE installation record.
417# Package installation directory
418INSTALL_DIR='$INSTALLATION_DIR'
419# Additional installation modules
420INSTALL_MODULES_DIR='$INSTALLATION_MODULES_DIR'
421INSTALL_MODULES_LIST='$INSTALLATION_MODULES_LIST'
422# Package uninstaller. If you repackage this software, please make sure
423# that this prints a message and returns an error so that the default
424# uninstaller does not attempt to delete the files installed by your
425# package.
426UNINSTALLER='$UNINSTALL'
427# Package version
428INSTALL_VER='$INSTALLATION_VER'
429# Build type and user name for logging purposes
430BUILD_TYPE='$BUILD_TYPE'
431USERNAME='$USERNAME'
432EOF
433
434# Give the modules the chance to write their stuff
435# to the installation config as well.
436if [ -n "${INSTALLATION_MODULES_LIST}" ]; then
437 info "Saving modules configuration ..."
438 for CUR_MODULE in ${INSTALLATION_MODULES_LIST}
439 do
440 echo "`mod_${CUR_MODULE}_config_save`" >> "$CONFIG_DIR/$CONFIG"
441 done
442fi
443
444"$INSTALLATION_DIR/init/vboxadd" setup 1>&2 2>> "${LOGFILE}"
445
446# Install, set up and start init scripts
447for i in "$INSTALLATION_DIR/init/vboxadd" "$INSTALLATION_DIR/init/vboxadd-service"; do
448 install_init_script "$i" "`basename "$i"`" 2>> "${LOGFILE}"
449 addrunlevel "`basename "$i"`" 2>> "${LOGFILE}"
450 start_init_script "`basename "$i"`" 2>> "${LOGFILE}"
451done
452
453cp $ROUTINES $INSTALLATION_DIR
454echo $INSTALLATION_DIR/$ROUTINES >> "$CONFIG_DIR/$CONFIG_FILES"
455cat > $INSTALLATION_DIR/$UNINSTALL << EOF
456#!/bin/sh
457# Auto-generated uninstallation file
458
459PATH=\$PATH:/bin:/sbin:/usr/sbin
460LOGFILE="/var/log/vboxadd-uninstall.log"
461
462# Read routines.sh
463if ! test -r "$INSTALLATION_DIR/$ROUTINES"; then
464 echo 1>&2 "Required file $ROUTINES not found. Aborting..."
465 return 1
466fi
467. "$INSTALLATION_DIR/$ROUTINES"
468
469# We need to be run as root
470check_root
471
472create_log "\$LOGFILE"
473
474echo 1>&2 "Removing installed version $INSTALLATION_VER of $PACKAGE_NAME..."
475
476NO_CLEANUP=""
477if test "\$1" = "no_cleanup"; then
478 shift
479 NO_CLEANUP="no_cleanup"
480fi
481
482test -r "$CONFIG_DIR/$CONFIG_FILES" || abort "Required file $CONFIG_FILES not found. Aborting..."
483
484# Stop and clean up all services
485for i in "$INSTALLATION_DIR/init/vboxadd-service" "$INSTALLATION_DIR/init/vboxadd"; do
486 if test -r "\$i"; then
487 stop_init_script "\`basename "\$i"\`" 2>> "${LOGFILE}"
488 test -z "\${NO_CLEANUP}" && grep -q '^# *cleanup_script *$' "\${i}" && "\${i}" cleanup 2>> "\$LOGFILE"
489 delrunlevel "\`basename "\$i"\`" 2>> "${LOGFILE}"
490 remove_init_script "\`basename "\$i"\`" 2>> "${LOGFILE}"
491 fi
492done
493
494# Load all modules
495# Important: This needs to be done before loading the configuration
496# value below to not override values which are set to a default
497# value in the modules itself.
498for CUR_MODULE in `find "$INSTALLATION_MODULES_DIR" -name "module-*" 2>/dev/null`
499 do
500 . "\$CUR_MODULE"
501 done
502
503# Load configuration values
504test -r "$CONFIG_DIR/$CONFIG" && . "$CONFIG_DIR/$CONFIG"
505
506# Call uninstallation initialization of all modules
507for CUR_MODULE in "$INSTALLATION_MODULES_LIST"
508 do
509 if test -z "\$CUR_MODULE"; then
510 continue
511 fi
512 mod_\${CUR_MODULE}_pre_uninstall
513 if [ $? -ne 0 ]; then
514 echo 1>&2 "Module \"\$CUR_MODULE\" failed to initialize uninstallation"
515 # Continue initialization.
516 fi
517 done
518
519# Call uninstallation of all modules
520for CUR_MODULE in "$INSTALLATION_MODULES_LIST"
521 do
522 if test -z "\$CUR_MODULE"; then
523 continue
524 fi
525 mod_\${CUR_MODULE}_uninstall
526 if [ $? -ne 0 ]; then
527 echo 1>&2 "Module \"\$CUR_MODULE\" failed to uninstall"
528 # Continue uninstallation.
529 fi
530 done
531
532# And remove all files and empty installation directories
533# Remove any non-directory entries
534cat "$CONFIG_DIR/$CONFIG_FILES" | xargs rm 2>/dev/null
535# Remove any empty (of files) directories in the file list
536cat "$CONFIG_DIR/$CONFIG_FILES" |
537 while read file; do
538 case "\$file" in
539 */)
540 test -d "\$file" &&
541 find "\$file" -depth -type d -exec rmdir '{}' ';' 2>/dev/null
542 ;;
543 esac
544 done
545
546# Remove configuration files
547rm "$CONFIG_DIR/$CONFIG_FILES" 2>/dev/null
548rm "$CONFIG_DIR/$CONFIG" 2>/dev/null
549rmdir "$CONFIG_DIR" 2>/dev/null
550exit 0
551EOF
552chmod 0755 $INSTALLATION_DIR/$UNINSTALL
553echo $INSTALLATION_DIR/$UNINSTALL >> "$CONFIG_DIR/$CONFIG_FILES"
554test -n "$REMOVE_INSTALLATION_DIR" &&
555 echo "$INSTALLATION_DIR/" >> "$CONFIG_DIR/$CONFIG_FILES"
556
557cat > "${PUBLIC_UNINSTALL_HOOK}" << EOF
558#!/bin/sh
559# This executable provides a well-known way to uninstall VirtualBox Guest
560# Additions in order to re-install them from a different source. A common case
561# is uninstalling distribution-provide Additions to install the version provided
562# by VirtualBox. Distributions should put the right command in here to do the
563# removal, e.g. "dnf remove VirtualBox-guest-additions". Leaving kernel modules
564# provided by the distribution kernel package in place is acceptable if the
565# location does not clash with the VirtualBox-provided module location (misc).
566$INSTALLATION_DIR/$UNINSTALL
567EOF
568chmod 0755 "${PUBLIC_UNINSTALL_HOOK}"
569echo "$PUBLIC_UNINSTALL_HOOK" >> "$CONFIG_DIR/$CONFIG_FILES"
570
571# Test for a problem with old Mesa versions which stopped our 3D libraries
572# from working. Known to affect Debian 7.11, probably OL/RHEL 5.
573# The problem was that the system Mesa library had an ABI note, which caused
574# ldconfig to always prefer it to ours.
575if ldconfig -p | grep -q "libGL.so.1.*Linux 2.4"; then
576 gl_with_abi=`ldconfig -p | grep "libGL.so.1.*Linux 2.4" | sed 's/.*=> //'`
577 cat >&2 << EOF
578This system appears to be running a version of Mesa with a known problem
579which will prevent VirtualBox 3D pass-through from working. See
580 https://bugs.freedesktop.org/show_bug.cgi?id=26663
581The following, run as root should fix this, though you will have to run it
582again if the system version of Mesa is updated:
583EOF
584 for i in ${gl_with_abi}; do
585 echo >&2 " strip -R .note.ABI-tag ${i}"
586 done
587 echo >&2 " ldconfig"
588fi
589
590# And do a final test as to whether the kernel modules were properly created
591# and loaded. Return 0 if both are true, 1 if the modules could not be built
592# or loaded (except due to already running older modules) and 2 if already
593# running modules probably prevented new ones from loading. vboxvideo is
594# currently not tested.
595# Assume that we have already printed enough messages by now and stay silent.
596modinfo vboxguest >/dev/null 2>&1 || exit 1
597lsmod | grep -q vboxguest || exit 1
598test -n "${MODULES_STOPPED}" || exit 2
599exit 0
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use