it-mure.jp.net

Debianでの起動の問題Java: "共有ライブラリのロード中にエラーが発生しました:libjli.so"

Javaを起動しようとしています:

$ Java -version
Java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

$ ldd /usr/lib/jvm/Java-6-openjdk/jre/bin/Java
        linux-gate.so.1 =>  (0xb779f000)
        libz.so.1 => /usr/lib/libz.so.1 (0xb7780000)
        libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7767000)
        libjli.so => /usr/lib/jvm/Java-6-openjdk/jre/bin/../lib/i386/jli/libjli.so (0xb7762000)
        libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb775e000)
        libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7603000)
        /lib/ld-linux.so.2 (0xb77a0000
$ ls /usr/lib/jvm/Java-6-openjdk/jre/bin/../lib/i386/jli/
libjli.so

ただし、Javaはrootの下で機能します:

$ Sudo Java -version
Java version "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8.7) (6b18-1.8.7-2~lenny1)
OpenJDK Client VM (build 14.0-b16, mixed mode, sharing)

エラーなしで通常のユーザーとしてJavaを起動するにはどうすればよいですか?

2
aetaur

これは非常に古い質問ですが、同じ問題が発生したため、次のリンクが役立つと思います。

https://unix.stackexchange.com/questions/87978/how-to-get-Oracle-Java-7-to-work-with-setcap-cap-net-bind-serviceep

Java実行可能ファイルにposix機能を付与すると、問題が発生する可能性があります。その場合、実行Java asの場合、ld.soはlibjli.soのリンクを拒否しますroot以外のユーザー。詳細な原因と解決策は上記のリンクにありますが、簡単に言うと、rootとして次のコマンド行を実行すると問題が解決するはずです。

echo /opt/Java/jdk1.7.0_71/lib/AMD64/jli >> /etc/ld.so.conf.d/Java.conf
rm /etc/ld.so.cache
ldconfig -v|grep jli

/opt/Java/jdk1.7.0_71を実際のJavaホームパスに置き換え、32ビットマシンを使用している場合は/ lib/i386/jliを使用することを忘れないでください。最後のコマンドが次のようなものを返す場合

libjli.so -> libjli.so

、あなたは行ってもいいはずです。 ld.soキャッシュが正しく更新されない場合は、場合によってはマシンを再起動する必要があります。

1
Haochen Xie

おそらく、Ubuntuから昇格されたprivsのない単一のインスタンスを持っていますが、それでもlib このレポートのように を見つけることができません。

試してみてください

ln -s /usr/lib/jvm /lib
1
Cheako

リンクの構成方法に注意してください。間違いが発生し、/ etc/bin/Javaがバイナリに置き換えられたサーバーを見つけました。そのため、ライブラリが見つかりませんというエラーが表示されました。/usr/bin/Javaを/ etc/Alternatives/Javaに再リンクすると、すべてが再び機能します。

# namei -mx /usr/bin/Java
f: /usr/bin/Java
 drwxr-xr-x /
 drwxr-xr-x usr
 drwxr-xr-x bin
 lrwxrwxrwx Java -> /etc/alternatives/Java
   drwxr-xr-x /
   drwxr-xr-x etc
   drwxr-xr-x alternatives
   lrwxrwxrwx Java -> /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/Java
     drwxr-xr-x /
     drwxr-xr-x usr
     drwxr-xr-x lib
     drwxr-xr-x jvm
     lrwxrwxrwx jre-1.6.0-openjdk.x86_64 -> Java-1.6.0-openjdk-1.6.0.0.x86_64/jre
       drwxr-xr-x Java-1.6.0-openjdk-1.6.0.0.x86_64
       drwxr-xr-x jre
     drwxr-xr-x bin
     -rwxr-xr-x Java

私の勘は、OpenJDKがライブラリを探すときに何らかのパスの正規化を行うということです。

1
kerolasa

その問題は、chroot-jailでJavaを実行したときに発生しました。

Chrootからchrpathをチェックアウトすると、次のように表示されます。

chrpath /opt/test/demo/opt/test/jdk/bin/Java
/opt/test/demo/opt/test/jdk/bin/Java: RPATH=$Origin/../lib/AMD64/jli:$Origin/../jre/lib/AMD64/jli

セキュリティのためのELFが$ Originを評価しないwitchは環境変数ではないため、Javaを実行する前にいくつかの環境変数を設定する必要があります。

export Java_HOME=/opt/test/jdk
export LD_LIBRARY_PATH=$Java_HOME/lib/AMD64/jli:$Java_HOME/jre/lib/AMD64/jli

または

LD_Origin_PATH=/opt/test/jdk/bin /opt/test/jdk/bin/Java
1
etreus