VirtualBox

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

Last change on this file since 35650 was 35204, checked in by vboxsync, 14 years ago

ExtPack: Require authentication to install extension packs on linux and solaris.

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