VirtualBox

source: vbox/trunk/src/VBox/Additions/linux/installer/vboxadd-x11.sh@ 48509

Last change on this file since 48509 was 46574, checked in by vboxsync, 11 years ago

Additions/linux: make XFree86 configuration file generation work without a template too.

  • Property svn:eol-style set to LF
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 20.3 KB
Line 
1#! /bin/sh
2#
3# Linux Additions X11 setup init script ($Revision: 46574 $)
4#
5
6#
7# Copyright (C) 2006-2012 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
18
19# chkconfig: 35 30 70
20# description: VirtualBox Linux Additions kernel modules
21#
22### BEGIN INIT INFO
23# Provides: vboxadd-x11
24# Required-Start:
25# Required-Stop:
26# Default-Start:
27# Default-Stop:
28# Description: VirtualBox Linux Additions X11 setup
29### END INIT INFO
30
31PATH=$PATH:/bin:/sbin:/usr/sbin
32LOG="/var/log/vboxadd-install-x11.log"
33CONFIG_DIR="/var/lib/VBoxGuestAdditions"
34CONFIG="config"
35
36# Check architecture
37cpu=`uname -m`;
38case "$cpu" in
39 i[3456789]86|x86)
40 cpu="x86"
41 LIB="/usr/lib"
42 ;;
43 x86_64|amd64)
44 cpu="amd64"
45 if test -d "/usr/lib64"; then
46 LIB="/usr/lib64"
47 else
48 LIB="/usr/lib"
49 fi
50 ;;
51esac
52
53# Find the version of X installed
54# The last of the three is for the X.org 6.7 included in Fedora Core 2
55xver=`X -version 2>&1`
56x_version=`echo "$xver" | sed -n 's/^X Window System Version \([0-9.]\+\)/\1/p'``echo "$xver" | sed -n 's/^XFree86 Version \([0-9.]\+\)/\1/p'``echo "$xver" | sed -n 's/^X Protocol Version 11, Revision 0, Release \([0-9.]\+\)/\1/p'``echo "$xver" | sed -n 's/^X.Org X Server \([0-9.]\+\)/\1/p'`
57x_version_short=`echo "${x_version}" | sed 's/\([0-9]*\.[0-9]*\)\..*/\1/'`
58# Version of Redhat or Fedora installed. Needed for setting up selinux policy.
59redhat_release=`cat /etc/redhat-release 2> /dev/null`
60# All the different possible locations for XFree86/X.Org configuration files
61# - how many of these have ever been used?
62x11conf_files="/etc/X11/xorg.conf /etc/X11/xorg.conf-4 /etc/X11/.xorg.conf \
63 /etc/xorg.conf /usr/etc/X11/xorg.conf-4 /usr/etc/X11/xorg.conf \
64 /usr/lib/X11/xorg.conf-4 /usr/lib/X11/xorg.conf /etc/X11/XF86Config-4 \
65 /etc/X11/XF86Config /etc/XF86Config /usr/X11R6/etc/X11/XF86Config-4 \
66 /usr/X11R6/etc/X11/XF86Config /usr/X11R6/lib/X11/XF86Config-4 \
67 /usr/X11R6/lib/X11/XF86Config"
68
69if [ -f /etc/arch-release ]; then
70 system=arch
71elif [ -f /etc/redhat-release ]; then
72 system=redhat
73elif [ -f /etc/debian_version ]; then
74 system=debian
75elif [ -f /etc/SuSE-release ]; then
76 system=suse
77elif [ -f /etc/gentoo-release ]; then
78 system=gentoo
79elif [ -f /etc/lfs-release -a -d /etc/rc.d/init.d ]; then
80 system=lfs
81else
82 system=other
83fi
84
85if [ "$system" = "arch" ]; then
86 USECOLOR=yes
87 . /etc/rc.d/functions
88 fail_msg() {
89 stat_fail
90 }
91
92 succ_msg() {
93 stat_done
94 }
95
96 begin() {
97 stat_busy "$1"
98 }
99fi
100
101if [ "$system" = "redhat" ]; then
102 . /etc/init.d/functions
103 fail_msg() {
104 echo_failure
105 echo
106 }
107 succ_msg() {
108 echo_success
109 echo
110 }
111 begin() {
112 echo -n "$1"
113 }
114fi
115
116if [ "$system" = "suse" ]; then
117 . /etc/rc.status
118 fail_msg() {
119 rc_failed 1
120 rc_status -v
121 }
122 succ_msg() {
123 rc_reset
124 rc_status -v
125 }
126 begin() {
127 echo -n "$1"
128 }
129fi
130
131if [ "$system" = "gentoo" ]; then
132 if [ -f /sbin/functions.sh ]; then
133 . /sbin/functions.sh
134 elif [ -f /etc/init.d/functions.sh ]; then
135 . /etc/init.d/functions.sh
136 fi
137 fail_msg() {
138 eend 1
139 }
140 succ_msg() {
141 eend $?
142 }
143 begin() {
144 ebegin $1
145 }
146 if [ "`which $0`" = "/sbin/rc" ]; then
147 shift
148 fi
149fi
150
151if [ "$system" = "lfs" ]; then
152 . /etc/rc.d/init.d/functions
153 fail_msg() {
154 echo_failure
155 }
156 succ_msg() {
157 echo_ok
158 }
159 begin() {
160 echo $1
161 }
162fi
163
164if [ "$system" = "debian" -o "$system" = "other" ]; then
165 fail_msg() {
166 echo " ...fail!"
167 }
168 succ_msg() {
169 echo " ...done."
170 }
171 begin() {
172 echo -n $1
173 }
174fi
175
176dev=/dev/vboxguest
177userdev=/dev/vboxuser
178owner=vboxadd
179group=1
180
181fail()
182{
183 if [ "$system" = "gentoo" ]; then
184 eerror $1
185 exit 1
186 fi
187 fail_msg
188 echo "($1)"
189 exit 1
190}
191
192# Install an X11 desktop startup application. The application should be a shell script.
193# Its name should be purely alphanumeric and should start with a two digit number (preferably
194# 98 or thereabouts) to indicate its place in the Debian Xsession startup order.
195#
196# syntax: install_x11_startup_app app desktop service_name
197install_x11_startup_app() {
198 self="install_x11_startup_app"
199 app_src=$1
200 desktop_src=$2
201 service_name=$3
202 alt_command=$4
203 test -r "$app_src" ||
204 { echo >> $LOG "$self: no script given"; return 1; }
205 test -r "$desktop_src" ||
206 { echo >> $LOG "$self: no desktop file given"; return 1; }
207 test -n "$service_name" ||
208 { echo >> $LOG "$self: no service given"; return 1; }
209 test -n "$alt_command" ||
210 { echo >> $LOG "$self: no service given"; return 1; }
211 app_dest=`basename $app_src sh`
212 app_dest_sh=`basename $app_src sh`.sh
213 desktop_dest=`basename $desktop_src`
214 found=0
215 x11_autostart="/etc/xdg/autostart"
216 kde_autostart="/usr/share/autostart"
217 redhat_dir=/etc/X11/Xsession.d
218 mandriva_dir=/etc/X11/xinit.d
219 debian_dir=/etc/X11/xinit/xinitrc.d
220 if [ -d "$mandriva_dir" -a -w "$mandriva_dir" -a -x "$mandriva_dir" ]
221 then
222 install -m 0644 $app_src "$mandriva_dir/$app_dest"
223 found=1
224 fi
225 if [ -d "$x11_autostart" -a -w "$x11_autostart" -a -x "$x11_autostart" ]
226 then
227 install -m 0644 $desktop_src "$x11_autostart/$desktop_dest"
228 found=1
229 fi
230 if [ -d "$kde_autostart" -a -w "$kde_autostart" -a -x "$kde_autostart" ]
231 then
232 install -m 0644 $desktop_src "$kde_autostart/$desktop_dest"
233 found=1
234 fi
235 if [ -d "$redhat_dir" -a -w "$redhat_dir" -a -x "$redhat_dir" ]
236 then
237 install -m 0644 $app_src "$redhat_dir/$app_dest"
238 found=1
239 fi
240 if [ -d "$debian_dir" -a -w "$debian_dir" -a -x "$debian_dir" ]
241 then
242 install -m 0755 $app_src "$debian_dir/$app_dest_sh"
243 found=1
244 fi
245 if [ $found -eq 1 ]; then
246 return 0
247 fi
248 cat >> $LOG << EOF
249Could not set up the $service_name desktop service.
250To start it at log-in for a given user, add the command $alt_command
251to the file .xinitrc in their home directory.
252EOF
253 return 1
254}
255
256
257start()
258{
259 # Todo: check configuration and correct it if necessary
260 return 0
261}
262
263stop()
264{
265 return 0
266}
267
268restart()
269{
270 stop && start
271 return 0
272}
273
274# setup_script
275setup()
276{
277 echo "VirtualBox Guest Additions installation, Window System and desktop setup" > $LOG
278 begin "Installing the Window System drivers"
279 lib_dir="$LIB/VBoxGuestAdditions"
280 share_dir="/usr/share/VBoxGuestAdditions"
281 test -x "$lib_dir" -a -x "$share_dir" ||
282 fail "Invalid Guest Additions configuration found"
283 # By default we want to configure X
284 dox11config="true"
285 # By default, we want to run our xorg.conf setup script
286 setupxorgconf="true"
287 # All but the oldest supported X servers can automatically set up the
288 # keyboard driver.
289 autokeyboard="--autoKeyboard"
290 # On more recent servers our kernel mouse driver will be used
291 # automatically
292 automouse="--autoMouse"
293 # We need to tell our xorg.conf hacking script whether /dev/psaux exists
294 nopsaux="--nopsaux"
295 case "`uname -r`" in 2.4.*)
296 test -c /dev/psaux && nopsaux="";;
297 esac
298 # The video driver to install for X.Org 6.9+
299 vboxvideo_src=
300 # The mouse driver to install for X.Org 6.9+
301 vboxmouse_src=
302 # The driver extension
303 driver_ext=".so"
304 # The configuration file we generate if no original was found but we need
305 # one.
306 main_cfg="/etc/X11/xorg.conf"
307
308 modules_dir=`X -showDefaultModulePath 2>&1` || modules_dir=
309 if [ -z "$modules_dir" ]; then
310 for dir in /usr/lib64/xorg/modules /usr/lib/xorg/modules /usr/X11R6/lib64/modules /usr/X11R6/lib/modules /usr/X11R6/lib/X11/modules; do
311 if [ -d $dir ]; then
312 modules_dir=$dir
313 break
314 fi
315 done
316 fi
317
318 test -z "$x_version" -o -z "$modules_dir" &&
319 fail "Could not find the X.Org or XFree86 Window System."
320
321 echo
322 # openSUSE 10.3 shipped X.Org 7.2 with X.Org Server 1.3, but didn't
323 # advertise the fact.
324 if grep -q '10\.3' /etc/SuSE-release 2>/dev/null; then
325 case $x_version in 7.2.*)
326 x_version=1.3.0;;
327 esac
328 fi
329 case $x_version in
330 1.*.99.* )
331 echo "Warning: unsupported pre-release version of X.Org Server installed. Not"
332 echo "installing the X.Org drivers."
333 dox11config=""
334 ;;
335 1.11.* )
336 xserver_version="X.Org Server 1.11"
337 vboxvideo_src=vboxvideo_drv_111.so
338 test "$system" = "redhat" || setupxorgconf=""
339 ;;
340 1.10.* )
341 xserver_version="X.Org Server 1.10"
342 vboxvideo_src=vboxvideo_drv_110.so
343 test "$system" = "redhat" || setupxorgconf=""
344 ;;
345 1.9.* )
346 xserver_version="X.Org Server 1.9"
347 vboxvideo_src=vboxvideo_drv_19.so
348 # Fedora 14 to 16 patched out vboxvideo detection
349 test "$system" = "redhat" || setupxorgconf=""
350 ;;
351 1.8.* )
352 xserver_version="X.Org Server 1.8"
353 vboxvideo_src=vboxvideo_drv_18.so
354 # Fedora 13 shipped without vboxvideo detection
355 test "$system" = "redhat" || setupxorgconf=""
356 ;;
357 1.7.* )
358 xserver_version="X.Org Server 1.7"
359 vboxvideo_src=vboxvideo_drv_17.so
360 setupxorgconf=""
361 ;;
362 1.6.* )
363 xserver_version="X.Org Server 1.6"
364 vboxvideo_src=vboxvideo_drv_16.so
365 vboxmouse_src=vboxmouse_drv_16.so
366 # SUSE SLE* with X.Org 1.6 does not do input autodetection;
367 # openSUSE does.
368 if grep -q -E '^SLE[^ ]' /etc/SuSE-brand 2>/dev/null; then
369 automouse=""
370 else
371 test "$system" = "suse" && setupxorgconf=""
372 fi
373 ;;
374 1.5.* )
375 xserver_version="X.Org Server 1.5"
376 vboxvideo_src=vboxvideo_drv_15.so
377 vboxmouse_src=vboxmouse_drv_15.so
378 # SUSE with X.Org 1.5 is another special case, and is also
379 # handled specially
380 test "$system" = "suse" && automouse=""
381 ;;
382 1.4.* )
383 xserver_version="X.Org Server 1.4"
384 vboxvideo_src=vboxvideo_drv_14.so
385 vboxmouse_src=vboxmouse_drv_14.so
386 automouse=""
387 ;;
388 1.3.* )
389 # This was the first release which gave the server version number
390 # rather than the X11 release version when you did 'X -version'.
391 xserver_version="X.Org Server 1.3"
392 vboxvideo_src=vboxvideo_drv_13.so
393 vboxmouse_src=vboxmouse_drv_13.so
394 automouse=""
395 ;;
396 7.1.* | 7.2.* )
397 xserver_version="X.Org 7.1"
398 vboxvideo_src=vboxvideo_drv_71.so
399 vboxmouse_src=vboxmouse_drv_71.so
400 automouse=""
401 ;;
402 6.9.* | 7.0.* )
403 xserver_version="X.Org 6.9/7.0"
404 vboxvideo_src=vboxvideo_drv_70.so
405 vboxmouse_src=vboxmouse_drv_70.so
406 automouse=""
407 ;;
408 6.7* | 6.8.* | 4.2.* | 4.3.* )
409 # As the module binaries are the same we use one text for these
410 # four server versions.
411 xserver_version="XFree86 4.2/4.3 and X.Org 6.7/6.8"
412 driver_ext=.o
413 vboxvideo_src=vboxvideo_drv.o
414 vboxmouse_src=vboxmouse_drv.o
415 automouse=""
416 autokeyboard=""
417 case $x_version in
418 6.8.* )
419 autokeyboard="true"
420 ;;
421 4.2.* | 4.3.* )
422 main_cfg="/etc/X11/XF86Config"
423 ;;
424 esac
425 ;;
426 * )
427 # Anything else, including all X server versions as of 1.12.
428 xserver_version="X.Org Server ${x_version_short}"
429 vboxvideo_src=vboxvideo_drv_`echo ${x_version_short} | sed 's/\.//'`.so
430 setupxorgconf=""
431 test -f "${lib_dir}/${vboxvideo_src}" ||
432 {
433 echo "Warning: unknown version of the X Window System installed. Not installing"
434 echo "X Window System drivers."
435 dox11config=""
436 vboxvideo_src=""
437 }
438 ;;
439 esac
440 test -n "${dox11config}" &&
441 begin "Installing $xserver_version modules"
442 rm "$modules_dir/drivers/vboxvideo_drv$driver_ext" 2>/dev/null
443 rm "$modules_dir/input/vboxmouse_drv$driver_ext" 2>/dev/null
444 case "$vboxvideo_src" in ?*)
445 ln -s "$lib_dir/$vboxvideo_src" "$modules_dir/drivers/vboxvideo_drv$driver_ext";;
446 esac
447 case "$vboxmouse_src" in ?*)
448 ln -s "$lib_dir/$vboxmouse_src" "$modules_dir/input/vboxmouse_drv$driver_ext";;
449 esac
450 succ_msg
451
452 if test -n "$dox11config"; then
453 begin "Setting up the Window System to use the Guest Additions"
454 # Certain Ubuntu/Debian versions use a special PCI-id file to identify
455 # video drivers. Some versions have the directory and don't use it.
456 # Those versions can autoload vboxvideo though, so we don't need to
457 # hack the configuration file for them.
458 test "$system" = "debian" -a -d /usr/share/xserver-xorg/pci &&
459 {
460 rm -f "/usr/share/xserver-xorg/pci/vboxvideo.ids"
461 ln -s "$share_dir/vboxvideo.ids" /usr/share/xserver-xorg/pci 2>/dev/null
462 test -n "$automouse" && setupxorgconf=""
463 }
464
465 # Do the XF86Config/xorg.conf hack for those versions that require it
466 configured=""
467 generated=""
468 if test -n "$setupxorgconf"; then
469 for i in $x11conf_files; do
470 if test -r "$i"; then
471 if grep -q "VirtualBox generated" "$i"; then
472 generated="$generated `printf "$i\n"`"
473 else
474 "$lib_dir/x11config.sh" $autokeyboard $automouse $nopsaux "$i"
475 fi
476 configured="true"
477 fi
478 # Timestamp, so that we can see if the config file is changed
479 # by someone else later
480 test -r "$i.vbox" && touch "$i.vbox"
481 done
482 # X.Org Server 1.5 and 1.6 can detect hardware they know, but they
483 # need a configuration file for VBoxVideo.
484 nobak_cfg="`expr "${main_cfg}" : '\([^.]*\)'`.vbox.nobak"
485 if test -z "$configured"; then
486 touch "$main_cfg"
487 "$lib_dir/x11config.sh" $autokeyboard $automouse $nopsaux --noBak "$main_cfg"
488 touch "${nobak_cfg}"
489 fi
490 fi
491 succ_msg
492 test -n "$generated" &&
493 cat << EOF
494The following X.Org/XFree86 configuration files were originally generated by
495the VirtualBox Guest Additions and were not modified:
496
497$generated
498
499EOF
500 cat << EOF
501You may need to restart the hal service and the Window System (or just restart
502the guest system) to enable the Guest Additions.
503
504EOF
505 fi
506
507 begin "Installing graphics libraries and desktop services components"
508 case "$redhat_release" in
509 # Install selinux policy for Fedora 7 and 8 to allow the X server to
510 # open device files
511 Fedora\ release\ 7* | Fedora\ release\ 8* )
512 semodule -i "$share_dir/vbox_x11.pp" > /dev/null 2>&1
513 ;;
514 # Similar for the accelerated graphics check on Fedora 15
515 Fedora\ release\ 15* )
516 semodule -i "$share_dir/vbox_accel.pp" > /dev/null 2>&1
517 ;;
518 esac
519
520 # Install selinux policy for Fedora 8 to allow the X server to
521 # open our drivers
522 case "$redhat_release" in
523 Fedora\ release\ 8* )
524 chcon -u system_u -t lib_t "$lib_dir"/*.so
525 ;;
526 esac
527
528 # Our logging code generates some glue code on 32-bit systems. At least F10
529 # needs a rule to allow this. Send all output to /dev/null in case this is
530 # completely irrelevant on the target system.
531 chcon -t unconfined_execmem_exec_t '/usr/bin/VBoxClient' > /dev/null 2>&1
532 semanage fcontext -a -t unconfined_execmem_exec_t '/usr/bin/VBoxClient' > /dev/null 2>&1
533 # Install the guest OpenGL drivers. For now we don't support
534 # multi-architecture installations
535 for dir in /usr/lib/dri /usr/lib32/dri /usr/lib64/dri \
536 /usr/lib/xorg/modules/dri /usr/lib32/xorg/modules/dri \
537 /usr/lib64/xorg/modules/dri /usr/lib/i386-linux-gnu/dri \
538 /usr/lib/x86_64-linux-gnu/dri; do
539 if [ -d $dir ]; then
540 rm -f "$dir/vboxvideo_dri.so"
541 ln -s "$LIB/VBoxOGL.so" "$dir/vboxvideo_dri.so"
542 fi
543 done
544
545 # And set up VBoxClient to start when the X session does
546 install_x11_startup_app "$lib_dir/98vboxadd-xclient" "$share_dir/vboxclient.desktop" VBoxClient VBoxClient-all ||
547 fail "See the log file $LOG for more information."
548 succ_msg
549}
550
551# cleanup_script
552cleanup()
553{
554 # Restore xorg.conf files as far as possible
555 # List of generated files which have been changed since we generated them
556 newer=""
557 # Are we dealing with a legacy information which didn't support
558 # uninstallation?
559 legacy=""
560 # Do any of the restored configuration files still reference our drivers?
561 failed=""
562 # Have we encountered a "nobak" configuration file which means that there
563 # is no original file to restore?
564 nobak=""
565 test -r "$CONFIG_DIR/$CONFIG" || legacy="true"
566 for main_cfg in "/etc/X11/xorg.conf" "/etc/X11/XF86Config"; do
567 nobak_cfg="`expr "${main_cfg}" : '\([^.]*\)'`.vbox.nobak"
568 if test -r "${nobak_cfg}"; then
569 test -r "${main_cfg}" &&
570 if test -n "${legacy}" -o ! "${nobak_cfg}" -ot "${main_cfg}"; then
571 rm -f "${nobak_cfg}" "${main_cfg}"
572 else
573 newer="${newer}`printf " ${main_cfg} (no original)\n"`"
574 fi
575 nobak="true"
576 fi
577 done
578 if test -n "${nobak}"; then
579 for i in $x11conf_files; do
580 if test -r "$i.vbox"; then
581 if test ! "$i" -nt "$i.vbox" -o -n "$legacy"; then
582 mv -f "$i.vbox" "$i"
583 grep -q -E 'vboxvideo|vboxmouse' "$i" &&
584 failed="$failed`printf " $i\n"`"
585 else
586 newer="$newer`printf " $i ($i.vbox)\n"`"
587 fi
588 fi
589 done
590 fi
591 test -n "$newer" && cat << EOF
592
593The following X.Org/XFree86 configuration files were not restored, as they may
594have been changed since they were generated by the VirtualBox Guest Additions.
595You may wish to restore these manually. The file name in brackets is the
596original version.
597
598$newer
599
600EOF
601 test -n "$failed" && cat << EOF
602
603The following X.Org/XFree86 configuration files were restored, but still
604contain references to the Guest Additions drivers. You may wish to check and
605possibly correct the restored configuration files to be sure that the server
606will continue to work after it is restarted.
607
608$failed
609
610EOF
611
612 # Remove X.Org drivers
613 find "$x11_modules_dir" /usr/lib64/xorg/modules /usr/lib/xorg/modules \
614 /usr/X11R6/lib64/modules /usr/X11R6/lib/modules \
615 /usr/X11R6/lib/X11/modules \
616 '(' -name 'vboxvideo_drv*' -o -name 'vboxmouse_drv*' ')' \
617 -exec rm -f '{}' ';' 2>/dev/null
618
619 # Remove the link to vboxvideo_dri.so
620 rm -f /usr/lib/dri/vboxvideo_dri.so /usr/lib64/dri/vboxvideo_dri.so 2>/dev/null
621
622 # Remove VBoxClient autostart files
623 rm /etc/X11/Xsession.d/98vboxadd-xclient 2>/dev/null
624 rm /etc/X11/xinit.d/98vboxadd-xclient 2>/dev/null
625 rm /etc/X11/xinit/xinitrc.d/98vboxadd-xclient.sh 2>/dev/null
626 rm /etc/xdg/autostart/vboxclient.desktop 2>/dev/null
627 rm /usr/share/autostart/vboxclient.desktop 2>/dev/null
628
629 # Remove other files
630 rm /usr/share/xserver-xorg/pci/vboxvideo.ids 2>/dev/null
631}
632
633dmnstatus()
634{
635 /bin/true
636}
637
638case "$1" in
639start)
640 start
641 ;;
642stop)
643 stop
644 ;;
645restart)
646 restart
647 ;;
648setup)
649 setup
650 ;;
651cleanup)
652 cleanup
653 ;;
654status)
655 dmnstatus
656 ;;
657*)
658 echo "Usage: $0 {start|stop|restart|status}"
659 exit 1
660esac
661
662exit
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