web-dev-qa-db-ja.com

Java JDKの依存関係リストにlibjli.soパスがない、Debian

私はchroot刑務所の作成をスクリプト化しています。その自動化の一部には、さまざまな実行可能ファイルとその依存関係を刑務所にコピーすることが含まれます。次のbash行を使用して、依存関係のリストからファイルパスを解析しています(Javaなど)。

$ ldd `which Java` | grep -o '/[^()]*'
/lib/x86_64-linux-gnu/libz.so.1
/lib/x86_64-linux-gnu/libpthread.so.0
/lib/x86_64-linux-gnu/libdl.so.2
/lib/x86_64-linux-gnu/libc.so.6
/lib64/ld-linux-x86-64.so.2

これはNode.jsとPythonに最適ですが、jail内からJavaを実行しようとすると、エラーが発生します。

Java:共有ライブラリの読み込み中にエラーが発生しました:libjli.so:共有オブジェクトファイルを開けません:そのようなファイルまたはディレクトリはありません

libjli.soパスが依存関係のリストから欠落していることがわかります...少なくともlddが示すもの(5行目):

$ ldd `which Java`
linux-vdso.so.1 =>  (0x00007ffff7f4d000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7ac3928000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7ac370c000)
libjli.so => not found
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7ac3507000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7ac317c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7ac3b48000)

ファイルを見つけました...

$ find /usr/lib -name libjli.so
/usr/lib/jvm/Java-6-openjdk-AMD64/lib/AMD64/jli/libjli.so
/usr/lib/jvm/Java-6-openjdk-AMD64/jre/lib/AMD64/jli/libjli.so

...しかし、なぜlddでリストされなかったのか知りたいのですが。どうやら既知の依存関係ですが、経路は不明ですか?どんな助けでもありがたいです!

8
Rip Leeb

/etc/ld.so.conf*やldconfigをいじることなく、そのまま使用できるはずです。簡単に実行できます。/procをchrootにマウントするだけです。これを行うには、実ルートfsの/ etc/fstabにある次の行を使用します。

/ proc/var/chroot/ia32/proc none bind

したがって、それを実際の/ procにバインドします。

https://github.com/cedric-vincent/PRoot/issues/9 ごとに、ld-linux.so(多分そうだと思います)は、objdump -pのRPATHエントリに代入する$ Originを決定します。/proc/self/exeを見てください。

私はこれに何回噛まれて、それを再発見しなければなりませんでしたか?ああ、力強く賢明なGoogleよ、次回は私をここに迅速に連れて行ってください。そうすれば、future-meは過去のmeの膝で再び学ぶことができます!

7
Martin Dorey

追加する必要があるようです

/usr/lib/jvm/Java-6-openjdk-AMD64/jre/lib/AMD64/jli

/etc/ld.so.conf、または/etc/ld.so.conf.d内の新しいファイルの可能性が高いです。次に、ldconfigを実行してキャッシュを更新し、lddがライブラリを見つけられるようにします。

Chrootのスクリプティングについては、パッケージベースのアプローチをとることで、基本的なインストールを最初に作成し(たとえば、Debianベースのホストでdebootstrapを使用して)、次に必要なパッケージをインストールすることで、長期的にはそれほど苦労しないでしょう。これにより、パッケージマネージャーは、依存関係の解決、必要なすべてのファイルのインストール、ポストインストールタスクの実行など、すべての作業を処理できます。

3
Andrew Schulman