VirtualBox

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

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

Installer/linux: set umask 022 before starting the installation to make sure all files will be accessible by normal users afterwards

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 18.2 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 # Choose a proper umask
217 umask 022
218
219 # Find previous installation
220 if [ ! -r $CONFIG_DIR/$CONFIG ]; then
221 mkdir -p -m 755 $CONFIG_DIR
222 touch $CONFIG_DIR/$CONFIG
223 else
224 . $CONFIG_DIR/$CONFIG
225 PREV_INSTALLATION=$INSTALL_DIR
226 fi
227 if ! check_previous $INSTALL_DIR
228 then
229 info
230 info "You appear to have a version of VirtualBox on your system which was installed"
231 info "from a different source or using a different type of installer (or a damaged"
232 info "installation of VirtualBox). We strongly recommend that you remove it before"
233 info "installing this version of VirtualBox."
234 info
235 info "Do you wish to continue anyway? [yes or no]"
236 read reply dummy
237 if ! expr "$reply" : [yY] && ! expr "$reply" : [yY][eE][sS]
238 then
239 info
240 info "Cancelling installation."
241 log "User requested cancellation of the installation"
242 exit 1
243 fi
244 fi
245
246 # Terminate Server and VBoxNetDHCP if running
247 terminate_proc VBoxSVC
248 terminate_proc VBoxNetDHCP
249
250 # Remove previous installation
251 if [ -n "$PREV_INSTALLATION" -a -z "$FORCE_UPGRADE" -a ! "$VERSION" = "$INSTALL_VER" ] &&
252 expr "$INSTALL_VER" "<" "1.6.0" > /dev/null 2>&1
253 then
254 info
255 info "If you are upgrading from VirtualBox 1.5 or older and if some of your virtual"
256 info "machines have saved states, then the saved state information will be lost"
257 info "after the upgrade and will have to be discarded. If you do not want this then"
258 info "you can cancel the upgrade now."
259 info
260 info "Do you wish to continue? [yes or no]"
261 read reply dummy
262 if ! expr "$reply" : [yY] && ! expr "$reply" : [yY][eE][sS]
263 then
264 info
265 info "Cancelling upgrade."
266 log "User requested cancellation of the installation"
267 exit 1
268 fi
269 fi
270
271 if [ ! "$VERSION" = "$INSTALL_VER" -a ! "$BUILD_MODULE" = "true" -a -n "$DKMS" ]
272 then
273 # Not doing this can confuse dkms
274 info "Rebuilding the kernel module after version change"
275 BUILD_MODULE=true
276 fi
277
278 if [ -n "$PREV_INSTALLATION" ]; then
279 [ -n "$INSTALL_REV" ] && INSTALL_REV=" r$INSTALL_REV"
280 info "Removing previous installation of VirtualBox $INSTALL_VER$INSTALL_REV from $PREV_INSTALLATION"
281 log "Removing previous installation of VirtualBox $INSTALL_VER$INSTALL_REV from $PREV_INSTALLATION"
282 log ""
283
284 stop_init_script vboxnet
285 delrunlevel vboxnet > /dev/null 2>&1
286 if [ "$BUILD_MODULE" = "true" ]; then
287 stop_init_script vboxdrv
288 if [ -n "$DKMS" ]
289 then
290 $DKMS remove -m vboxhost -v $INSTALL_VER --all > /dev/null 2>&1
291 $DKMS remove -m vboxdrv -v $INSTALL_VER --all > /dev/null 2>&1
292 $DKMS remove -m vboxnetflt -v $INSTALL_VER --all > /dev/null 2>&1
293 $DKMS remove -m vboxnetadp -v $INSTALL_VER --all > /dev/null 2>&1
294 fi
295 # OSE doesn't always have the initscript
296 rmmod vboxpci > /dev/null 2>&1
297 rmmod vboxnetadp > /dev/null 2>&1
298 rmmod vboxnetflt > /dev/null 2>&1
299 rmmod vboxdrv > /dev/null 2>&1
300
301 module_loaded && {
302 info "Warning: could not stop VirtualBox kernel module."
303 info "Please restart your system to apply changes."
304 log "Unable to remove the old VirtualBox kernel module."
305 log " An old version of VirtualBox may be running."
306 }
307 else
308 VBOX_DONT_REMOVE_OLD_MODULES=1
309 fi
310
311 VBOX_NO_UNINSTALL_MESSAGE=1
312 . ./uninstall.sh
313
314 fi
315
316 info "Installing VirtualBox to $INSTALLATION_DIR"
317 log "Installing VirtualBox to $INSTALLATION_DIR"
318 log ""
319
320 # Verify the archive
321 mkdir -p -m 755 $INSTALLATION_DIR
322 bzip2 -d -c VirtualBox.tar.bz2 | tar -tf - > $CONFIG_DIR/$CONFIG_FILES
323 RETVAL=$?
324 if [ $RETVAL != 0 ]; then
325 rmdir $INSTALLATION_DIR 2> /dev/null
326 rm -f $CONFIG_DIR/$CONFIG 2> /dev/null
327 rm -f $CONFIG_DIR/$CONFIG_FILES 2> /dev/null
328 log 'Error running "bzip2 -d -c VirtualBox.tar.bz2 | tar -tf - > '"$CONFIG_DIR/$CONFIG_FILES"'".'
329 abort "Error installing VirtualBox. Installation aborted"
330 fi
331
332 # Create installation directory and install
333 bzip2 -d -c VirtualBox.tar.bz2 | tar -xf - -C $INSTALLATION_DIR
334 RETVAL=$?
335 if [ $RETVAL != 0 ]; then
336 cwd=`pwd`
337 cd $INSTALLATION_DIR
338 rm -f `cat $CONFIG_DIR/$CONFIG_FILES` 2> /dev/null
339 cd $pwd
340 rmdir $INSTALLATION_DIR 2> /dev/null
341 rm -f $CONFIG_DIR/$CONFIG 2> /dev/null
342 log 'Error running "bzip2 -d -c VirtualBox.tar.bz2 | tar -xf - -C '"$INSTALLATION_DIR"'".'
343 abort "Error installing VirtualBox. Installation aborted"
344 fi
345
346 cp uninstall.sh routines.sh $INSTALLATION_DIR
347 echo "routines.sh" >> $CONFIG_DIR/$CONFIG_FILES
348 echo "uninstall.sh" >> $CONFIG_DIR/$CONFIG_FILES
349
350 # XXX SELinux: allow text relocation entries
351 set_selinux_permissions "$INSTALLATION_DIR" \
352 "$INSTALLATION_DIR"
353
354 # Hardened build: Mark selected binaries set-user-ID-on-execution,
355 # create symlinks for working around unsupported $ORIGIN/.. in VBoxC.so (setuid),
356 # and finally make sure the directory is only writable by the user (paranoid).
357 if [ -n "$HARDENED" ]; then
358 test -e $INSTALLATION_DIR/VirtualBox && chmod 4511 $INSTALLATION_DIR/VirtualBox
359 test -e $INSTALLATION_DIR/VBoxSDL && chmod 4511 $INSTALLATION_DIR/VBoxSDL
360 test -e $INSTALLATION_DIR/VBoxHeadless && chmod 4511 $INSTALLATION_DIR/VBoxHeadless
361 test -e $INSTALLATION_DIR/VBoxNetDHCP && chmod 4511 $INSTALLATION_DIR/VBoxNetDHCP
362
363 ln -sf $INSTALLATION_DIR/VBoxVMM.so $INSTALLATION_DIR/components/VBoxVMM.so
364 ln -sf $INSTALLATION_DIR/VBoxREM.so $INSTALLATION_DIR/components/VBoxREM.so
365 ln -sf $INSTALLATION_DIR/VBoxRT.so $INSTALLATION_DIR/components/VBoxRT.so
366 ln -sf $INSTALLATION_DIR/VBoxDDU.so $INSTALLATION_DIR/components/VBoxDDU.so
367 ln -sf $INSTALLATION_DIR/VBoxXPCOM.so $INSTALLATION_DIR/components/VBoxXPCOM.so
368
369 chmod go-w $INSTALLATION_DIR
370 fi
371
372 # This binary needs to be suid root in any case, even if not hardened
373 test -e $INSTALLATION_DIR/VBoxNetAdpCtl && chmod 4511 $INSTALLATION_DIR/VBoxNetAdpCtl
374
375 # Install runlevel scripts
376 # Note: vboxdrv is also handled by setup_init_script. This function will
377 # use chkconfig to adjust the sequence numbers, therefore vboxdrv
378 # numbers here should match the numbers in the vboxdrv.sh check
379 # header!
380 install_init_script vboxdrv.sh vboxdrv
381 install_init_script vboxballoonctrl-service.sh vboxballoonctrl-service
382 install_init_script vboxautostart-service.sh vboxautostart-service
383 install_init_script vboxweb-service.sh vboxweb-service
384 delrunlevel vboxdrv > /dev/null 2>&1
385 addrunlevel vboxdrv 20 80 # This may produce useful output
386 delrunlevel vboxballoonctrl-service > /dev/null 2>&1
387 addrunlevel vboxballoonctrl-service 25 75 # This may produce useful output
388 delrunlevel vboxautostart-service > /dev/null 2>&1
389 addrunlevel vboxautostart-service 25 75 # This may produce useful output
390 delrunlevel vboxweb-service > /dev/null 2>&1
391 addrunlevel vboxweb-service 25 75 # This may produce useful output
392
393 # Create users group
394 groupadd $GROUPNAME 2> /dev/null
395
396 # Create symlinks to start binaries
397 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VirtualBox
398 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxManage
399 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxSDL
400 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxVRDP
401 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxHeadless
402 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxBalloonCtrl
403 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxAutostart
404 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/vboxwebsrv
405 ln -sf $INSTALLATION_DIR/VBox.png /usr/share/pixmaps/VBox.png
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
419 # Icons
420 cur=`pwd`
421 cd $INSTALLATION_DIR/icons
422 for i in *; do
423 cd $i
424 if [ -d /usr/share/icons/hicolor/$i ]; then
425 for j in *; do
426 if [ "$j" = "virtualbox.png" ]; then
427 dst=apps
428 else
429 dst=mimetypes
430 fi
431 if [ -d /usr/share/icons/hicolor/$i/$dst ]; then
432 ln -s $INSTALLATION_DIR/icons/$i/$j /usr/share/icons/hicolor/$i/$dst/$j
433 echo /usr/share/icons/hicolor/$i/$dst/$j >> $CONFIG_DIR/$CONFIG_FILES
434 fi
435 done
436 fi
437 cd -
438 done
439 cd $cur
440
441 # Update the MIME database
442 update-mime-database /usr/share/mime 2>/dev/null
443
444 # Update the desktop database
445 update-desktop-database -q 2>/dev/null
446
447 # If Python is available, install Python bindings
448 if [ -n "$PYTHON" ]; then
449 maybe_run_python_bindings_installer $INSTALLATION_DIR
450 fi
451
452 install_device_node_setup "$VBOXDRV_GRP" "$VBOXDRV_MODE" "$INSTALLATION_DIR"
453
454 # Write the configuration. Do this before we call /etc/init.d/vboxdrv setup!
455 echo "# VirtualBox installation directory" > $CONFIG_DIR/$CONFIG
456 echo "INSTALL_DIR='$INSTALLATION_DIR'" >> $CONFIG_DIR/$CONFIG
457 echo "# VirtualBox version" >> $CONFIG_DIR/$CONFIG
458 echo "INSTALL_VER='$VERSION'" >> $CONFIG_DIR/$CONFIG
459 echo "INSTALL_REV='$SVNREV'" >> $CONFIG_DIR/$CONFIG
460 echo "# Build type and user name for logging purposes" >> $CONFIG_DIR/$CONFIG
461 echo "BUILD_TYPE='$BUILD_BUILDTYPE'" >> $CONFIG_DIR/$CONFIG
462 echo "USERNAME='$BUILD_USERNAME'" >> $CONFIG_DIR/$CONFIG
463
464 # Make kernel module
465 MODULE_FAILED="false"
466 if [ "$BUILD_MODULE" = "true" ]
467 then
468 info "Building the VirtualBox kernel modules"
469 log "Output from the module build process (the Linux kernel build system) follows:"
470 cur=`pwd`
471 log ""
472 setup_init_script vboxdrv
473 # Start VirtualBox kernel module
474 if [ $RETVAL -eq 0 ] && ! start_init_script vboxdrv; then
475 info "Failed to load the kernel module."
476 MODULE_FAILED="true"
477 RC_SCRIPT=1
478 fi
479 start_init_script vboxballoonctrl-service
480 start_init_script vboxautostart-service
481 start_init_script vboxweb-service
482 log ""
483 log "End of the output from the Linux kernel build system."
484 cd $cur
485 fi
486
487 info ""
488 if [ ! "$MODULE_FAILED" = "true" ]
489 then
490 info "VirtualBox has been installed successfully."
491 else
492 info "VirtualBox has been installed successfully, but the kernel module could not"
493 info "be built. When you have fixed the problems preventing this, execute"
494 info " /etc/init.d/vboxdrv setup"
495 info "as administrator to build it."
496 fi
497 info ""
498 info "You will find useful information about using VirtualBox in the user manual"
499 info " $INSTALLATION_DIR/UserManual.pdf"
500 info "and in the user FAQ"
501 info " http://www.virtualbox.org/wiki/User_FAQ"
502 info ""
503 info "We hope that you enjoy using VirtualBox."
504 info ""
505 log "Installation successful"
506elif [ "$ACTION" = "uninstall" ]; then
507 . ./uninstall.sh
508fi
509exit $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