私は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
でリストされなかったのか知りたいのですが。どうやら既知の依存関係ですが、経路は不明ですか?どんな助けでもありがたいです!
/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の膝で再び学ぶことができます!
追加する必要があるようです
/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を使用して)、次に必要なパッケージをインストールすることで、長期的にはそれほど苦労しないでしょう。これにより、パッケージマネージャーは、依存関係の解決、必要なすべてのファイルのインストール、ポストインストールタスクの実行など、すべての作業を処理できます。