VirtualBox

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

Last change on this file since 57812 was 57812, checked in by vboxsync, 10 years ago

Installer/linux: rework service handling in RPM to use shared scripts and add systemd support.

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 17.8 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 $INSTALLATION_DIR
351 echo "uninstall.sh" >> $CONFIG_DIR/$CONFIG_FILES
352
353 # XXX SELinux: allow text relocation entries
354 set_selinux_permissions "$INSTALLATION_DIR" \
355 "$INSTALLATION_DIR"
356
357 # Hardened build: Mark selected binaries set-user-ID-on-execution,
358 # create symlinks for working around unsupported $ORIGIN/.. in VBoxC.so (setuid),
359 # and finally make sure the directory is only writable by the user (paranoid).
360 if [ -n "$HARDENED" ]; then
361 test -e $INSTALLATION_DIR/VirtualBox && chmod 4511 $INSTALLATION_DIR/VirtualBox
362 test -e $INSTALLATION_DIR/VBoxSDL && chmod 4511 $INSTALLATION_DIR/VBoxSDL
363 test -e $INSTALLATION_DIR/VBoxHeadless && chmod 4511 $INSTALLATION_DIR/VBoxHeadless
364 test -e $INSTALLATION_DIR/VBoxNetDHCP && chmod 4511 $INSTALLATION_DIR/VBoxNetDHCP
365 test -e $INSTALLATION_DIR/VBoxNetNAT && chmod 4511 $INSTALLATION_DIR/VBoxNetNAT
366
367 ln -sf $INSTALLATION_DIR/VBoxVMM.so $INSTALLATION_DIR/components/VBoxVMM.so
368 ln -sf $INSTALLATION_DIR/VBoxRT.so $INSTALLATION_DIR/components/VBoxRT.so
369
370 chmod go-w $INSTALLATION_DIR
371 fi
372
373 # This binaries need to be suid root in any case, even if not hardened
374 test -e $INSTALLATION_DIR/VBoxNetAdpCtl && chmod 4511 $INSTALLATION_DIR/VBoxNetAdpCtl
375 test -e $INSTALLATION_DIR/VBoxVolInfo && chmod 4511 $INSTALLATION_DIR/VBoxVolInfo
376
377 # Write the configuration. Do this before we call /etc/init.d/vboxdrv setup!
378 echo "# VirtualBox installation directory" > $CONFIG_DIR/$CONFIG
379 echo "INSTALL_DIR='$INSTALLATION_DIR'" >> $CONFIG_DIR/$CONFIG
380 echo "# VirtualBox version" >> $CONFIG_DIR/$CONFIG
381 echo "INSTALL_VER='$VERSION'" >> $CONFIG_DIR/$CONFIG
382 echo "INSTALL_REV='$SVNREV'" >> $CONFIG_DIR/$CONFIG
383 echo "# Build type and user name for logging purposes" >> $CONFIG_DIR/$CONFIG
384 echo "BUILD_TYPE='$BUILD_BUILDTYPE'" >> $CONFIG_DIR/$CONFIG
385 echo "USERNAME='$BUILD_USERNAME'" >> $CONFIG_DIR/$CONFIG
386
387 # Create users group
388 groupadd -r -f $GROUPNAME 2> /dev/null
389
390 # Create symlinks to start binaries
391 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VirtualBox
392 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxManage
393 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxSDL
394 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxVRDP
395 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxHeadless
396 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxBalloonCtrl
397 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxAutostart
398 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/vboxwebsrv
399 ln -sf $INSTALLATION_DIR/vbox-img /usr/bin/vbox-img
400 ln -sf $INSTALLATION_DIR/VBox.png /usr/share/pixmaps/VBox.png
401 if [ -f $INSTALLATION_DIR/VBoxDTrace ]; then
402 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxDTrace
403 fi
404 ln -sf $INSTALLATION_DIR/vboxdrv.sh /sbin/rcvboxdrv
405 # Unity and Nautilus seem to look here for their icons
406 ln -sf $INSTALLATION_DIR/icons/128x128/virtualbox.png /usr/share/pixmaps/virtualbox.png
407 ln -sf $INSTALLATION_DIR/virtualbox.desktop /usr/share/applications/virtualbox.desktop
408 ln -sf $INSTALLATION_DIR/virtualbox.xml /usr/share/mime/packages/virtualbox.xml
409 ln -sf $INSTALLATION_DIR/rdesktop-vrdp /usr/bin/rdesktop-vrdp
410 ln -sf $INSTALLATION_DIR/src/vboxhost /usr/src/vboxhost-_VERSION_
411
412 # Convenience symlinks. The creation fails if the FS is not case sensitive
413 ln -sf VirtualBox /usr/bin/virtualbox > /dev/null 2>&1
414 ln -sf VBoxManage /usr/bin/vboxmanage > /dev/null 2>&1
415 ln -sf VBoxSDL /usr/bin/vboxsdl > /dev/null 2>&1
416 ln -sf VBoxHeadless /usr/bin/vboxheadless > /dev/null 2>&1
417 if [ -f $INSTALLATION_DIR/VBoxDTrace ]; then
418 ln -sf VBoxDTrace /usr/bin/vboxdtrace > /dev/null 2>&1
419 fi
420
421 # Icons
422 cur=`pwd`
423 cd $INSTALLATION_DIR/icons
424 for i in *; do
425 cd $i
426 if [ -d /usr/share/icons/hicolor/$i ]; then
427 for j in *; do
428 if expr "$j" : "virtualbox\..*" > /dev/null; then
429 dst=apps
430 else
431 dst=mimetypes
432 fi
433 if [ -d /usr/share/icons/hicolor/$i/$dst ]; then
434 ln -s $INSTALLATION_DIR/icons/$i/$j /usr/share/icons/hicolor/$i/$dst/$j
435 echo /usr/share/icons/hicolor/$i/$dst/$j >> $CONFIG_DIR/$CONFIG_FILES
436 fi
437 done
438 fi
439 cd -
440 done
441 cd $cur
442
443 # Update the MIME database
444 update-mime-database /usr/share/mime 2>/dev/null
445
446 # Update the desktop database
447 update-desktop-database -q 2>/dev/null
448
449 # If Python is available, install Python bindings
450 if [ -n "$PYTHON" ]; then
451 maybe_run_python_bindings_installer $INSTALLATION_DIR
452 fi
453
454 install_device_node_setup "$VBOXDRV_GRP" "$VBOXDRV_MODE" "$INSTALLATION_DIR"
455
456 # Make kernel module
457 MODULE_FAILED="false"
458 if [ "$BUILD_MODULE" = "true" ]
459 then
460 info "Building the VirtualBox kernel modules"
461 log "Output from the module build process (the Linux kernel build system) follows:"
462 cur=`pwd`
463 log ""
464 ./vboxdrv.sh setup
465 # Start VirtualBox kernel module
466 if [ $RETVAL -eq 0 ] && ! ./vboxdrv.sh start; then
467 info "Failed to load the kernel module."
468 MODULE_FAILED="true"
469 RC_SCRIPT=1
470 fi
471 log ""
472 log "End of the output from the Linux kernel build system."
473 cd $cur
474 fi
475
476 # Do post-installation common to all installer types, currently service
477 # script set-up.
478 START_SERVICES=
479 test "${BUILD_MODULE}" = "true" && test "${MODULE_FAILED}" = "false" &&
480 START_SERVICES="--start"
481 ./postinst-common.sh "${INSTALLATION_DIR}" "${START_SERVICES}" >> "${LOG}"
482
483 info ""
484 if [ ! "$MODULE_FAILED" = "true" ]
485 then
486 info "VirtualBox has been installed successfully."
487 else
488 info "VirtualBox has been installed successfully, but the kernel module could not"
489 info "be built. When you have fixed the problems preventing this, execute"
490 info " /etc/init.d/vboxdrv setup"
491 info "as administrator to build it."
492 fi
493 info ""
494 info "You will find useful information about using VirtualBox in the user manual"
495 info " $INSTALLATION_DIR/UserManual.pdf"
496 info "and in the user FAQ"
497 info " http://www.virtualbox.org/wiki/User_FAQ"
498 info ""
499 info "We hope that you enjoy using VirtualBox."
500 info ""
501 log "Installation successful"
502elif [ "$ACTION" = "uninstall" ]; then
503 . ./uninstall.sh
504fi
505exit $RC_SCRIPT
Note: See TracBrowser for help on using the repository browser.

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