VirtualBox

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

Last change on this file since 58241 was 58241, checked in by vboxsync, 10 years ago

Installer/linux (host): move kernel module building and clean-up to shared installer script.

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 13.7 KB
Line 
1#!/bin/sh
2#
3# Oracle VM VirtualBox
4# VirtualBox linux installation script
5
6#
7# Copyright (C) 2007-2015 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
23LOG="/var/log/vbox-install.log"
24VERSION="_VERSION_"
25SVNREV="_SVNREV_"
26BUILD="_BUILD_"
27ARCH="_ARCH_"
28HARDENED="_HARDENED_"
29# The "BUILD_" prefixes prevent the variables from being overwritten when we
30# read the configuration from the previous installation.
31BUILD_BUILDTYPE="_BUILDTYPE_"
32BUILD_USERNAME="_USERNAME_"
33CONFIG_DIR="/etc/vbox"
34CONFIG="vbox.cfg"
35CONFIG_FILES="filelist"
36DEFAULT_FILES=`pwd`/deffiles
37GROUPNAME="vboxusers"
38INSTALLATION_DIR="/opt/VirtualBox"
39LICENSE_ACCEPTED=""
40PREV_INSTALLATION=""
41PYTHON="_PYTHON_"
42ACTION=""
43SELF=$1
44RC_SCRIPT=0
45if [ -n "$HARDENED" ]; then
46 VBOXDRV_MODE=0600
47 VBOXDRV_GRP="root"
48else
49 VBOXDRV_MODE=0660
50 VBOXDRV_GRP=$GROUPNAME
51fi
52VBOXUSB_MODE=0664
53VBOXUSB_GRP=$GROUPNAME
54
55
56##############################################################################
57# Helper routines #
58##############################################################################
59
60usage() {
61 info ""
62 info "Usage: install | uninstall"
63 info ""
64 info "Example:"
65 info "$SELF install"
66 exit 1
67}
68
69module_loaded() {
70 lsmod | grep -q "vboxdrv[^_-]"
71}
72
73# This routine makes sure that there is no previous installation of
74# VirtualBox other than one installed using this install script or a
75# compatible method. We do this by checking for any of the VirtualBox
76# applications in /usr/bin. If these exist and are not symlinks into
77# the installation directory, then we assume that they are from an
78# incompatible previous installation.
79
80## Helper routine: test for a particular VirtualBox binary and see if it
81## is a link into a previous installation directory
82##
83## Arguments: 1) the binary to search for and
84## 2) the installation directory (if any)
85## Returns: false if an incompatible version was detected, true otherwise
86check_binary() {
87 binary=$1
88 install_dir=$2
89 test ! -e $binary 2>&1 > /dev/null ||
90 ( test -n "$install_dir" &&
91 readlink $binary 2>/dev/null | grep "$install_dir" > /dev/null
92 )
93}
94
95## Main routine
96##
97## Argument: the directory where the previous installation should be
98## located. If this is empty, then we will assume that any
99## installation of VirtualBox found is incompatible with this one.
100## Returns: false if an incompatible installation was found, true otherwise
101check_previous() {
102 install_dir=$1
103 # These should all be symlinks into the installation folder
104 check_binary "/usr/bin/VirtualBox" "$install_dir" &&
105 check_binary "/usr/bin/VBoxManage" "$install_dir" &&
106 check_binary "/usr/bin/VBoxSDL" "$install_dir" &&
107 check_binary "/usr/bin/VBoxVRDP" "$install_dir" &&
108 check_binary "/usr/bin/VBoxHeadless" "$install_dir" &&
109 check_binary "/usr/bin/VBoxDTrace" "$install_dir" &&
110 check_binary "/usr/bin/VBoxBalloonCtrl" "$install_dir" &&
111 check_binary "/usr/bin/VBoxAutostart" "$install_dir" &&
112 check_binary "/usr/bin/vboxwebsrv" "$install_dir" &&
113 check_binary "/usr/bin/vbox-img" "$install_dir" &&
114 check_binary "/sbin/rcvboxdrv" "$install_dir"
115}
116
117##############################################################################
118# Main script #
119##############################################################################
120
121info "VirtualBox Version $VERSION r$SVNREV ($BUILD) installer"
122
123
124# Make sure that we were invoked as root...
125check_root
126
127# Set up logging before anything else
128create_log $LOG
129
130log "VirtualBox $VERSION r$SVNREV installer, built $BUILD."
131log ""
132log "Testing system setup..."
133
134# Sanity check: figure out whether build arch matches uname arch
135cpu=`uname -m`;
136case "$cpu" in
137 i[3456789]86|x86)
138 cpu="x86"
139 ;;
140 x86_64)
141 cpu="amd64"
142 ;;
143esac
144if [ "$cpu" != "$ARCH" ]; then
145 info "Detected unsupported $cpu environment."
146 log "Detected unsupported $cpu environment."
147 exit 1
148fi
149
150# Sensible default actions
151ACTION="install"
152BUILD_MODULE="true"
153while true
154do
155 if [ "$2" = "" ]; then
156 break
157 fi
158 shift
159 case "$1" in
160 install)
161 ACTION="install"
162 ;;
163
164 uninstall)
165 ACTION="uninstall"
166 ;;
167
168 force)
169 FORCE_UPGRADE=1
170 ;;
171 license_accepted_unconditionally)
172 # Legacy option
173 ;;
174 no_module)
175 BUILD_MODULE=""
176 ;;
177 *)
178 if [ "$ACTION" = "" ]; then
179 info "Unknown command '$1'."
180 usage
181 fi
182 info "Specifying an installation path is not allowed -- using /opt/VirtualBox!"
183 ;;
184 esac
185done
186
187if [ "$ACTION" = "install" ]; then
188 # Choose a proper umask
189 umask 022
190
191 # Find previous installation
192 if test -r "$CONFIG_DIR/$CONFIG"; then
193 . $CONFIG_DIR/$CONFIG
194 PREV_INSTALLATION=$INSTALL_DIR
195 fi
196 if ! check_previous $INSTALL_DIR
197 then
198 info
199 info "You appear to have a version of VirtualBox on your system which was installed"
200 info "from a different source or using a different type of installer (or a damaged"
201 info "installation of VirtualBox). We strongly recommend that you remove it before"
202 info "installing this version of VirtualBox."
203 info
204 info "Do you wish to continue anyway? [yes or no]"
205 read reply dummy
206 if ! expr "$reply" : [yY] && ! expr "$reply" : [yY][eE][sS]
207 then
208 info
209 info "Cancelling installation."
210 log "User requested cancellation of the installation"
211 exit 1
212 fi
213 fi
214
215 # Remove previous installation
216 test "${BUILD_MODULE}" = true || VBOX_DONT_REMOVE_OLD_MODULES=1
217
218 if [ -n "$PREV_INSTALLATION" ]; then
219 [ -n "$INSTALL_REV" ] && INSTALL_REV=" r$INSTALL_REV"
220 info "Removing previous installation of VirtualBox $INSTALL_VER$INSTALL_REV from $PREV_INSTALLATION"
221 log "Removing previous installation of VirtualBox $INSTALL_VER$INSTALL_REV from $PREV_INSTALLATION"
222 log ""
223
224 VBOX_NO_UNINSTALL_MESSAGE=1
225 # This also checks $BUILD_MODULE and $VBOX_DONT_REMOVE_OLD_MODULES
226 . ./uninstall.sh
227 fi
228
229 mkdir -p -m 755 $CONFIG_DIR
230 touch $CONFIG_DIR/$CONFIG
231
232 info "Installing VirtualBox to $INSTALLATION_DIR"
233 log "Installing VirtualBox to $INSTALLATION_DIR"
234 log ""
235
236 # Verify the archive
237 mkdir -p -m 755 $INSTALLATION_DIR
238 bzip2 -d -c VirtualBox.tar.bz2 > VirtualBox.tar
239 if ! tar -tf VirtualBox.tar > $CONFIG_DIR/$CONFIG_FILES; then
240 rmdir $INSTALLATION_DIR 2> /dev/null
241 rm -f $CONFIG_DIR/$CONFIG 2> /dev/null
242 rm -f $CONFIG_DIR/$CONFIG_FILES 2> /dev/null
243 log 'Error running "bzip2 -d -c VirtualBox.tar.bz2" or "tar -tf VirtualBox.tar".'
244 abort "Error installing VirtualBox. Installation aborted"
245 fi
246
247 # Create installation directory and install
248 if ! tar -xf VirtualBox.tar -C $INSTALLATION_DIR; then
249 cwd=`pwd`
250 cd $INSTALLATION_DIR
251 rm -f `cat $CONFIG_DIR/$CONFIG_FILES` 2> /dev/null
252 cd $pwd
253 rmdir $INSTALLATION_DIR 2> /dev/null
254 rm -f $CONFIG_DIR/$CONFIG 2> /dev/null
255 log 'Error running "tar -xf VirtualBox.tar -C '"$INSTALLATION_DIR"'".'
256 abort "Error installing VirtualBox. Installation aborted"
257 fi
258
259 cp uninstall.sh $INSTALLATION_DIR
260 echo "uninstall.sh" >> $CONFIG_DIR/$CONFIG_FILES
261
262 # XXX SELinux: allow text relocation entries
263 set_selinux_permissions "$INSTALLATION_DIR" \
264 "$INSTALLATION_DIR"
265
266 # Hardened build: Mark selected binaries set-user-ID-on-execution,
267 # create symlinks for working around unsupported $ORIGIN/.. in VBoxC.so (setuid),
268 # and finally make sure the directory is only writable by the user (paranoid).
269 if [ -n "$HARDENED" ]; then
270 test -e $INSTALLATION_DIR/VirtualBox && chmod 4511 $INSTALLATION_DIR/VirtualBox
271 test -e $INSTALLATION_DIR/VBoxSDL && chmod 4511 $INSTALLATION_DIR/VBoxSDL
272 test -e $INSTALLATION_DIR/VBoxHeadless && chmod 4511 $INSTALLATION_DIR/VBoxHeadless
273 test -e $INSTALLATION_DIR/VBoxNetDHCP && chmod 4511 $INSTALLATION_DIR/VBoxNetDHCP
274 test -e $INSTALLATION_DIR/VBoxNetNAT && chmod 4511 $INSTALLATION_DIR/VBoxNetNAT
275
276 ln -sf $INSTALLATION_DIR/VBoxVMM.so $INSTALLATION_DIR/components/VBoxVMM.so
277 ln -sf $INSTALLATION_DIR/VBoxRT.so $INSTALLATION_DIR/components/VBoxRT.so
278
279 chmod go-w $INSTALLATION_DIR
280 fi
281
282 # This binaries need to be suid root in any case, even if not hardened
283 test -e $INSTALLATION_DIR/VBoxNetAdpCtl && chmod 4511 $INSTALLATION_DIR/VBoxNetAdpCtl
284 test -e $INSTALLATION_DIR/VBoxVolInfo && chmod 4511 $INSTALLATION_DIR/VBoxVolInfo
285
286 # Write the configuration. Needs to be done before the vboxdrv service is
287 # started.
288 echo "# VirtualBox installation directory" > $CONFIG_DIR/$CONFIG
289 echo "INSTALL_DIR='$INSTALLATION_DIR'" >> $CONFIG_DIR/$CONFIG
290 echo "# VirtualBox version" >> $CONFIG_DIR/$CONFIG
291 echo "INSTALL_VER='$VERSION'" >> $CONFIG_DIR/$CONFIG
292 echo "INSTALL_REV='$SVNREV'" >> $CONFIG_DIR/$CONFIG
293 echo "# Build type and user name for logging purposes" >> $CONFIG_DIR/$CONFIG
294 echo "BUILD_TYPE='$BUILD_BUILDTYPE'" >> $CONFIG_DIR/$CONFIG
295 echo "USERNAME='$BUILD_USERNAME'" >> $CONFIG_DIR/$CONFIG
296
297 # Create users group
298 groupadd -r -f $GROUPNAME 2> /dev/null
299
300 # Create symlinks to start binaries
301 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VirtualBox
302 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxManage
303 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxSDL
304 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxVRDP
305 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxHeadless
306 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxBalloonCtrl
307 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxAutostart
308 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/vboxwebsrv
309 ln -sf $INSTALLATION_DIR/vbox-img /usr/bin/vbox-img
310 ln -sf $INSTALLATION_DIR/VBox.png /usr/share/pixmaps/VBox.png
311 if [ -f $INSTALLATION_DIR/VBoxDTrace ]; then
312 ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxDTrace
313 fi
314 # Unity and Nautilus seem to look here for their icons
315 ln -sf $INSTALLATION_DIR/icons/128x128/virtualbox.png /usr/share/pixmaps/virtualbox.png
316 ln -sf $INSTALLATION_DIR/virtualbox.desktop /usr/share/applications/virtualbox.desktop
317 ln -sf $INSTALLATION_DIR/virtualbox.xml /usr/share/mime/packages/virtualbox.xml
318 ln -sf $INSTALLATION_DIR/rdesktop-vrdp /usr/bin/rdesktop-vrdp
319 ln -sf $INSTALLATION_DIR/src/vboxhost /usr/src/vboxhost-_VERSION_
320
321 # Convenience symlinks. The creation fails if the FS is not case sensitive
322 ln -sf VirtualBox /usr/bin/virtualbox > /dev/null 2>&1
323 ln -sf VBoxManage /usr/bin/vboxmanage > /dev/null 2>&1
324 ln -sf VBoxSDL /usr/bin/vboxsdl > /dev/null 2>&1
325 ln -sf VBoxHeadless /usr/bin/vboxheadless > /dev/null 2>&1
326 if [ -f $INSTALLATION_DIR/VBoxDTrace ]; then
327 ln -sf VBoxDTrace /usr/bin/vboxdtrace > /dev/null 2>&1
328 fi
329
330 # Icons
331 cur=`pwd`
332 cd $INSTALLATION_DIR/icons
333 for i in *; do
334 cd $i
335 if [ -d /usr/share/icons/hicolor/$i ]; then
336 for j in *; do
337 if expr "$j" : "virtualbox\..*" > /dev/null; then
338 dst=apps
339 else
340 dst=mimetypes
341 fi
342 if [ -d /usr/share/icons/hicolor/$i/$dst ]; then
343 ln -s $INSTALLATION_DIR/icons/$i/$j /usr/share/icons/hicolor/$i/$dst/$j
344 echo /usr/share/icons/hicolor/$i/$dst/$j >> $CONFIG_DIR/$CONFIG_FILES
345 fi
346 done
347 fi
348 cd -
349 done
350 cd $cur
351
352 # Update the MIME database
353 update-mime-database /usr/share/mime 2>/dev/null
354
355 # Update the desktop database
356 update-desktop-database -q 2>/dev/null
357
358 # If Python is available, install Python bindings
359 if [ -n "$PYTHON" ]; then
360 maybe_run_python_bindings_installer $INSTALLATION_DIR
361 fi
362
363 # Do post-installation common to all installer types, currently service
364 # script set-up.
365 if test "${BUILD_MODULE}" = "true"; then
366 START_SERVICES=
367 else
368 START_SERVICES="--nostart"
369 fi
370 "${INSTALLATION_DIR}/prerm-common.sh" >> "${LOG}"
371 "${INSTALLATION_DIR}/postinst-common.sh" ${START_SERVICES} >> "${LOG}"
372
373 info ""
374 if [ ! "$MODULE_FAILED" = "true" ]
375 then
376 info "VirtualBox has been installed successfully."
377 else
378 info "VirtualBox has been installed successfully, but the kernel module could not"
379 info "be built. When you have fixed the problems preventing this, execute"
380 info " /sbin/vboxconfig"
381 info "as administrator to build it."
382 fi
383 info ""
384 info "You will find useful information about using VirtualBox in the user manual"
385 info " $INSTALLATION_DIR/UserManual.pdf"
386 info "and in the user FAQ"
387 info " http://www.virtualbox.org/wiki/User_FAQ"
388 info ""
389 info "We hope that you enjoy using VirtualBox."
390 info ""
391 log "Installation successful"
392elif [ "$ACTION" = "uninstall" ]; then
393 . ./uninstall.sh
394fi
395exit $RC_SCRIPT
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette