在solaris7,8,9环境中配置java图形平台
发表于:2007-06-09来源:作者:点击数:
标签:
[这个贴子最后由无人喝彩在2003/01/0808:33pm编辑] 简介 这个文章是为了帮助sun的系统管理员和javaservlet的 开发 人员的。读者应该有X windows 系统的知识以及理解/etc/rc*.d和/etc/init.d下的shell脚本的能力。 设想一下这样的情节:你做了一个伟大的servl
[这个贴子最后由无人喝彩在 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
无人喝彩 回复于:2003-01-08 20:37:50
|
安全问题 一些会影响到X server的安全问题,包括: 程序的安全问题 访问显示设备 访问X server自己
一个简单的关于系统安全的规则是避免使用root用户来运行进程,并且要注意尽量不对程序使用setuid和setgid。上面给出的xsun.server和xvfb.server这两个脚本就可以通过配置变量RUN_AS_USER(在脚本中)来用非root的用户身份运行。Xvfb和Xsun这两个进程在默认情况下都不允许别的系统访问,并且它们只允许本地系统中运行X server的用户的进程访问。所以配置好xsun.server和svfb.server这两个文件是十分重要的,
RUN_AS_USER变量指出了运行serlets引擎的用户。在Solaris9中,你可以关闭访问X server的TCP端口,只允许在系统上的应用程序通过UNIX® domain sockets来访问。xsun.server脚本通过使用-nolisten tcp选项来实现这个功能。
控制对显示设备的访问也是提高安全性的一种方法。通常这是由Dtlogin和login进程(ttymon)来管理的。但我们现在将dtlogin禁止了,那么这个任务必须由xsun.server来完成。xsun.server通过改变显示设备的所有权来控制用户对servlets的运行。当一个用户登陆到系统控制台的时候,loging进程(ttymon)将把各种设备的所有权以及限制赋予用户。而现在因为是xsun.server控制着显示设备,所以要通过修改ttymon的配置文件/etc/logindevperm来去禁止对显示设备访问。
如何运行? 你要如何来运行你的java图形平台呢?下面几个问题的答案将有助于你配置你的系统。 是否你的应用要使用Java 3D,还是这个图形要用到硬件加速(OpenGL相关的库) 你的系统是否能使用J2SE 1.4或后面的版本? 你的服务是否能跑在solaris9或以后的系统上? 你的服务是否能跑在solaris8的系统上?
回答下面的问题,决定下一步的方向。 是否使用带有硬件加速的图形适配卡来处理图象?(是的话参照下面的 是否使用图象卡 问题) 如果不是,继续:你是否使用J2SE v1.4呢?(是的话参照 设置没有X server的无头运行的Java平台这一节) 如果不是,继续:你是否使用solaris9呢?(是的话参照 在solaris上设置Xvfb 这一节) 如果不是,继续:你是否使用图象卡呢? 你的机器上是不是有图象卡,或者你的机器上是不是有可以插卡的插槽? 有些服务器上无法安装图象卡 继续:你是否使用solaris8?(是的话参照 在没有键盘和鼠标的情况下设置Xsun 这一节) 如果不是,参照 在有键盘和鼠标的情况下设置Xsun 这一节。 如果以上都不满足,则参照 在solaris8以及更早的系统上设置Xvfb(不支持的)这一节。
一个使用Java 3D的应用需要系统的Xsun 服务运行在一个图形加速卡上。在solaris上的Java 3D需要一个兼容OpenGl的显卡,例如Sun XVR-500 或者 Sun XVR-1000。最好使用最新版本的OpenGL,因为它将提高很多性能。在写这篇文章的时候,在Sun's OpenGL Site(http://wwws.sun.com/software/graphics/OpenGL)上最新的版本是OpenGL 1.2.3
过程: 设置使Tomcat或别的servlet引擎可以使用X display变量 将DISPLAY这个环境变量设置成和xsun.server 或者xvfb.server脚本中DISPLAY_NUMBER参数一致
设置没有X server的无头运行的Java平台 这个工作只适用于J2SE v1.4以及以后的版本。在java后面加上-Djava.awt.headless=true选项,例如: java -Djava.awt.headless=true 在Tomcat4.0环境中,把-Djava.awt.headless加到环境变量CATALINA_OPTS中。
在solaris上设置Xvfb 在你自己的目录下,保存一份xvfb.server和install.xvfb脚本的拷贝。当你调试好xvfb.server后,运行install.xvfb
xvfb.server预定是装在/etc/init.d下。它将使用一个非root 的用户来运行(默认为tomcat的用户)。X display将是:1,默认情况下你可以根据你系统的需要更改用户和显示变量。下面是一段需要更改的部分: # CONFIGURE THESE OPTIONS FOR YOUR INSTALLATION # change this to avoid conflict with existing X servers DISPLAY_NUMBER=:1
忽略这些行: # NOTE: Solaris 8 and earlier: set the directory # for the user-supplied copy of Xvfb XVFB_DIR=/usr/X11R6/bin
更改为你系统上运行servlet引擎的用户: # 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=tomcatds # END CONFIGURATION
当你更改完后,你可以测试一下你的Xvfb服务。使用root用户: # ./xvfb.server start Starting Xvfb as tomcat user for display :1
你可以看到它在运行: # ./xvfb.server status PID TT S TIME COMMAND 15467 ? S 0:02 /usr/openwin/bin/Xvfb :1 -screen 0 1280x1024x8 -fbdir /tmp
现在停止它: # ./xvfb.server stop Stopping Xvfb for display :1 ...
当你确定这个服务运行正常,你可以使用install.xvfb。它将把xvfb.server拷到/etc/init.d下,并建立一个连接到/etc/rc*.d目录下。 /bin/ln -s /etc/init.d/xvfb.server /etc/rc0.d/K09xvfb.server /bin/ln -s /etc/init.d/xvfb.server /etc/rc1.d/K09xvfb.server /bin/ln -s /etc/init.d/xvfb.server /etc/rcS.d/K09xvfb.server
/bin/ln -s /etc/init.d/xvfb.server /etc/rc2.d/S98xvfb.server
现在,你可以通过/etc/init.d/xvfb.server来启动和停止你的服务了,或者如果可以,你也可以重新启动机器,来观看在启动后Xvfb将自动运行起来。
在没有键盘和鼠标的情况下设置Xsun 在服务器上安装显示卡。如果要使用java 3D则要使用Sun XVR-500 或 Sun XVR-1000等显卡(见前面)。安装所需要的包,如最新的OpenGL。
因为没有键盘和鼠标,所以你不能使用这个显示器做你的控制台。设法从串口或者网口上登陆到系统。使用telnet或其他文字终端程序来操作。
把下面两个脚本拷贝到服务器上一个临时的空间 xsun.server install.xsun
更改xsun.server中下面这部分内容,使它和你的系统一致。默认是使用tomcat用户来运行。 # CONFIGURE THESE OPTIONS FOR YOUR INSTALLATION # allow another device to be specified, e.g. /dev/fb1 DISPLAY_DEVICE="/dev/fb" DISPLAY_NUMBER=:2 RUN_AS_USER=tomcat # END CONFIGURATION
使用root身份登陆,运行install.xsun脚本。它建立一个连接,并停止掉dtlogin进程。脚本内容如下: /bin/cp xsun.server /etc/init.d /bin/chmod 0544 /etc/init.d/xsun.server
# create links for the various run levels /bin/ln -s /etc/init.d/xsun.server /etc/rc1.d/K09xsun.server /bin/ln -s /etc/init.d/xsun.server /etc/rc0.d/K09xsun.server /bin/ln -s /etc/init.d/xsun.server /etc/rcS.d/K09xsun.server
/bin/ln -s /etc/init.d/xsun.server /etc/rc2.d/S99xsun.server
# terminate DtLogin /etc/init.d/dtlogin stop
# prevent DtLogin startup /bin/mv /etc/rc2.d/S99dtlogin /etc/rc2.d/.S99dtlogin
现在可以运行xsun.server来启动xsun服务,当你确定服务运行正常后,重新启动系统,并确定Xsun在启动后运行正常。 现在你可以以root用户的身份来检测一下: # cd /etc/init.d # ./xsun.server start Starting Xsun as tomcat user for display :2
你可以看到: # ./xsun.server status PID TT S TIME COMMAND 19665 ? S 0:03 /usr/openwin/bin/Xsun :2 -clients 1024 -nobanner -dev $DISPLAY_DEVICE defdepth 24 +nmouse +nkeyboard -nolisten tcp
停止: # ./xsun.server stop Stopping Xsun for display :1 ..
在有键盘和鼠标的情况下设置Xsun 连接上键盘和鼠标,登陆到系统中,剩下的配置方法和上节一样。
在solaris8以及更早的系统上设置Xvfb(不支持的) 如果你使用google搜索,你会找到很多已经编译好的Xvfb程序。你也可以得到源代码自己编译。我不赞成使用那些预先编译好的Xvfb--确定你要遵守你的网站关于下载和使用软件包的规定。你最好下载一个X 资源并且自己来编译Xvfb。
如果你下载并安装了一个Xvfb,你最好将它放在/usr/local/bin或者/usr/X11R6/bin目录下。
xvfb.server脚本将把setuid权限设置给该程序。
把xvfb的脚本从这个文章中拷贝出来,并放到一个临时的目录中,记的把X_DIR参数改为你放置Xvfb命令的路径: # CONFIGURE THESE OPTIONS FOR YOUR INSTALLATION DISPLAY_NUMBER=:1
X_DIR=/usr/X11R6/bin # pre-Solaris 9: wherever Xvfb lives
RUN_AS_USER=tomcat # END CONFIGURATION
现在,你可以遵照上面介绍的在solaris9下的配置Xvfb的方法来进行了。
测试: 当X server运行正常,你可以使用你的servlets应用来确定Java 图形平台工作正常。如果你有麻烦,请检查X server是否出现问题。使用刚才你选用的用户的身份登陆(默认是tomcat),使用下面的-display参数来检查: % /usr/openwin/bin/xclock -display :2 &
你可以使用xwd(一个X windows dump)来抓图。在solaris9下,我发现/usr/openwin/bin/xwd有问题(可以参考Sun bug id 4766571)所以我使用一个从X11 下拷贝到/usr/X11R6/bin下的xwd命令。 % /usr/X11R6/bin/xwd -display :2 -root -out /tmp/xclock.xwd
并将输出的图片拷贝到别的系统上,使用xwud来观看。 % /usr/openwin/bin/xwud -in /tmp/xclock.xwd 如果xclock没有运行,那么你服务器上的服务可能没有起来。检查你的xsun.server和svfb.server是不是配置的没有问题。
其他的资料以及将来的工作 一个支持多实例的servlet引擎可以让你在一个服务器上支持更多的客户端。这个可以根据java 2的运行环境来具体调整。你可以在一个系统上运行多个X server,并且使用不同的Display环境变量来区分多个单独的实例。如何配置/etc/init.d和/etc/rc*.d就留给读者自己去考虑了。
在写这个文章的时候,solaris9下的Xvfb还不能支持24位色。如果你需要支持24位色,那么你可以使用X11 提供的Xvfb。在未来的升级中,Solaris9将支持一个特出的伪设备--vfb。这个伪设备将允许Xsun提供和Xvfb现在提供的同样的功能。如果这个实现了,上面的xsun.server脚本也仍然可以使用。
参考文档和附录 略
作者介绍 Tom Gould是sun Market Development Engineering group的工程师
原文 http://soldc.sun.com/articles/solaris_graphics.html
|
原文转自:http://www.ltesting.net