chroot環境でGUI Javaアプリケーションを実行するには?

chroot環境でGUI Javaアプリケーションを実行するには?

私の場合、JavaアプリケーションはJDownloaderです。 chroot環境は次のように準備しました。

だから私はJavaをインストールし、グループとユーザーを追加し、JDownloadファイルをコピーしましたが、それを実行しようとすると(chrootから通常のユーザーとしてchrootをrootとして実行しますが、一度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を実行しても、結果は同じです。

JDownloadをchroot-rootとして実行すると、より多くの出力が得られますが、最終的に例外が発生します。

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

ルート変更されたアプリケーションをX11に表示するには、いくつかの点を正しく設定する必要があります。 1つ目は有効なDISPLAY環境変数、2つ目は正しいXauthorityファイル、3つ目で最も重要なのは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セッションで再作成する必要があります。同じファイルシステムではない場合、生活はより困難になり、chrootの下の対応するディレクトリへのシンボリックリンクを/tmp作成するなど、ある種のハッキング技術が必要です。次に、環境変数が設定されており、端末や他のX11アプリケーションで使用されている変数と一致していることを/tmp/.X11-unix確認してください。DISPLAY最後にコピーするには、.XauthorityX11xauthセッションに一致するCookieを見つける必要があり、そのCookieはセッションごとに異なります。xauth list $DISPLAYクッキーを印刷するために使用されますDISPLAY。名前は次のとおりですhost:?host/unix:?ここで、ホストはコンピュータのホスト名、?はディスプレイ番号です。表示番号は、次のコマンドで検索できますecho $DISPLAY。これは、コロン(:)の後とピリオド(.)の前の数字です。 Xauthorityをコピーするには、次のように使用します。

xauth extract /path/to/chroot/.Xauthority host/unix:1
xauth -f /path/to/chroot/.Xauthority list

2番目のコマンドは、単にコピーされたエントリを一覧表示します。 sudo または他のコマンドを使用してユーザーを変更するときにコピーする必要がある場合は、以下を試してください。

xauth extract - host/unix:1 | sudo xauth -f /path/to/chroot/.Xauthority merge -

ファイルを保存する場所が.Xauthoritychrootユーザーのホームディレクトリではない場合は、XAUTHORITY環境変数を設定する必要があります。

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

ご存知のように、chrootでGUIアプリケーションを実行することは一般的ではありません。

おすすめ記事