VirtualBox

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

Last change on this file since 57711 was 57711, checked in by vboxsync, 9 years ago

Installer/linux: refactored service script handling to external, hopefully installer-type agnostic scripts.

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 17.9 KB
Line 
1#!/bin/sh
2#
3# Oracle VM VirtualBox
4# VirtualBox linux installation script
5
6#
7# Copyright (C) 2007-2015 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
18PATH=$PATH:/bin:/sbin:/usr/sbin
19
20# Include routines and utilities needed by the installer
21. ./routines.sh
22#include installer-common.sh
23
24LOG="/var/log/vbox-install.log"
25VERSION="_VERSION_"
26SVNREV="_SVNREV_"
27BUILD="_BUILD_"
28ARCH="_ARCH_"
29HARDENED="_HARDENED_"
30# The "BUILD_" prefixes prevent the variables from being overwritten when we
31# read the configuration from the previous installation.
32BUILD_BUILDTYPE="_BUILDTYPE_"
33BUILD_USERNAME="_USERNAME_"
34CONFIG_DIR="/etc/vbox"
35CONFIG="vbox.cfg"
36CONFIG_FILES="filelist"
37DEFAULT_FILES=`pwd`/deffiles
38GROUPNAME="vboxusers"
39INSTALLATION_DIR="/opt/VirtualBox"
40LICENSE_ACCEPTED=""
41PREV_INSTALLATION=""
42PYTHON="_PYTHON_"
43ACTION=""
44SELF=$1
45DKMS=`which dkms 2> /dev/null`
46RC_SCRIPT=0
47if [ -n "$HARDENED" ]; then
48 VBOXDRV_MODE=0600
49 VBOXDRV_GRP="root"
50else
51 VBOXDRV_MODE=0660
52 VBOXDRV_GRP=$GROUPNAME
53fi
54VBOXUSB_MODE=0664
55VBOXUSB_GRP=$GROUPNAME
56
57
58##############################################################################
59# Helper routines #
60##############################################################################
61
62usage() {
63 info ""
64 info "Usage: install | uninstall"
65 info ""
66 info "Example:"
67 info "$SELF install"
68 exit 1
69}
70
71module_loaded() {
72 lsmod | grep -q "vboxdrv[^_-]"
73}
74
75# This routine makes sure that there is no previous installation of
76# VirtualBox other than one installed using this install script or a
77# compatible method. We do this by checking for any of the VirtualBox
78# applications in /usr/bin. If these exist and are not symlinks into
79# the installation directory, then we assume that they are from an
80# incompatible previous installation.
81
82## Helper routine: test for a particular VirtualBox binary and see if it
83## is a link into a previous installation directory
84##
85## Arguments: 1) the binary to search for and
86## 2) the installation directory (if any)
87## Returns: false if an incompatible version was detected, true otherwise
88check_binary() {
89 binary=$1
90 install_dir=$2
91 test ! -e $binary 2>&1 > /dev/null ||
92 ( test -n "$install_dir" &&
93 readlink $binary 2>/dev/null | grep "$install_dir" > /dev/null
94 )
95}
96
97## Main routine
98##
99## Argument: the directory where the previous installation should be
100## located. If this is empty, then we will assume that any
101## installation of VirtualBox found is incompatible with this one.
102## Returns: false if an incompatible installation was found, true otherwise
103check_previous() {
104 install_dir=$1
105 # These should all be symlinks into the installation folder
106 check_binary "/usr/bin/VirtualBox" "$install_dir" &&
107 check_binary "/usr/bin/VBoxManage" "$install_dir" &&
108 check_binary "/usr/bin/VBoxSDL" "$install_dir" &&
109 check_binary "/usr/bin/VBoxVRDP" "$install_dir" &&
110 check_binary "/usr/bin/VBoxHeadless" "$install_dir" &&
111 check_binary "/usr/bin/VBoxDTrace" "$install_dir" &&
112 check_binary "/usr/bin/VBoxBalloonCtrl" "$install_dir" &&
113 check_binary "/usr/bin/VBoxAutostart" "$install_dir" &&
114 check_binary "/usr/bin/vboxwebsrv" "$install_dir" &&
115 check_binary "/usr/bin/vbox-img" "$install_dir" &&
116 check_binary "/sbin/rcvboxdrv" "$install_dir"
117}
118
119##############################################################################
120# Main script #
121##############################################################################
122
123info "VirtualBox Version $VERSION r$SVNREV ($BUILD) installer"
124
125
126# Make sure that we were invoked as root...
127check_root
128
129# Set up logging before anything else
130create_log $LOG
131
132# Now stop the autostart service otherwise it will keep VBoxSVC running
133stop_init_script vboxautostart-service
134
135# Now stop the ballon control service otherwise it will keep VBoxSVC running
136stop_init_script vboxballoonctrl-service
137
138# Now stop the web service otherwise it will keep VBoxSVC running
139stop_init_script vboxweb-service
140
141# Now check if no VBoxSVC daemon is running
142check_running
143
144log "VirtualBox $VERSION r$SVNREV installer, built $BUILD."
145log ""
146log "Testing system setup..."
147
148# Sanity check: figure out whether build arch matches uname arch
149cpu=`uname -m`;
150case "$cpu" in
151 i[3456789]86|x86)
152 cpu="x86"
153 ;;
154 x86_64)
155 cpu="amd64"
156 ;;
157esac
158if [ "$cpu" != "$ARCH" ]; then
159 info "Detected unsupported $cpu environment."
160 log "Detected unsupported $cpu environment."
161 exit 1
162fi
163
164# Check that the system is setup correctly for the installation
165have_bzip2="`check_bzip2; echo $?`" # Do we have bzip2?
166have_gmake="`check_gmake; echo $?`" # Do we have GNU make?
167have_ksource="`check_ksource; echo $?`" # Can we find the kernel source?
168have_gcc="`check_gcc; echo $?`" # Is GCC installed?
169
170if [ $have_bzip2 -eq 1 -o $have_gmake -eq 1 -o $have_ksource -eq 1 \
171 -o $have_gcc -eq 1 ]; then
172 info "Problems were found which would prevent VirtualBox from installing."
173 info "Please correct these problems and try again."
174 log "Giving up due to the problems mentioned above."
175 exit 1
176else
177 log "System setup appears correct."
178 log ""
179fi
180
181# Sensible default actions
182ACTION="install"
183BUILD_MODULE="true"
184while true
185do
186 if [ "$2" = "" ]; then
187 break
188 fi
189 shift
190 case "$1" in
191 install)
192 ACTION="install"
193 ;;
194
195 uninstall)
196 ACTION="uninstall"
197 ;;
198
199 force)
200 FORCE_UPGRADE=1
201 ;;
202 license_accepted_unconditionally)
203 # Legacy option
204 ;;
205 no_module)
206 BUILD_MODULE=""
207 ;;
208 *)
209 if [ "$ACTION" = "" ]; then
210 info "Unknown command '$1'."
211 usage
212 fi
213 info "Specifying an installation path is not allowed -- using /opt/VirtualBox!"
214 ;;
215 esac
216done
217
218if [ "$ACTION" = "install" ]; then
219 # Choose a proper umask
220 umask 022
221
222 # Find previous installation
223 if [ ! -r $CONFIG_DIR/$CONFIG ]; then
224 mkdir -p -m 755 $CONFIG_DIR
225 touch $CONFIG_DIR/$CONFIG
226 else
227 . $CONFIG_DIR/$CONFIG
228 PREV_INSTALLATION=$INSTALL_DIR
229 fi
230 if ! check_previous $INSTALL_DIR
231 then
232 info
233 info "You appear to have a version of VirtualBox on your system which was installed"
234 info "from a different source or using a different type of installer (or a damaged"
235 info "installation of VirtualBox). We strongly recommend that you remove it before"
236 info "installing this version of VirtualBox."
237 info
238 info "Do you wish to continue anyway? [yes or no]"
239 read reply dummy
240 if ! expr "$reply" : [yY] && ! expr "$reply" : [yY][eE][sS]
241 then
242 info
243 info "Cancelling installation."
244 log "User requested cancellation of the installation"
245 exit 1
246 fi
247 fi
248
249 # Terminate Server and VBoxNetDHCP if running
250 terminate_proc VBoxSVC
251 terminate_proc VBoxNetDHCP
252 terminate_proc VBoxNetNAT
253
254 # Remove previous installation
255 if [ -n "$PREV_INSTALLATION" -a -z "$FORCE_UPGRADE" -a ! "$VERSION" = "$INSTALL_VER" ] &&
256 expr "$INSTALL_VER" "<" "1.6.0" > /dev/null 2>&1
257 then
258 info
259 info "If you are upgrading from VirtualBox 1.5 or older and if some of your virtual"
260 info "machines have saved states, then the saved state information will be lost"
261 info "after the upgrade and will have to be discarded. If you do not want this then"
262 info "you can cancel the upgrade now."
263 info
264 info "Do you wish to continue? [yes or no]"
265 read reply dummy
266 if ! expr "$reply" : [yY] && ! expr "$reply" : [yY][eE][sS]
267 then
268 info
269 info "Cancelling upgrade."
270 log "User requested cancellation of the installation"
271 exit 1
272 fi
273 fi
274
275 if [ ! "$VERSION" = "$INSTALL_VER" -a ! "$BUILD_MODULE" = "true" -a -n "$DKMS" ]
276 then
277 # Not doing this can confuse dkms
278 info "Rebuilding the kernel module after version change"
279 BUILD_MODULE=true
280 fi
281
282 if [ -n "$PREV_INSTALLATION" ]; then
283 [ -n "$INSTALL_REV" ] && INSTALL_REV=" r$INSTALL_REV"
284 info "Removing previous installation of VirtualBox $INSTALL_VER$INSTALL_REV from $PREV_INSTALLATION"
285 log "Removing previous installation of VirtualBox $INSTALL_VER$INSTALL_REV from $PREV_INSTALLATION"
286 log ""
287
288 stop_init_script vboxnet >/dev/null 2>&1 # Do we need this?
289 delrunlevel vboxnet > /dev/null 2>&1
290 if [ "$BUILD_MODULE" = "true" ]; then
291 stop_init_script vboxdrv
292 if [ -n "$DKMS" ]
293 then
294 $DKMS remove -m vboxhost -v $INSTALL_VER --all > /dev/null 2>&1
295 $DKMS remove -m vboxdrv -v $INSTALL_VER --all > /dev/null 2>&1
296 $DKMS remove -m vboxnetflt -v $INSTALL_VER --all > /dev/null 2>&1
297 $DKMS remove -m vboxnetadp -v $INSTALL_VER --all > /dev/null 2>&1
298 fi
299 # OSE doesn't always have the initscript
300 rmmod vboxpci > /dev/null 2>&1
301 rmmod vboxnetadp > /dev/null 2>&1
302 rmmod vboxnetflt > /dev/null 2>&1
303 rmmod vboxdrv > /dev/null 2>&1
304
305 module_loaded && {
306 info "Warning: could not stop VirtualBox kernel module."
307 info "Please restart your system to apply changes."
308 log "Unable to remove the old VirtualBox kernel module."
309 log " An old version of VirtualBox may be running."
310 }
311 else
312 VBOX_DONT_REMOVE_OLD_MODULES=1
313 fi
314
315 VBOX_NO_UNINSTALL_MESSAGE=1
316 . ./uninstall.sh
317
318 fi
319
320 info "Installing VirtualBox to $INSTALLATION_DIR"
321 log "Installing VirtualBox to $INSTALLATION_DIR"
322 log ""
323
324 # Verify the archive
325 mkdir -p -m 755 $INSTALLATION_DIR
326 bzip2 -d -c VirtualBox.tar.bz2 | tar -tf - > $CONFIG_DIR/$CONFIG_FILES
327 RETVAL=$?
328 if [ $RETVAL != 0 ]; then
329 rmdir $INSTALLATION_DIR 2> /dev/null
330 rm -f $CONFIG_DIR/$CONFIG 2> /dev/null
331 rm -f $CONFIG_DIR/$CONFIG_FILES 2> /dev/null
332 log 'Error running "bzip2 -d -c VirtualBox.tar.bz2 | tar -tf - > '"$CONFIG_DIR/$CONFIG_FILES"'".'
333 abort "Error installing VirtualBox. Installation aborted"
334 fi
335
336 # Create installation directory and install
337 bzip2 -d -c VirtualBox.tar.bz2 | tar -xf - -C $INSTALLATION_DIR
338 RETVAL=$?
339 if [ $RETVAL != 0 ]; then
340 cwd=`pwd`
341 cd $INSTALLATION_DIR
342 rm -f `cat $CONFIG_DIR/$CONFIG_FILES` 2> /dev/null
343 cd $pwd
344 rmdir $INSTALLATION_DIR 2> /dev/null
345 rm -f $CONFIG_DIR/$CONFIG 2> /dev/null
346 log 'Error running "bzip2 -d -c VirtualBox.tar.bz2 | tar -xf - -C '"$INSTALLATION_DIR"'".'
347 abort "Error installing VirtualBox. Installation aborted"
348 fi
349
350 cp uninstall.sh routines.sh $INSTALLATION_DIR
351 echo "routines.sh" >> $CONFIG_DIR/$CONFIG_FILES
352 echo "uninstall.sh" >> $CONFIG_DIR/$CONFIG_FILES
353
354 # XXX SELinux: allow text relocation entries
355 set_selinux_permissions "$INSTALLATION_DIR" \
356 "$INSTALLATION_DIR"
357
358 # Hardened build: Mark selected binaries set-user-ID-on-execution,
359 # create symlinks for working around unsupported $ORIGIN/.. in VBoxC.so (setuid),
360 # and finally make sure the directory is only writable by the user (paranoid).
361 if [ -n "$HARDENED" ]; then
362 test -e $INSTALLATION_DIR/VirtualBox && chmod 4511 $INSTALLATION_DIR/VirtualBox
363 test -e $INSTALLATION_DIR/VBoxSDL && chmod 4511 $INSTALLATION_DIR/VBoxSDL
364 test -e $INSTALLATION_DIR/VBoxHeadless && chmod 4511 $INSTALLATION_DIR/VBoxHeadless
365 test -e $INSTALLATION_DIR/VBoxNetDHCP && chmod 4511 $INSTALLATION_DIR/VBoxNetDHCP
366 test -e $INSTALLATION_DIR/VBoxNetNAT && chmod 4511 $INSTALLATION_DIR/VBoxNetNAT
367
368 ln -sf $INSTALLATION_DIR/VBoxVMM.so $INSTALLATION_DIR/components/VBoxVMM.so
369 ln -sf $INSTALLATION_DIR/VBoxRT.so $INSTALLATION_DIR/components/VBoxRT.so
370
371 chmod go-w $INSTALLATION_DIR
372 fi
373
374 # This binaries need to be suid root in any case, even if not hardened
375 test -e $INSTALLATION_DIR/VBoxNetAdpCtl && chmod 4511 $INSTALLATION_DIR/VBoxNetAdpCtl
376 test -e $INSTALLATION_DIR/VBoxVolInfo && chmod 4511 $INSTALLATION_DIR/VBoxVolInfo
377
378 # Write the configuration. Do this before we call /etc/init.d/vboxdrv setup!
379 echo "# VirtualBox installation directory" > $CONFIG_DIR/$CONFIG
380 echo "INSTALL_DIR='$INSTALLATION_DIR'" >> $CONFIG_DIR/$CONFIG
381 echo "# VirtualBox version" >> $CONFIG_DIR/$CONFIG
382 echo "INSTALL_VER='$VERSION'" >> $CONFIG_DIR/$CONFIG
383 echo "INSTALL_REV='$SVNREV'" >> $CONFIG_DIR/$CONFIG
384 echo "# Build type and user name for logging purposes" >> $CONFIG_DIR/$CONFIG
385 echo "BUILD_TYPE='$BUILD_BUILDTYPE'" >> $CONFIG_DIR/$CONFIG
386 echo "USERNAME='$BUILD_USERNAME'" >> $CONFIG_DIR/$CONFIG
387
388 # Create users group
389 groupadd -r -f $GROUPNAME 2> /dev/null
390
391 # Create symlinks to start binaries
392 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VirtualBox
393 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxManage
394 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxSDL
395 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxVRDP
396 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxHeadless
397 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxBalloonCtrl
398 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxAutostart
399 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/vboxwebsrv
400 ln -sf $INSTALLATION_DIR/vbox-img /usr/bin/vbox-img
401 ln -sf $INSTALLATION_DIR/VBox.png /usr/share/pixmaps/VBox.png
402 if [ -f $INSTALLATION_DIR/VBoxDTrace ]; then
403 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxDTrace
404 fi
405 ln -sf $INSTALLATION_DIR/vboxdrv.sh /sbin/rcvboxdrv
406 # Unity and Nautilus seem to look here for their icons
407 ln -sf $INSTALLATION_DIR/icons/128x128/virtualbox.png /usr/share/pixmaps/virtualbox.png
408 ln -sf $INSTALLATION_DIR/virtualbox.desktop /usr/share/applications/virtualbox.desktop
409 ln -sf $INSTALLATION_DIR/virtualbox.xml /usr/share/mime/packages/virtualbox.xml
410 ln -sf $INSTALLATION_DIR/rdesktop-vrdp /usr/bin/rdesktop-vrdp
411 ln -sf $INSTALLATION_DIR/src/vboxhost /usr/src/vboxhost-_VERSION_
412
413 # Convenience symlinks. The creation fails if the FS is not case sensitive
414 ln -sf VirtualBox /usr/bin/virtualbox > /dev/null 2>&1
415 ln -sf VBoxManage /usr/bin/vboxmanage > /dev/null 2>&1
416 ln -sf VBoxSDL /usr/bin/vboxsdl > /dev/null 2>&1
417 ln -sf VBoxHeadless /usr/bin/vboxheadless > /dev/null 2>&1
418 if [ -f $INSTALLATION_DIR/VBoxDTrace ]; then
419 ln -sf VBoxDTrace /usr/bin/vboxdtrace > /dev/null 2>&1
420 fi
421
422 # Icons
423 cur=`pwd`
424 cd $INSTALLATION_DIR/icons
425 for i in *; do
426 cd $i
427 if [ -d /usr/share/icons/hicolor/$i ]; then
428 for j in *; do
429 if expr "$j" : "virtualbox\..*" > /dev/null; then
430 dst=apps
431 else
432 dst=mimetypes
433 fi
434 if [ -d /usr/share/icons/hicolor/$i/$dst ]; then
435 ln -s $INSTALLATION_DIR/icons/$i/$j /usr/share/icons/hicolor/$i/$dst/$j
436 echo /usr/share/icons/hicolor/$i/$dst/$j >> $CONFIG_DIR/$CONFIG_FILES
437 fi
438 done
439 fi
440 cd -
441 done
442 cd $cur
443
444 # Update the MIME database
445 update-mime-database /usr/share/mime 2>/dev/null
446
447 # Update the desktop database
448 update-desktop-database -q 2>/dev/null
449
450 # If Python is available, install Python bindings
451 if [ -n "$PYTHON" ]; then
452 maybe_run_python_bindings_installer $INSTALLATION_DIR
453 fi
454
455 install_device_node_setup "$VBOXDRV_GRP" "$VBOXDRV_MODE" "$INSTALLATION_DIR"
456
457 # Make kernel module
458 MODULE_FAILED="false"
459 if [ "$BUILD_MODULE" = "true" ]
460 then
461 info "Building the VirtualBox kernel modules"
462 log "Output from the module build process (the Linux kernel build system) follows:"
463 cur=`pwd`
464 log ""
465 ./vboxdrv.sh setup
466 # Start VirtualBox kernel module
467 if [ $RETVAL -eq 0 ] && ! ./vboxdrv.sh start; then
468 info "Failed to load the kernel module."
469 MODULE_FAILED="true"
470 RC_SCRIPT=1
471 fi
472 log ""
473 log "End of the output from the Linux kernel build system."
474 cd $cur
475 fi
476
477 # Do post-installation common to all installer types, currently service
478 # script set-up.
479 START_SERVICES=
480 test "${BUILD_MODULE}" = "true" && test "${MODULE_FAILED}" = "false" &&
481 START_SERVICES="--start"
482 ./postinst-common.sh "${INSTALLATION_DIR}" "${START_SERVICES}" >> "${LOG}"
483
484 info ""
485 if [ ! "$MODULE_FAILED" = "true" ]
486 then
487 info "VirtualBox has been installed successfully."
488 else
489 info "VirtualBox has been installed successfully, but the kernel module could not"
490 info "be built. When you have fixed the problems preventing this, execute"
491 info " /etc/init.d/vboxdrv setup"
492 info "as administrator to build it."
493 fi
494 info ""
495 info "You will find useful information about using VirtualBox in the user manual"
496 info " $INSTALLATION_DIR/UserManual.pdf"
497 info "and in the user FAQ"
498 info " http://www.virtualbox.org/wiki/User_FAQ"
499 info ""
500 info "We hope that you enjoy using VirtualBox."
501 info ""
502 log "Installation successful"
503elif [ "$ACTION" = "uninstall" ]; then
504 . ./uninstall.sh
505fi
506exit $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