就我而言,Java应用程序是JDownloader.我准备了chroot环境,如下所述:
http://www.0x61.com/forum/post5240333.html#p5240333
和这里:
http://interreality.org/~reed/java-chroot.html
和这里:
http://www.elstel.com/openroot/
所以,我安装了java,添加了组和用户,复制了JDownload文件,但是当我尝试运行它时(作为chroot下的普通用户;我以root身份运行chroot,但是一旦我在chroot中,我切换到chroot普通用户) :
java -Xmx512m -jar JDownloader.jar
我得到了一些积极的信息,比如JDownloader加载皮肤
10 4/6/11 2:15:17 PM – FINER [jd.JDClassLoader()] -> Look and Feel JAR loaded: /mnt/jd/libs/laf/syntheticaSilverMoon.jar
但这就是故事的结尾 – 应用程序没有显示出来.无论我是使用chroot来运行chroot环境还是openroot,结果都是一样的.
当我将chownload作为chroot-root运行时,我得到了更多输出,但最后发生异常:
10 4/6/11 2:39:23 PM – FINER [jd.config.DatabaseConnector()] -> Loading database
10 4/6/11 2:39:23 PM – FINER [jd.config.DatabaseConnector(checkDatabaseHeader)] -> Checking database
10 4/6/11 2:39:23 PM – INFO [jd.Main(main)] -> init Splash
———————— Thread: 11 ———————–
11 4/6/11 2:39:25 PM – INFO [jd.gui.swing.laf.LookAndFeelController(setUIManager)] -> Use Look & Feel: de.javasoft.plaf.synthetica.SyntheticaSimple2DLookAndFeel
11 4/6/11 2:39:25 PM – SEVERE [jd.controlling.JDLogger(exception)] -> SEVERE Exception occurred java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
我在chroot和普通系统中安装了相同的Jave,我可以在正常系统中运行相同的JDownloader,这里没有问题.
问题 – 我在这里缺少什么?如何运行GUI Java app?
先感谢您.
解决方法:
如果您尝试将任何chrooted应用程序显示在X11中,则需要正确设置一些内容.一个是有效的DISPLAY环境变量,第二个是正确的Xauthority文件,第三个也是最重要的是访问X11 / Xorg使用的套接字. X11可以使用TCP网络套接字或Unix域套接字.从chroot可以更容易地使用TCP套接字,但是大多数现代桌面都使用-nolisten tcp或X服务器上类似设置的TCP关闭TCP. TCP套接字从TCP端口6000开始显示:最后一次显示为0到6063.只要TCP套接字正在侦听,您就不需要再使用套接字执行任何操作.您仍然需要担心DISPLAY和Xauthority. Unix域套接字需要更多的工作,至少在Linux上,它位于/tmp/.X11-unix/X下?哪里?是一个从0到63的数字.如果您的chroot与/ tmp位于同一文件系统上,那么您可以使用硬链接,至少在Linux上.符号链接不会留下chroot.替换?使用正确的显示编号:
mkdir /path/to/chroot/tmp
chmod 1777 /path/to/chroot/tmp
mkdir /path/to/chroot/tmp/.X11-unix
chmod 1777 /path/to/chroot/tmp/.X11-unix
ln -f /tmp/.X11-unix/X? /path/to/chroot/tmp/.X11-unix/X?
mkdir和chmod只需要完成一次,但是需要在每个X会话上使用ln重新创建套接字文件.如果/ tmp不在同一个文件系统上,那么生活就更难了,你需要某种hackery,例如使/tmp/.X11-unix成为chroot下相应目录的符号链接.接下来,确保设置了DISPLAY环境变量,并匹配终端和其他X11应用程序使用的内容.最后,要复制.Xauthority,请使用xauth.您需要为X11会话找到匹配的cookie,并且每个会话的cookie都不同.使用xauth list $DISPLAY打印出DISPLAY的cookie.该名称看起来像主机:?或主机/ unix:?哪个主机是计算机的主机名?是显示号码.可以使用echo $DISPLAY检索显示编号,它将是冒号(:)之后和任何句点之前的数字(.)要复制Xauthority,请使用以下内容:
xauth extract /path/to/chroot/.Xauthority host/unix:1
xauth -f /path/to/chroot/.Xauthority list
第二个命令简单列出复制的条目.如果您需要在使用sudo或其他命令更改用户时进行复制,请尝试以下操作:
xauth extract - host/unix:1 | sudo xauth -f /path/to/chroot/.Xauthority merge -
如果放置.Xauthority文件的位置不是chrooted用户的主目录,则必须设置XAUTHORITY环境变量:
export XAUTHORITY=/path/to/chroot/.Xauthority
您可能已经知道,在chroot下运行GUI应用程序并不常见.