- 论坛徽章:
- 0
|
[这个贴子最后由无人喝彩在 2003/01/08 08:33pm 编辑]
简介
这个文章是为了帮助sun的系统管理员和java servlet的开发人员的。读者应该有X windows系统的知识以及理解/etc/rc*.d和/etc/init.d下的shell脚本的能力。
设想一下这样的情节:你做了一个伟大的servlet,生成了一个JPEG的图片,并且它在你的桌面系统运行的良好。现在你必须在服务器上来开发它。但服务器并不像你的桌面系统:没有键盘,没有鼠标,没有屏幕,甚至连一个显示器都没有。你曾经听说过java平台上的图形是依附于X windows系统的,那你现在怎么办?
你可以在你的系统中建立一个Java 2 Platform Standard Edition (J2SE[tm])SDK和X Window系统。通过读下面的内容来学习如何在solaris 7,8和9上使用J2SE SDK v1.2.2,v1.3,和v1.4。在参考资料的那一节中介绍了如何在servlet中编程来创建图片,或在一个安装的servlet 引擎中(类似Tomcat)来创建。
最新的J2SE SDK和Solaris操作系统可以使这个工作更加简单。如果你使用J2SE V1.4,那么你甚至不需要X server。并且,在Solaris9中系统提供了一个不需要图形卡就可以使用的X server(Xvfb)。
如果你使用J2SE v1.3.x或者v1.2.2,那么你的系统需要一个X server。X server是为桌面系统所设计的,它并不适合在服务器上使用。本文将提供一个简单的在服务器系统上利用/etc/rc*.d中的脚本来启动X的方法。
如果你想跳过如何安装,请直接跳到“如何运行”这一章。
Servlets和图形
你可以使用Java servlets来创建JPEG和PNG(portable network graphics)格式的图片并且把它们放到网页上发布。这时候你每天看到的是服务器端的图片--图片由web server来提供--servlets可以使用Java platform graphics APIs来产生或更改图片。servlets可以绘制图表,表格,以及图形;标记地图和照片;增加水印和密码(隐藏的信息);渲染3D模型等--所有在桌面Java平台应用所可以做的事情。
在Solaris操作系统上,Java图形平台需要依靠一个X server和一个硬件上的图形适配卡。如果没有X server,那么Java平台上的应用程序无法使用AWT,Java 2D[tm] API,Java 3D[tm] API,Java Advanced Imaging (JAI) API,或者别的图形API。最近的变化是在Solaris9和J2SE V1.4中提供了简单的方法来配置Java 图形平台服务器。
J2SE v1.4--不需要X server的Java 图形平台
最原始的Java 图形平台的API是为了使用层概念的Solaris图形平台所设计的。层概念是从X windows系统中提出的。在J2SE SDK V1.4中,一个命令行的选项可以使其不再需要X window系统。这个功能叫无头支持,在http://java.sun.com/j2se/1.4/docs/guide/awt/AWTChanges.html#headless中进行讨论。无头的选项不允许使用类似Java Foundation Classes(Swing)一类的GUI class,但可以使用图形渲染API,如:Java2D Java3D 或JAI
这个命令行的选项是:-djava.awt.headless=true
如果想知道更多的信息,请到http://soldc.sun.com/articles/solaris_graphics.html#1a
X Servers
X server是指X windows System。如果你使用的是J2SE v1.3.s或更早的版本,你需要一个X server来使用Java图形平台的APIs。在Solaris的操作系统中包含了很多不同的X server。但对于servlet来说,其中的两个是最重要的。
Xsun:一个X显示服务程序,/usr/openwin/bin/Xsun
Xvfb:一个X虚拟的帧缓冲器,一个纯软件的X server,/usr/openwin/bin/Xvfb
因为一个X server不但管理图形显示,也管理用户输入,所以它使用一个软件驱动来使用图形适配卡,键盘和鼠标。Xsun需要一个硬件的图形适配器,并且它通常需要使用一个鼠标和键盘--在有些情况下系统管理员并不想安装在服务器系统上。一个叫“Null keyboard adn mouse drivers”的程序排除了对鼠标和键盘的需求。这个空的设备在Solaris8中开始以一个补丁包的形式存在,而在Solaris9中,他们是默认存在的。但在更早的Solaris7中是不存在的,可以观看http://soldc.sun.com/articles/xsun.server这个脚本来学习使用一个命令行的选项使用这个空的设备。
为什么要使用Xsun?Xsun可以使图形适配卡加快使用Java 3D API和基于OpenGL的其他APIs的应用程序的运行速度。这些图形适配卡包括:Sun Creator3D, Sun Elite3D, Sun Expert3D, Sun Expert3D-Lite, Sun XVR-500, 和Sun XVR-1000。这些图形适配卡可以提供一些硬件上的对OpenGL的支持。
和Xsun正相反,Xvfb不需要图形或I/O硬件--不需要键盘和鼠标,并且它使用系统的RAM按理代替图形适配卡。如果不使用Java 3D和其他的基于OpenGL的APIs,那么Xvfb将是十分好用的。Sloaris9是第一个包含有Xvfb的系统,但Xvfb作为一个免费的X资源,任何人都可以得到和编译Xvfb,以便在更早的Solaris版本中使用。如果你使用了它,你也可以得到一些的支持。在参考资料那一节,列出了一些网站上有已经编译好的Solaris系统下的Xvfb,但从安全和保密的角度考虑,你最好编译一个自己的Xvfb。参考网站为:http://www.x.org
在正常的命令选项中,Xsun要求用户登陆一个console。当用户登陆的使用,一个X server要在运行。和桌面系统不同的是:一个服务必须随时准备提供服务,就算没有任何用户登陆进来。这个服务必须在重起后就启动。在这里我将介绍如何设置而使使X server总是处于运行的状态。我也将介绍如何控制访问X server,这样只有被支持的进程才可以使用图形系统。
运行X server的用户必须同时也是运行servlet引擎的用户,当你要使用你的servlet引擎的时候,选择或创建好你的用户,不管他是一个独立的servlet,如Tomcat,一个网页服务如Sun[tm] ONE Web Server或者一个应用服务如IBM WebSphere Application Server 或BEA WebLogic Server的用户。在这个脚本里,默认的用户名是tomcat,因为我们假设你使用这个用户来运行Tomcat servlet引擎。
运行X Servers
一般情况下,在一个用户登陆的时候,dtlogin程序调用X server。但这对一个一天运行24小时然并自动重新启动的系统来说并不是一个好注意。xsun.server和svfb.server这两个脚本提供了两种不同的运行X server的方法。使用它们的目的是使你的系统可以不被照顾的运行,并且在重新启动后可以不需要任何操作就提供服务。
X server一般是由CDE下的dtlogin程序启动的。然后X server提供这样的机制:xdm和xinit来产生X server。他们是用来使X server可以被可户端交互使用。对使用Java servlets的X server来说,他们存在着缺陷。在这里我介绍两个/etc/rc*.d下的启动脚本来运行Xsun和Xvfb:xsun.server(http://soldc.sun.com/articles/xsun.server)和xvfb.server(
http://soldc.sun.com/articles/xvfb.server)这个脚本是在/etc/init.d下。install.xsun和install.xvfb脚本创建了一个连接到/etc/rc0.d,/etc/rc1.d和/etc/rc2.d下来启动和停止X server。这里是xsun.server脚本。xvfb.server脚本是十分小的。
#!/sbin/sh
#
# Copyright (c) 1997-2002 by Sun Microsystems, Inc.
# All rights reserved.
#
# xsun.server - start/stop Xsun X server
# 20 September 2002
# CONFIGURE THESE OPTIONS FOR YOUR INSTALLATION
# change this to avoid conflict with existing X servers
DISPLAY_NUMBER=:2
# allow another device to be specified, e.g. vfb or /dev/fb1
DISPLAY_DEVICE="/dev/fb"
# Avoid running X server as root user
# For Java3D servlets, the same user must
# run the X server and the servlet engine.
RUN_AS_USER=tomcat
# END CONFIGURATION
# determine numeric user id from user name
RUN_AS_UID=`/usr/xpg4/bin/id -u $RUN_AS_USER`
# begin X server options
# this script is intended for graphics cards that provide at
# 24-bit (TrueColor) support
# for 8-bit cards, delete "defdepth 24"
X_OPTIONS="-clients 1024 -nobanner -dev $DISPLAY_DEVICE defdepth 24"
# add for Solaris 8 and later
# null keyboard and mouse drivers
# Solaris 8 requires patches 108652-51 112663-01 or later
# Solaris 9 required no patches
NULL_IO_DRIVERS="+nmouse +nkeyboard"
# add for Solaris 9
# restrict X server connections to non-TCP (local only)
NO_TCP="-nolisten tcp"
# end X server options
if [ ! -d /usr/openwin/bin ] ; then
echo Cannot find /usr/openwin/bin/Xsun
echo Exiting...
exit 1
fi
# turn version number from 5.x into x,
# for example 5.8 into 8
SOLARIS_VERSION=`/bin/uname -r | sed -e 's/^5\.//'`
# add in Xsun options based on Solaris version
if [ $SOLARIS_VERSION -ge 8 ]; then
X_OPTIONS="$NULL_IO_DRIVERS $X_OPTIONS"
elif [ $SOLARIS_VERSION -ge 9 ]; then
X_OPTIONS="$NO_TCP $X_OPTIONS"
fi
case "$1" in
'start')
# only real devices need this section
if [ -f $DISPLAY_DEVICE ] ; then
# set the screen's resolution
/usr/sbin/fbconfig -dev $DISPLAY_DEVICE nocheck \
-res 1280x1024x60 2>; /dev/null
# prevent ttymon (login) process from changing ownership
# of display devices by commenting out /dev/fbs
# This will comment out the line only once.
# don't change the indenting of the line: EOF
ed logindevperm <<EOF >;>;/dev/null
/^[ ]*[^#].*\/dev\/fb/s/^/# for \/etc\/init.d\/xsun.server # /
w
q
EOF
# set ownership of the display device
# to match that of the servlet engine
# this is required for Java3D servlets
/usr/bin/chown $RUN_AS_USER $DISPLAY_DEVICE
fi
echo Starting Xsun as $RUN_AS_USER user for display $DISPLAY_NUMBER
# run as non-root user
# don't change the indenting of the line: EOF
su $RUN_AS_USER <<EOF
/usr/openwin/bin/Xsun $DISPLAY_NUMBER $X_OPTIONS &
EOF
;;
'stop')
echo "Stopping Xsun for display $DISPLAY_NUMBER ..."
/usr/bin/pkill -x -u $RUN_AS_UID "(Xsun)"
;;
'status')
# use /usr/ucb/ps to see the entire command line
/usr/ucb/ps axwwwwww | egrep "Xsun|^ *PID" | grep -v grep
;;
*)
echo "Usage: $0 { start | stop | status}"
exit 1
;;
esac
exit 0 |
|