VirtualBox

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

Last change on this file since 43023 was 42119, checked in by vboxsync, 12 years ago

Installer/linux: autostart service integration

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 18.1 KB
Line 
1#!/bin/sh
2#
3# Oracle VM VirtualBox
4# VirtualBox linux installation script
5
6#
7# Copyright (C) 2007-2011 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/VBoxBalloonCtrl" "$install_dir" &&
112 check_binary "/usr/bin/VBoxAutostart" "$install_dir" &&
113 check_binary "/usr/bin/vboxwebsrv" "$install_dir"
114}
115
116##############################################################################
117# Main script #
118##############################################################################
119
120info "VirtualBox Version $VERSION r$SVNREV ($BUILD) installer"
121
122
123# Make sure that we were invoked as root...
124check_root
125
126# Set up logging before anything else
127create_log $LOG
128
129# Now stop the autostart service otherwise it will keep VBoxSVC running
130stop_init_script vboxautostart-service
131
132# Now stop the ballon control service otherwise it will keep VBoxSVC running
133stop_init_script vboxballoonctrl-service
134
135# Now stop the web service otherwise it will keep VBoxSVC running
136stop_init_script vboxweb-service
137
138# Now check if no VBoxSVC daemon is running
139check_running
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# Check that the system is setup correctly for the installation
162have_bzip2="`check_bzip2; echo $?`" # Do we have bzip2?
163have_gmake="`check_gmake; echo $?`" # Do we have GNU make?
164have_ksource="`check_ksource; echo $?`" # Can we find the kernel source?
165have_gcc="`check_gcc; echo $?`" # Is GCC installed?
166
167if [ $have_bzip2 -eq 1 -o $have_gmake -eq 1 -o $have_ksource -eq 1 \
168 -o $have_gcc -eq 1 ]; then
169 info "Problems were found which would prevent VirtualBox from installing."
170 info "Please correct these problems and try again."
171 log "Giving up due to the problems mentioned above."
172 exit 1
173else
174 log "System setup appears correct."
175 log ""
176fi
177
178# Sensible default actions
179ACTION="install"
180BUILD_MODULE="true"
181while true
182do
183 if [ "$2" = "" ]; then
184 break
185 fi
186 shift
187 case "$1" in
188 install)
189 ACTION="install"
190 ;;
191
192 uninstall)
193 ACTION="uninstall"
194 ;;
195
196 force)
197 FORCE_UPGRADE=1
198 ;;
199 license_accepted_unconditionally)
200 # Legacy option
201 ;;
202 no_module)
203 BUILD_MODULE=""
204 ;;
205 *)
206 if [ "$ACTION" = "" ]; then
207 info "Unknown command '$1'."
208 usage
209 fi
210 info "Specifying an installation path is not allowed -- using /opt/VirtualBox!"
211 ;;
212 esac
213done
214
215if [ "$ACTION" = "install" ]; then
216 # Find previous installation
217 if [ ! -r $CONFIG_DIR/$CONFIG ]; then
218 mkdir -p -m 755 $CONFIG_DIR
219 touch $CONFIG_DIR/$CONFIG
220 else
221 . $CONFIG_DIR/$CONFIG
222 PREV_INSTALLATION=$INSTALL_DIR
223 fi
224 if ! check_previous $INSTALL_DIR
225 then
226 info
227 info "You appear to have a version of VirtualBox on your system which was installed"
228 info "from a different source or using a different type of installer (or a damaged"
229 info "installation of VirtualBox). We strongly recommend that you remove it before"
230 info "installing this version of VirtualBox."
231 info
232 info "Do you wish to continue anyway? [yes or no]"
233 read reply dummy
234 if ! expr "$reply" : [yY] && ! expr "$reply" : [yY][eE][sS]
235 then
236 info
237 info "Cancelling installation."
238 log "User requested cancellation of the installation"
239 exit 1
240 fi
241 fi
242
243 # Terminate Server and VBoxNetDHCP if running
244 terminate_proc VBoxSVC
245 terminate_proc VBoxNetDHCP
246
247 # Remove previous installation
248 if [ -n "$PREV_INSTALLATION" -a -z "$FORCE_UPGRADE" -a ! "$VERSION" = "$INSTALL_VER" ] &&
249 expr "$INSTALL_VER" "<" "1.6.0" > /dev/null 2>&1
250 then
251 info
252 info "If you are upgrading from VirtualBox 1.5 or older and if some of your virtual"
253 info "machines have saved states, then the saved state information will be lost"
254 info "after the upgrade and will have to be discarded. If you do not want this then"
255 info "you can cancel the upgrade now."
256 info
257 info "Do you wish to continue? [yes or no]"
258 read reply dummy
259 if ! expr "$reply" : [yY] && ! expr "$reply" : [yY][eE][sS]
260 then
261 info
262 info "Cancelling upgrade."
263 log "User requested cancellation of the installation"
264 exit 1
265 fi
266 fi
267
268 if [ ! "$VERSION" = "$INSTALL_VER" -a ! "$BUILD_MODULE" = "true" -a -n "$DKMS" ]
269 then
270 # Not doing this can confuse dkms
271 info "Rebuilding the kernel module after version change"
272 BUILD_MODULE=true
273 fi
274
275 if [ -n "$PREV_INSTALLATION" ]; then
276 [ -n "$INSTALL_REV" ] && INSTALL_REV=" r$INSTALL_REV"
277 info "Removing previous installation of VirtualBox $INSTALL_VER$INSTALL_REV from $PREV_INSTALLATION"
278 log "Removing previous installation of VirtualBox $INSTALL_VER$INSTALL_REV from $PREV_INSTALLATION"
279 log ""
280
281 stop_init_script vboxnet
282 delrunlevel vboxnet > /dev/null 2>&1
283 if [ "$BUILD_MODULE" = "true" ]; then
284 stop_init_script vboxdrv
285 if [ -n "$DKMS" ]
286 then
287 $DKMS remove -m vboxhost -v $INSTALL_VER --all > /dev/null 2>&1
288 $DKMS remove -m vboxdrv -v $INSTALL_VER --all > /dev/null 2>&1
289 $DKMS remove -m vboxnetflt -v $INSTALL_VER --all > /dev/null 2>&1
290 $DKMS remove -m vboxnetadp -v $INSTALL_VER --all > /dev/null 2>&1
291 fi
292 # OSE doesn't always have the initscript
293 rmmod vboxpci > /dev/null 2>&1
294 rmmod vboxnetadp > /dev/null 2>&1
295 rmmod vboxnetflt > /dev/null 2>&1
296 rmmod vboxdrv > /dev/null 2>&1
297
298 module_loaded && {
299 info "Warning: could not stop VirtualBox kernel module."
300 info "Please restart your system to apply changes."
301 log "Unable to remove the old VirtualBox kernel module."
302 log " An old version of VirtualBox may be running."
303 }
304 else
305 VBOX_DONT_REMOVE_OLD_MODULES=1
306 fi
307
308 VBOX_NO_UNINSTALL_MESSAGE=1
309 . ./uninstall.sh
310
311 fi
312
313 info "Installing VirtualBox to $INSTALLATION_DIR"
314 log "Installing VirtualBox to $INSTALLATION_DIR"
315 log ""
316
317 # Verify the archive
318 mkdir -p -m 755 $INSTALLATION_DIR
319 bzip2 -d -c VirtualBox.tar.bz2 | tar -tf - > $CONFIG_DIR/$CONFIG_FILES
320 RETVAL=$?
321 if [ $RETVAL != 0 ]; then
322 rmdir $INSTALLATION_DIR 2> /dev/null
323 rm -f $CONFIG_DIR/$CONFIG 2> /dev/null
324 rm -f $CONFIG_DIR/$CONFIG_FILES 2> /dev/null
325 log 'Error running "bzip2 -d -c VirtualBox.tar.bz2 | tar -tf - > '"$CONFIG_DIR/$CONFIG_FILES"'".'
326 abort "Error installing VirtualBox. Installation aborted"
327 fi
328
329 # Create installation directory and install
330 bzip2 -d -c VirtualBox.tar.bz2 | tar -xf - -C $INSTALLATION_DIR
331 RETVAL=$?
332 if [ $RETVAL != 0 ]; then
333 cwd=`pwd`
334 cd $INSTALLATION_DIR
335 rm -f `cat $CONFIG_DIR/$CONFIG_FILES` 2> /dev/null
336 cd $pwd
337 rmdir $INSTALLATION_DIR 2> /dev/null
338 rm -f $CONFIG_DIR/$CONFIG 2> /dev/null
339 log 'Error running "bzip2 -d -c VirtualBox.tar.bz2 | tar -xf - -C '"$INSTALLATION_DIR"'".'
340 abort "Error installing VirtualBox. Installation aborted"
341 fi
342
343 cp uninstall.sh routines.sh $INSTALLATION_DIR
344 echo "routines.sh" >> $CONFIG_DIR/$CONFIG_FILES
345 echo "uninstall.sh" >> $CONFIG_DIR/$CONFIG_FILES
346
347 # XXX SELinux: allow text relocation entries
348 set_selinux_permissions "$INSTALLATION_DIR" \
349 "$INSTALLATION_DIR"
350
351 # Hardened build: Mark selected binaries set-user-ID-on-execution,
352 # create symlinks for working around unsupported $ORIGIN/.. in VBoxC.so (setuid),
353 # and finally make sure the directory is only writable by the user (paranoid).
354 if [ -n "$HARDENED" ]; then
355 test -e $INSTALLATION_DIR/VirtualBox && chmod 4511 $INSTALLATION_DIR/VirtualBox
356 test -e $INSTALLATION_DIR/VBoxSDL && chmod 4511 $INSTALLATION_DIR/VBoxSDL
357 test -e $INSTALLATION_DIR/VBoxHeadless && chmod 4511 $INSTALLATION_DIR/VBoxHeadless
358 test -e $INSTALLATION_DIR/VBoxNetDHCP && chmod 4511 $INSTALLATION_DIR/VBoxNetDHCP
359
360 ln -sf $INSTALLATION_DIR/VBoxVMM.so $INSTALLATION_DIR/components/VBoxVMM.so
361 ln -sf $INSTALLATION_DIR/VBoxREM.so $INSTALLATION_DIR/components/VBoxREM.so
362 ln -sf $INSTALLATION_DIR/VBoxRT.so $INSTALLATION_DIR/components/VBoxRT.so
363 ln -sf $INSTALLATION_DIR/VBoxDDU.so $INSTALLATION_DIR/components/VBoxDDU.so
364 ln -sf $INSTALLATION_DIR/VBoxXPCOM.so $INSTALLATION_DIR/components/VBoxXPCOM.so
365
366 chmod go-w $INSTALLATION_DIR
367 fi
368
369 # This binary needs to be suid root in any case, even if not hardened
370 test -e $INSTALLATION_DIR/VBoxNetAdpCtl && chmod 4511 $INSTALLATION_DIR/VBoxNetAdpCtl
371
372 # Install runlevel scripts
373 # Note: vboxdrv is also handled by setup_init_script. This function will
374 # use chkconfig to adjust the sequence numbers, therefore vboxdrv
375 # numbers here should match the numbers in the vboxdrv.sh check
376 # header!
377 install_init_script vboxdrv.sh vboxdrv
378 install_init_script vboxballoonctrl-service.sh vboxballoonctrl-service
379 install_init_script vboxautostart-service.sh vboxautostart-service
380 install_init_script vboxweb-service.sh vboxweb-service
381 delrunlevel vboxdrv > /dev/null 2>&1
382 addrunlevel vboxdrv 20 80 # This may produce useful output
383 delrunlevel vboxballoonctrl-service > /dev/null 2>&1
384 addrunlevel vboxballoonctrl-service 25 75 # This may produce useful output
385 delrunlevel vboxautostart-service > /dev/null 2>&1
386 addrunlevel vboxautostart-service 25 75 # This may produce useful output
387 delrunlevel vboxweb-service > /dev/null 2>&1
388 addrunlevel vboxweb-service 25 75 # This may produce useful output
389
390 # Create users group
391 groupadd $GROUPNAME 2> /dev/null
392
393 # Create symlinks to start binaries
394 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VirtualBox
395 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxManage
396 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxSDL
397 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxVRDP
398 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxHeadless
399 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxBalloonCtrl
400 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxAutostart
401 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/vboxwebsrv
402 ln -sf $INSTALLATION_DIR/VBox.png /usr/share/pixmaps/VBox.png
403 # Unity and Nautilus seem to look here for their icons
404 ln -sf $INSTALLATION_DIR/icons/128x128/virtualbox.png /usr/share/pixmaps/virtualbox.png
405 ln -sf $INSTALLATION_DIR/virtualbox.desktop /usr/share/applications/virtualbox.desktop
406 ln -sf $INSTALLATION_DIR/virtualbox.xml /usr/share/mime/packages/virtualbox.xml
407 ln -sf $INSTALLATION_DIR/rdesktop-vrdp /usr/bin/rdesktop-vrdp
408 ln -sf $INSTALLATION_DIR/src/vboxhost /usr/src/vboxhost-_VERSION_
409
410 # Convenience symlinks. The creation fails if the FS is not case sensitive
411 ln -sf VirtualBox /usr/bin/virtualbox > /dev/null 2>&1
412 ln -sf VBoxManage /usr/bin/vboxmanage > /dev/null 2>&1
413 ln -sf VBoxSDL /usr/bin/vboxsdl > /dev/null 2>&1
414 ln -sf VBoxHeadless /usr/bin/vboxheadless > /dev/null 2>&1
415
416 # Icons
417 cur=`pwd`
418 cd $INSTALLATION_DIR/icons
419 for i in *; do
420 cd $i
421 if [ -d /usr/share/icons/hicolor/$i ]; then
422 for j in *; do
423 if [ "$j" = "virtualbox.png" ]; then
424 dst=apps
425 else
426 dst=mimetypes
427 fi
428 if [ -d /usr/share/icons/hicolor/$i/$dst ]; then
429 ln -s $INSTALLATION_DIR/icons/$i/$j /usr/share/icons/hicolor/$i/$dst/$j
430 echo /usr/share/icons/hicolor/$i/$dst/$j >> $CONFIG_DIR/$CONFIG_FILES
431 fi
432 done
433 fi
434 cd -
435 done
436 cd $cur
437
438 # Update the MIME database
439 update-mime-database /usr/share/mime 2>/dev/null
440
441 # Update the desktop database
442 update-desktop-database -q 2>/dev/null
443
444 # If Python is available, install Python bindings
445 if [ -n "$PYTHON" ]; then
446 maybe_run_python_bindings_installer $INSTALLATION_DIR
447 fi
448
449 install_device_node_setup "$VBOXDRV_GRP" "$VBOXDRV_MODE" "$INSTALLATION_DIR"
450
451 # Write the configuration. Do this before we call /etc/init.d/vboxdrv setup!
452 echo "# VirtualBox installation directory" > $CONFIG_DIR/$CONFIG
453 echo "INSTALL_DIR='$INSTALLATION_DIR'" >> $CONFIG_DIR/$CONFIG
454 echo "# VirtualBox version" >> $CONFIG_DIR/$CONFIG
455 echo "INSTALL_VER='$VERSION'" >> $CONFIG_DIR/$CONFIG
456 echo "INSTALL_REV='$SVNREV'" >> $CONFIG_DIR/$CONFIG
457 echo "# Build type and user name for logging purposes" >> $CONFIG_DIR/$CONFIG
458 echo "BUILD_TYPE='$BUILD_BUILDTYPE'" >> $CONFIG_DIR/$CONFIG
459 echo "USERNAME='$BUILD_USERNAME'" >> $CONFIG_DIR/$CONFIG
460
461 # Make kernel module
462 MODULE_FAILED="false"
463 if [ "$BUILD_MODULE" = "true" ]
464 then
465 info "Building the VirtualBox kernel modules"
466 log "Output from the module build process (the Linux kernel build system) follows:"
467 cur=`pwd`
468 log ""
469 setup_init_script vboxdrv
470 # Start VirtualBox kernel module
471 if [ $RETVAL -eq 0 ] && ! start_init_script vboxdrv; then
472 info "Failed to load the kernel module."
473 MODULE_FAILED="true"
474 RC_SCRIPT=1
475 fi
476 start_init_script vboxballoonctrl-service
477 start_init_script vboxautostart-service
478 start_init_script vboxweb-service
479 log ""
480 log "End of the output from the Linux kernel build system."
481 cd $cur
482 fi
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