VirtualBox

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

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

Linux installer: update-desktop-database

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