VirtualBox

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

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

Linux installer: properly handle VBoxExtPackHelperApp

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 19.3 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 test -e $INSTALLATION_DIR/VBoxExtPackHelperApp && chmod 4511 $INSTALLATION_DIR/VBoxExtPackHelperApp
357
358 ln -sf $INSTALLATION_DIR/VBoxVMM.so $INSTALLATION_DIR/components/VBoxVMM.so
359 ln -sf $INSTALLATION_DIR/VBoxREM.so $INSTALLATION_DIR/components/VBoxREM.so
360 ln -sf $INSTALLATION_DIR/VBoxRT.so $INSTALLATION_DIR/components/VBoxRT.so
361 ln -sf $INSTALLATION_DIR/VBoxDDU.so $INSTALLATION_DIR/components/VBoxDDU.so
362 ln -sf $INSTALLATION_DIR/VBoxXPCOM.so $INSTALLATION_DIR/components/VBoxXPCOM.so
363
364 chmod go-w $INSTALLATION_DIR
365 fi
366
367 # This binary needs to be suid root in any case, even if not hardened
368 test -e $INSTALLATION_DIR/VBoxNetAdpCtl && chmod 4511 $INSTALLATION_DIR/VBoxNetAdpCtl
369
370 # Install runlevel scripts
371 install_init_script vboxdrv.sh vboxdrv
372 install_init_script vboxweb-service.sh vboxweb-service
373 delrunlevel vboxdrv > /dev/null 2>&1
374 addrunlevel vboxdrv 20 80 # This may produce useful output
375 delrunlevel vboxweb-service > /dev/null 2>&1
376 addrunlevel vboxweb-service 25 75 # This may produce useful output
377
378 # Create users group
379 groupadd $GROUPNAME 2> /dev/null
380
381 # Create symlinks to start binaries
382 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VirtualBox
383 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxManage
384 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxSDL
385 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxVRDP
386 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxHeadless
387 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/vboxwebsrv
388 ln -sf $INSTALLATION_DIR/VBox.png /usr/share/pixmaps/VBox.png
389 ln -sf $INSTALLATION_DIR/virtualbox.desktop /usr/share/applications/virtualbox.desktop
390 ln -sf $INSTALLATION_DIR/virtualbox.xml /usr/share/mime/packages/virtualbox.xml
391 ln -sf $INSTALLATION_DIR/rdesktop-vrdp /usr/bin/rdesktop-vrdp
392 ln -sf $INSTALLATION_DIR/src/vboxhost /usr/src/vboxhost-_VERSION_
393
394 # Convenience symlinks. The creation fails if the FS is not case sensitive
395 ln -sf VirtualBox /usr/bin/virtualbox > /dev/null 2>&1
396 ln -sf VBoxManage /usr/bin/vboxmanage > /dev/null 2>&1
397 ln -sf VBoxSDL /usr/bin/vboxsdl > /dev/null 2>&1
398 ln -sf VBoxHeadless /usr/bin/vboxheadless > /dev/null 2>&1
399
400 # Icons
401 cur=`pwd`
402 cd $INSTALLATION_DIR/icons
403 for i in *; do
404 cd $i
405 if [ -d /usr/share/icons/hicolor/$i ]; then
406 for j in *; do
407 if [ -d /usr/share/icons/hicolor/$i/mimetypes ]; then
408 ln -s $INSTALLATION_DIR/icons/$i/$j /usr/share/icons/hicolor/$i/mimetypes/$j
409 echo /usr/share/icons/hicolor/$i/mimetypes/$j >> $CONFIG_DIR/$CONFIG_FILES
410 fi
411 done
412 fi
413 cd -
414 done
415 cd $cur
416
417 # Update the MIME database
418 update-mime-database /usr/share/mime 2>/dev/null
419
420 # Update the desktop database
421 update-desktop-database -q 2>/dev/null
422
423 # If Python is available, install Python bindings
424 if [ -n "$PYTHON" ]; then
425 maybe_run_python_bindings_installer $INSTALLATION_DIR
426 fi
427
428 # Create udev description file
429 if [ -d /etc/udev/rules.d ]; then
430 udev_call=""
431 udev_app=`which udevadm 2> /dev/null`
432 if [ $? -eq 0 ]; then
433 udev_call="${udev_app} version 2> /dev/null"
434 else
435 udev_app=`which udevinfo 2> /dev/null`
436 if [ $? -eq 0 ]; then
437 udev_call="${udev_app} -V 2> /dev/null"
438 fi
439 fi
440 udev_fix="="
441 if [ "${udev_call}" != "" ]; then
442 udev_out=`${udev_call}`
443 udev_ver=`expr "$udev_out" : '[^0-9]*\([0-9]*\)'`
444 if [ "$udev_ver" = "" -o "$udev_ver" -lt 55 ]; then
445 udev_fix=""
446 fi
447 fi
448 # Write udev rules
449 echo "KERNEL=${udev_fix}\"vboxdrv\", NAME=\"vboxdrv\", OWNER=\"root\", GROUP=\"$VBOXDRV_GRP\", MODE=\"$VBOXDRV_MODE\"" \
450 > /etc/udev/rules.d/10-vboxdrv.rules
451 echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"add\", RUN=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh \$major \$minor \$attr{bDeviceClass}\"" \
452 >> /etc/udev/rules.d/10-vboxdrv.rules
453 echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"add\", ENV{DEVTYPE}==\"usb_device\", RUN=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh \$major \$minor \$attr{bDeviceClass}\"" \
454 >> /etc/udev/rules.d/10-vboxdrv.rules
455 echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"remove\", RUN=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh --remove \$major \$minor\"" \
456 >> /etc/udev/rules.d/10-vboxdrv.rules
457 echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"remove\", ENV{DEVTYPE}==\"usb_device\", RUN=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh --remove \$major \$minor\"" \
458 >> /etc/udev/rules.d/10-vboxdrv.rules
459 fi
460 # Remove old udev description file
461 if [ -f /etc/udev/rules.d/60-vboxdrv.rules ]; then
462 rm -f /etc/udev/rules.d/60-vboxdrv.rules 2> /dev/null
463 fi
464
465 # Build our device tree
466 for i in /sys/bus/usb/devices/*; do
467 if test -r "$i/dev"; then
468 dev="`cat "$i/dev" 2> /dev/null`"
469 major="`expr "$dev" : '\(.*\):' 2> /dev/null`"
470 minor="`expr "$dev" : '.*:\(.*\)' 2> /dev/null`"
471 class="`cat $i/bDeviceClass 2> /dev/null`"
472 sh "$INSTALLATION_DIR/VBoxCreateUSBNode.sh" "$major" "$minor" "$class" 2>/dev/null
473 fi
474 done
475
476 # Write the configuration. Do this before we call /etc/init.d/vboxdrv setup!
477 echo "# VirtualBox installation directory" > $CONFIG_DIR/$CONFIG
478 echo "INSTALL_DIR='$INSTALLATION_DIR'" >> $CONFIG_DIR/$CONFIG
479 echo "# VirtualBox version" >> $CONFIG_DIR/$CONFIG
480 echo "INSTALL_VER='$VERSION'" >> $CONFIG_DIR/$CONFIG
481 echo "INSTALL_REV='$SVNREV'" >> $CONFIG_DIR/$CONFIG
482
483 # Make kernel module
484 MODULE_FAILED="false"
485 if [ "$BUILD_MODULE" = "true" ]
486 then
487 info "Building the VirtualBox kernel modules"
488 log "Output from the module build process (the Linux kernel build system) follows:"
489 cur=`pwd`
490 log ""
491 setup_init_script vboxdrv
492 # Start VirtualBox kernel module
493 if [ $RETVAL -eq 0 ] && ! start_init_script vboxdrv; then
494 info "Failed to load the kernel module."
495 MODULE_FAILED="true"
496 RC_SCRIPT=1
497 fi
498 start_init_script vboxweb-service
499 log ""
500 log "End of the output from the Linux kernel build system."
501 cd $cur
502 fi
503
504 info ""
505 if [ ! "$MODULE_FAILED" = "true" ]
506 then
507 info "VirtualBox has been installed successfully."
508 else
509 info "VirtualBox has been installed successfully, but the kernel module could not"
510 info "be built. When you have fixed the problems preventing this, execute"
511 info " /etc/init.d/vboxdrv setup"
512 info "as administrator to build it."
513 fi
514 info ""
515 info "You will find useful information about using VirtualBox in the user manual"
516 info " $INSTALLATION_DIR/UserManual.pdf"
517 info "and in the user FAQ"
518 info " http://www.virtualbox.org/wiki/User_FAQ"
519 info ""
520 info "We hope that you enjoy using VirtualBox."
521 info ""
522 log "Installation successful"
523elif [ "$ACTION" = "uninstall" ]; then
524 . ./uninstall.sh
525fi
526exit $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