
私の場合、JavaアプリケーションはJDownloaderです。 chroot環境は次のように準備しました。
http://www.0x61.com/forum/post5240333.html#p5240333(壊れたリンク)- Linuxのchrootでjavaを実行中にエラーが発生しました。と
- ルートディレクトリ(estel.orgから)
だから私は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 tcp
Xサーバーの同様の設定で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
最後にコピーするには、.Xauthority
X11xauth
セッションに一致する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 -
ファイルを保存する場所が.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アプリケーションに対しては何をすべきかがあると思います。
家にいるパソコンにしてみましたが、今は家にいないので少しだけ我慢してください。/dev
と/proc
のようなすべてを私のchrootにインストールするスクリプトがありますが~/.X*
。私の記憶が正しい場合は、ホームフォルダにで始まるファイルがあり、.Xauth
このファイルをchroot環境のホームフォルダにコピーします。私の経験では、Xを再起動するたびにこれらのファイルをコピーする必要があります。
この方法をテストするには、単純なXアプリケーションを実行するだけですxterm
。たとえば、これはテストできる高速で簡単なアプリケーションです。 xterm
X サーバーに接続できない場合は、エラーメッセージが表示されます。
私のchrootには完全なX11パッケージがインストールされていますが、chrootされたアプリケーションがchrootのXサーバーまたはホストXサーバーで実行されているかどうかを知るのに十分なXについて知りません。