VirtualBox

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

最後變更 在這個檔案從36747是 36747,由 vboxsync 提交於 14 年 前

Linux installer: higher resolution icon for the start menu

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

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