VirtualBox

source: vbox/trunk/src/VBox/Installer/linux/install.sh@ 78800

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

Installer/Linux: reactivate force installer switch.
bugref:9478: Linux installer too interactive for automated testing.
Our Makeself Linux installer has a switch (force without dashes) to make it
skip the test for already installed components which might get overwritten.
However this switch seems to have got broken at some point. This change
reenables it.

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 15.2 KB
Line 
1#!/bin/sh
2#
3# Oracle VM VirtualBox
4# VirtualBox linux installation script
5
6#
7# Copyright (C) 2007-2019 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# Testing:
19# * After successful installation, 0 is returned if the vboxdrv module version
20# built matches the one loaded.
21# * If the kernel modules cannot be built (run the installer with KERN_VER=none)
22# or loaded (run with KERN_VER=<installed non-current version>)
23# then 1 is returned.
24
25PATH=$PATH:/bin:/sbin:/usr/sbin
26
27# Include routines and utilities needed by the installer
28. ./routines.sh
29
30LOG="/var/log/vbox-install.log"
31VERSION="_VERSION_"
32SVNREV="_SVNREV_"
33BUILD="_BUILD_"
34ARCH="_ARCH_"
35HARDENED="_HARDENED_"
36# The "BUILD_" prefixes prevent the variables from being overwritten when we
37# read the configuration from the previous installation.
38BUILD_BUILDTYPE="_BUILDTYPE_"
39BUILD_USERNAME="_USERNAME_"
40CONFIG_DIR="/etc/vbox"
41CONFIG="vbox.cfg"
42CONFIG_FILES="filelist"
43DEFAULT_FILES=`pwd`/deffiles
44GROUPNAME="vboxusers"
45INSTALLATION_DIR="_INSTALLATION_DIR_"
46LICENSE_ACCEPTED=""
47PREV_INSTALLATION=""
48PYTHON="_PYTHON_"
49ACTION=""
50SELF=$1
51RC_SCRIPT=0
52if [ -n "$HARDENED" ]; then
53 VBOXDRV_MODE=0600
54 VBOXDRV_GRP="root"
55else
56 VBOXDRV_MODE=0660
57 VBOXDRV_GRP=$GROUPNAME
58fi
59VBOXUSB_MODE=0664
60VBOXUSB_GRP=$GROUPNAME
61
62## Were we able to stop any previously running Additions kernel modules?
63MODULES_STOPPED=1
64
65
66##############################################################################
67# Helper routines #
68##############################################################################
69
70usage() {
71 info ""
72 info "Usage: install | uninstall"
73 info ""
74 info "Example:"
75 info "$SELF install"
76 exit 1
77}
78
79module_loaded() {
80 lsmod | grep -q "vboxdrv[^_-]"
81}
82
83# This routine makes sure that there is no previous installation of
84# VirtualBox other than one installed using this install script or a
85# compatible method. We do this by checking for any of the VirtualBox
86# applications in /usr/bin. If these exist and are not symlinks into
87# the installation directory, then we assume that they are from an
88# incompatible previous installation.
89
90## Helper routine: test for a particular VirtualBox binary and see if it
91## is a link into a previous installation directory
92##
93## Arguments: 1) the binary to search for and
94## 2) the installation directory (if any)
95## Returns: false if an incompatible version was detected, true otherwise
96check_binary() {
97 binary=$1
98 install_dir=$2
99 test ! -e $binary 2>&1 > /dev/null ||
100 ( test -n "$install_dir" &&
101 readlink $binary 2>/dev/null | grep "$install_dir" > /dev/null
102 )
103}
104
105## Main routine
106##
107## Argument: the directory where the previous installation should be
108## located. If this is empty, then we will assume that any
109## installation of VirtualBox found is incompatible with this one.
110## Returns: false if an incompatible installation was found, true otherwise
111check_previous() {
112 install_dir=$1
113 # These should all be symlinks into the installation folder
114 check_binary "/usr/bin/VirtualBox" "$install_dir" &&
115 check_binary "/usr/bin/VBoxManage" "$install_dir" &&
116 check_binary "/usr/bin/VBoxSDL" "$install_dir" &&
117 check_binary "/usr/bin/VBoxVRDP" "$install_dir" &&
118 check_binary "/usr/bin/VBoxHeadless" "$install_dir" &&
119 check_binary "/usr/bin/VBoxDTrace" "$install_dir" &&
120 check_binary "/usr/bin/VBoxBugReport" "$install_dir" &&
121 check_binary "/usr/bin/VBoxBalloonCtrl" "$install_dir" &&
122 check_binary "/usr/bin/VBoxAutostart" "$install_dir" &&
123 check_binary "/usr/bin/vboxwebsrv" "$install_dir" &&
124 check_binary "/usr/bin/vbox-img" "$install_dir" &&
125 check_binary "/sbin/rcvboxdrv" "$install_dir"
126}
127
128##############################################################################
129# Main script #
130##############################################################################
131
132info "VirtualBox Version $VERSION r$SVNREV ($BUILD) installer"
133
134
135# Make sure that we were invoked as root...
136check_root
137
138# Set up logging before anything else
139create_log $LOG
140
141log "VirtualBox $VERSION r$SVNREV installer, built $BUILD."
142log ""
143log "Testing system setup..."
144
145# Sanity check: figure out whether build arch matches uname arch
146cpu=`uname -m`;
147case "$cpu" in
148 i[3456789]86|x86)
149 cpu="x86"
150 ;;
151 x86_64)
152 cpu="amd64"
153 ;;
154esac
155if [ "$cpu" != "$ARCH" ]; then
156 info "Detected unsupported $cpu environment."
157 log "Detected unsupported $cpu environment."
158 exit 1
159fi
160
161# Sensible default actions
162ACTION="install"
163BUILD_MODULE="true"
164unset FORCE_UPGRADE
165while true
166do
167 if [ "$2" = "" ]; then
168 break
169 fi
170 shift
171 case "$1" in
172 install|--install)
173 ACTION="install"
174 ;;
175
176 uninstall|--uninstall)
177 ACTION="uninstall"
178 ;;
179
180 force|--force)
181 FORCE_UPGRADE=1
182 ;;
183 license_accepted_unconditionally|--license_accepted_unconditionally)
184 # Legacy option
185 ;;
186 no_module|--no_module)
187 BUILD_MODULE=""
188 ;;
189 *)
190 if [ "$ACTION" = "" ]; then
191 info "Unknown command '$1'."
192 usage
193 fi
194 info "Specifying an installation path is not allowed -- using _INSTALLATION_DIR_!"
195 ;;
196 esac
197done
198
199if [ "$ACTION" = "install" ]; then
200 # Choose a proper umask
201 umask 022
202
203 # Find previous installation
204 if test -r "$CONFIG_DIR/$CONFIG"; then
205 . $CONFIG_DIR/$CONFIG
206 PREV_INSTALLATION=$INSTALL_DIR
207 fi
208 if ! check_previous $INSTALL_DIR && test -z "$FORCE_UPGRADE"
209 then
210 info
211 info "You appear to have a version of VirtualBox on your system which was installed"
212 info "from a different source or using a different type of installer (or a damaged"
213 info "installation of VirtualBox). We strongly recommend that you remove it before"
214 info "installing this version of VirtualBox."
215 info
216 info "Do you wish to continue anyway? [yes or no]"
217 read reply dummy
218 if ! expr "$reply" : [yY] && ! expr "$reply" : [yY][eE][sS]
219 then
220 info
221 info "Cancelling installation."
222 log "User requested cancellation of the installation"
223 exit 1
224 fi
225 fi
226
227 # Do additional clean-up in case some-one is running from a build folder.
228 ./prerm-common.sh || exit 1
229
230 # Remove previous installation
231 test "${BUILD_MODULE}" = true || VBOX_DONT_REMOVE_OLD_MODULES=1
232
233 if [ -n "$PREV_INSTALLATION" ]; then
234 [ -n "$INSTALL_REV" ] && INSTALL_REV=" r$INSTALL_REV"
235 info "Removing previous installation of VirtualBox $INSTALL_VER$INSTALL_REV from $PREV_INSTALLATION"
236 log "Removing previous installation of VirtualBox $INSTALL_VER$INSTALL_REV from $PREV_INSTALLATION"
237 log ""
238
239 VBOX_NO_UNINSTALL_MESSAGE=1
240 # This also checks $BUILD_MODULE and $VBOX_DONT_REMOVE_OLD_MODULES
241 . ./uninstall.sh
242 fi
243
244 mkdir -p -m 755 $CONFIG_DIR
245 touch $CONFIG_DIR/$CONFIG
246
247 info "Installing VirtualBox to $INSTALLATION_DIR"
248 log "Installing VirtualBox to $INSTALLATION_DIR"
249 log ""
250
251 # Verify the archive
252 mkdir -p -m 755 $INSTALLATION_DIR
253 bzip2 -d -c VirtualBox.tar.bz2 > VirtualBox.tar
254 if ! tar -tf VirtualBox.tar > $CONFIG_DIR/$CONFIG_FILES; then
255 rmdir $INSTALLATION_DIR 2> /dev/null
256 rm -f $CONFIG_DIR/$CONFIG 2> /dev/null
257 rm -f $CONFIG_DIR/$CONFIG_FILES 2> /dev/null
258 log 'Error running "bzip2 -d -c VirtualBox.tar.bz2" or "tar -tf VirtualBox.tar".'
259 abort "Error installing VirtualBox. Installation aborted"
260 fi
261
262 # Create installation directory and install
263 if ! tar -xf VirtualBox.tar -C $INSTALLATION_DIR; then
264 cwd=`pwd`
265 cd $INSTALLATION_DIR
266 rm -f `cat $CONFIG_DIR/$CONFIG_FILES` 2> /dev/null
267 cd $pwd
268 rmdir $INSTALLATION_DIR 2> /dev/null
269 rm -f $CONFIG_DIR/$CONFIG 2> /dev/null
270 log 'Error running "tar -xf VirtualBox.tar -C '"$INSTALLATION_DIR"'".'
271 abort "Error installing VirtualBox. Installation aborted"
272 fi
273
274 cp uninstall.sh $INSTALLATION_DIR
275 echo "uninstall.sh" >> $CONFIG_DIR/$CONFIG_FILES
276
277 # Hardened build: Mark selected binaries set-user-ID-on-execution,
278 # create symlinks for working around unsupported $ORIGIN/.. in VBoxC.so (setuid),
279 # and finally make sure the directory is only writable by the user (paranoid).
280 if [ -n "$HARDENED" ]; then
281 if [ -f $INSTALLATION_DIR/VirtualBoxVM ]; then
282 test -e $INSTALLATION_DIR/VirtualBoxVM && chmod 4511 $INSTALLATION_DIR/VirtualBoxVM
283 else
284 test -e $INSTALLATION_DIR/VirtualBox && chmod 4511 $INSTALLATION_DIR/VirtualBox
285 fi
286 test -e $INSTALLATION_DIR/VBoxSDL && chmod 4511 $INSTALLATION_DIR/VBoxSDL
287 test -e $INSTALLATION_DIR/VBoxHeadless && chmod 4511 $INSTALLATION_DIR/VBoxHeadless
288 test -e $INSTALLATION_DIR/VBoxNetDHCP && chmod 4511 $INSTALLATION_DIR/VBoxNetDHCP
289 test -e $INSTALLATION_DIR/VBoxNetNAT && chmod 4511 $INSTALLATION_DIR/VBoxNetNAT
290
291 ln -sf $INSTALLATION_DIR/VBoxVMM.so $INSTALLATION_DIR/components/VBoxVMM.so
292 ln -sf $INSTALLATION_DIR/VBoxRT.so $INSTALLATION_DIR/components/VBoxRT.so
293
294 chmod go-w $INSTALLATION_DIR
295 fi
296
297 # This binaries need to be suid root in any case, even if not hardened
298 test -e $INSTALLATION_DIR/VBoxNetAdpCtl && chmod 4511 $INSTALLATION_DIR/VBoxNetAdpCtl
299 test -e $INSTALLATION_DIR/VBoxVolInfo && chmod 4511 $INSTALLATION_DIR/VBoxVolInfo
300
301 # Write the configuration. Needs to be done before the vboxdrv service is
302 # started.
303 echo "# VirtualBox installation directory" > $CONFIG_DIR/$CONFIG
304 echo "INSTALL_DIR='$INSTALLATION_DIR'" >> $CONFIG_DIR/$CONFIG
305 echo "# VirtualBox version" >> $CONFIG_DIR/$CONFIG
306 echo "INSTALL_VER='$VERSION'" >> $CONFIG_DIR/$CONFIG
307 echo "INSTALL_REV='$SVNREV'" >> $CONFIG_DIR/$CONFIG
308 echo "# Build type and user name for logging purposes" >> $CONFIG_DIR/$CONFIG
309 echo "BUILD_TYPE='$BUILD_BUILDTYPE'" >> $CONFIG_DIR/$CONFIG
310 echo "USERNAME='$BUILD_USERNAME'" >> $CONFIG_DIR/$CONFIG
311
312 # Create users group
313 groupadd -r -f $GROUPNAME 2> /dev/null
314
315 # Create symlinks to start binaries
316 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VirtualBox
317 if [ -f $INSTALLATION_DIR/VirtualBoxVM ]; then
318 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VirtualBoxVM
319 fi
320 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxManage
321 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxSDL
322 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxVRDP
323 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxHeadless
324 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxBalloonCtrl
325 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxBugReport
326 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxAutostart
327 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/vboxwebsrv
328 ln -sf $INSTALLATION_DIR/vbox-img /usr/bin/vbox-img
329 ln -sf $INSTALLATION_DIR/VBox.png /usr/share/pixmaps/VBox.png
330 if [ -f $INSTALLATION_DIR/VBoxDTrace ]; then
331 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxDTrace
332 fi
333 # Unity and Nautilus seem to look here for their icons
334 ln -sf $INSTALLATION_DIR/icons/128x128/virtualbox.png /usr/share/pixmaps/virtualbox.png
335 ln -sf $INSTALLATION_DIR/virtualbox.desktop /usr/share/applications/virtualbox.desktop
336 ln -sf $INSTALLATION_DIR/virtualbox.xml /usr/share/mime/packages/virtualbox.xml
337 ln -sf $INSTALLATION_DIR/rdesktop-vrdp /usr/bin/rdesktop-vrdp
338 ln -sf $INSTALLATION_DIR/src/vboxhost /usr/src/vboxhost-_VERSION_
339
340 # Convenience symlinks. The creation fails if the FS is not case sensitive
341 ln -sf VirtualBox /usr/bin/virtualbox > /dev/null 2>&1
342 if [ -f $INSTALLATION_DIR/VirtualBoxVM ]; then
343 ln -sf VirtualBoxVM /usr/bin/virtualboxvm > /dev/null 2>&1
344 fi
345 ln -sf VBoxManage /usr/bin/vboxmanage > /dev/null 2>&1
346 ln -sf VBoxSDL /usr/bin/vboxsdl > /dev/null 2>&1
347 ln -sf VBoxHeadless /usr/bin/vboxheadless > /dev/null 2>&1
348 ln -sf VBoxBugReport /usr/bin/vboxbugreport > /dev/null 2>&1
349 if [ -f $INSTALLATION_DIR/VBoxDTrace ]; then
350 ln -sf VBoxDTrace /usr/bin/vboxdtrace > /dev/null 2>&1
351 fi
352
353 # Create legacy symlinks if necesary for Qt5/xcb stuff.
354 if [ -d $INSTALLATION_DIR/legacy ]; then
355 if ! /sbin/ldconfig -p | grep -q "\<libxcb\.so\.1\>"; then
356 for f in `ls -1 $INSTALLATION_DIR/legacy/`; do
357 ln -s $INSTALLATION_DIR/legacy/$f $INSTALLATION_DIR/$f
358 echo $INSTALLATION_DIR/$f >> $CONFIG_DIR/$CONFIG_FILES
359 done
360 fi
361 fi
362
363 # Icons
364 cur=`pwd`
365 cd $INSTALLATION_DIR/icons
366 for i in *; do
367 cd $i
368 if [ -d /usr/share/icons/hicolor/$i ]; then
369 for j in *; do
370 if expr "$j" : "virtualbox\..*" > /dev/null; then
371 dst=apps
372 else
373 dst=mimetypes
374 fi
375 if [ -d /usr/share/icons/hicolor/$i/$dst ]; then
376 ln -s $INSTALLATION_DIR/icons/$i/$j /usr/share/icons/hicolor/$i/$dst/$j
377 echo /usr/share/icons/hicolor/$i/$dst/$j >> $CONFIG_DIR/$CONFIG_FILES
378 fi
379 done
380 fi
381 cd -
382 done
383 cd $cur
384
385 # Update the MIME database
386 update-mime-database /usr/share/mime 2>/dev/null
387
388 # Update the desktop database
389 update-desktop-database -q 2>/dev/null
390
391 # If Python is available, install Python bindings
392 if [ -n "$PYTHON" ]; then
393 maybe_run_python_bindings_installer $INSTALLATION_DIR $CONFIG_DIR $CONFIG_FILES
394 fi
395
396 # Do post-installation common to all installer types, currently service
397 # script set-up.
398 if test "${BUILD_MODULE}" = "true"; then
399 START_SERVICES=
400 else
401 START_SERVICES="--nostart"
402 fi
403 "${INSTALLATION_DIR}/prerm-common.sh" >> "${LOG}"
404
405 # Now check whether the kernel modules were stopped.
406 lsmod | grep -q vboxdrv && MODULES_STOPPED=
407
408 "${INSTALLATION_DIR}/postinst-common.sh" ${START_SERVICES} >> "${LOG}"
409
410 info ""
411 info "VirtualBox has been installed successfully."
412 info ""
413 info "You will find useful information about using VirtualBox in the user manual"
414 info " $INSTALLATION_DIR/UserManual.pdf"
415 info "and in the user FAQ"
416 info " http://www.virtualbox.org/wiki/User_FAQ"
417 info ""
418 info "We hope that you enjoy using VirtualBox."
419 info ""
420
421 # And do a final test as to whether the kernel modules were properly created
422 # and loaded. Return 0 if both are true, 1 if not.
423 test -n "${MODULES_STOPPED}" &&
424 modinfo vboxdrv >/dev/null 2>&1 &&
425 lsmod | grep -q vboxdrv ||
426 abort "The installation log file is at ${LOG}."
427
428 log "Installation successful"
429elif [ "$ACTION" = "uninstall" ]; then
430 . ./uninstall.sh
431fi
432exit $RC_SCRIPT
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette