X11

如何在 chroot 環境中執行 GUI Java 應用程序?

  • September 10, 2021

在我的例子中,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 應用程序?

如果您試圖讓任何 chrooted 應用程序顯示在 X11 中,則需要正確設置一些東西。第一個是有效的DISPLAY環境變數,第二個是正確的 Xauthority 文件,第三個也是最重要的,訪問 X11/Xorg 使用的套接字。X11 可以使用 TCP 網路套接字或 Unix 域套接字。從 chroot 使用 TCP 套接字會更容易,但是大多數現代桌面都關閉了 TCP,-nolisten tcp或者在 X 伺服器上設置了類似的設置。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為您的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文件的位置不是 chrooted 使用者的主目錄,則必須設置XAUTHORITY環境變數:

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

正如您可能知道的那樣,在 chroot 下執行 GUI 應用程序並不常見。

引用自:https://unix.stackexchange.com/questions/10743