免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2098 | 回复: 1
打印 上一主题 下一主题

在solaris7,8,9环境中配置java图形平台 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-01-08 20:28 |只看该作者 |倒序浏览
[这个贴子最后由无人喝彩在 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 ] &#59; 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 ]&#59; then
    X_OPTIONS="$NULL_IO_DRIVERS $X_OPTIONS"
elif [ $SOLARIS_VERSION -ge 9 ]&#59; then
    X_OPTIONS="$NO_TCP $X_OPTIONS"
fi

case "$1" in
'start')
    # only real devices need this section
    if [ -f $DISPLAY_DEVICE ] &#59; 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 &amp;
EOF
    &#59;&#59;

'stop')
    echo &quot;Stopping Xsun for display $DISPLAY_NUMBER ...&quot;
    /usr/bin/pkill -x -u $RUN_AS_UID &quot;(Xsun)&quot;
    &#59;&#59;
'status')
    # use /usr/ucb/ps to see the entire command line
    /usr/ucb/ps axwwwwww | egrep &quot;Xsun|^  *PID&quot; | grep -v grep
    &#59;&#59;
*)
    echo &quot;Usage: $0 { start | stop | status}&quot;
    exit 1
    &#59;&#59;
esac
exit 0

论坛徽章:
0
2 [报告]
发表于 2003-01-08 20:37 |只看该作者

在solaris7,8,9环境中配置java图形平台

安全问题
一些会影响到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&amp;reg&#59; 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=&quot;/dev/fb&quot;
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 &amp;

你可以使用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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP