如何在 chroot 環境中執行 GUI Java 應用程序?
在我的例子中,Java 應用程序是 JDownloader。我準備了 chroot 環境,如下所述:
http://www.0x61.com/forum/post5240333.html#p5240333(斷開的連結)- 在 Linux 的 chroot 中執行 java 時出錯,並且
- xchroot(在 estel.org)
所以,我安裝了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 應用程序並不常見。