如何在 chroot 环境中运行 GUI Java 应用程序?

如何在 chroot 环境中运行 GUI Java 应用程序?

就我而言,Java 应用程序是 JDownloader。我准备了 chroot 环境,如下所述:

所以,我安装了java,添加了组和用户,复制了JDownload文件,但是当我尝试运行它时(作为chroot下的普通用户;我以root身份运行chroot,但是一旦进入chroot,我就会切换到chroot普通用户) :

java -Xmx512m -jar JDownloader.jar

我收到一些积极的消息,例如通过 JDownloader 加载皮肤

10 4/6/11 2:15:17 PM - FINER [jd.JDClassLoader(<init>)] -> Look and Feel JAR loaded: /mnt/jd/libs/laf/syntheticaSilverMoon.jar

但故事就这样结束了——应用程序没有出现。无论我使用 chroot 运行 chroot 环境还是 openroot,结果都是一样的。

当我以 chroot-root 身份运行 JDownload 时,我得到了更多的输出,但最后出现了异常:

10 4/6/11 2:39:23 PM - FINER [jd.config.DatabaseConnector(<init>)] -> 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和普通系统中安装了相同的Java,并且我可以在普通系统中运行相同的JDownloader;这里没有问题。

我在这里缺少什么?如何运行 GUI Java 应用程序?

答案1

如果您尝试让任何 chroot 的应用程序显示在 X11 中,您将需要正确设置一些内容。一是有效的DISPLAY环境变量,二是正确的 Xauthority 文件,三是也是最重要的,对 X11/Xorg 使用的套接字的访问。 X11 可以使用 TCP 网络套接字或 Unix 域套接字。从 chroot 中使用 TCP 套接字会更容易,但大多数现代桌面都通过-nolisten tcpX 服务器上的类似设置关闭了 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完成一次,但需要ln在每个 X 会话上重新创建套接字文件。如果/tmp不在同一个文件系统上,生活会更困难,您将需要某种黑客技术,例如建立/tmp/.X11-unix到 chroot 下相应目录的符号链接。接下来,确保DISPLAY环境变量已设置并与您的终端和其他 X11 应用程序使用的变量相匹配。最后,要复制.Xauthority,请使用xauth.您需要为您的 X11 会话找到匹配的 cookie,并且该 cookie 对于每个会话都是不同的。用于xauth list $DISPLAY打印您的 cookie DISPLAY。该名称将类似于host:?host/unix:?其中 host 是计算机的主机名,而 ?是显示编号。可以使用以下命令检索显示编号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不是 chroot 用户的主目录,则必须设置XAUTHORITY环境变量:

export XAUTHORITY=/path/to/chroot/.Xauthority

正如您可能知道的那样,在 chroot 下运行 GUI 应用程序并不常见。

答案2

确保环境变量XAUTHORITY已设置(通常为~/.Xauthority)。然后,在主持人:

$ xauth list
latitude/unix:0  MIT-MAGIC-COOKIE-1  d4474d13c

现在,在chroot 环境:

# chroot some-debian
# xauth add latitude/unix:0 MIT-MAGIC-COOKIE-1 d4474d13c
# xcalc

答案3

我认为您不需要专门为 Java 应用程序做任何事情,但您确实必须为一般的 GUI 应用程序做一些事情。

我已经在家用计算机上完成了此操作,但我现在不在家,所以请耐心等待。我有一个脚本,可以将所有内容安装到我的 chroot 中,例如/dev/proc,但它也会复制~/.X*。如果我没记错的话,在您的主文件夹中存在以 开头的文件.Xauth,并将这些文件复制到 chroot 环境的主文件夹中。根据我的经验,每次重新启动 X 时都需要复制这些文件。

为了测试这个方法,我要做的就是运行一个简单的 X 应用程序,例如xterm.这只是一个我可以测试的快速而简单的应用程序。 xterm如果无法连接到 X 服务器,应该会向您显示错误消息。

我碰巧将完整的 X11 软件包安装到我的 chroot 中,但我对 X 的了解不够,无法知道 chroot 的应用程序是在 chroot 的 X 服务器上还是在主机 X 服务器上运行。

相关内容