DebianでJavaを起動する際の問題:「共有ライブラリの読み込み中のエラー:libjli.so」


16

私は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はルートの下で動作します。

$ 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)

UPD:

/ usr / lib / jvm / java-6-openjdk / jre / bin / javaは実際には私のjavaコマンドです:

$ type java
java is hashed (/usr/bin/java)
$ ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22 Jul 14 10:15 /usr/bin/java -> /etc/alternatives/java
$ ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 40 Jul 14 10:36 /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java

UPD2:

また、ルートPATHを設定しようとしました:

$ sudo su
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# exit
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ java -version
java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

UPD3:

私が試した:

# comm -3 <(declare | sort) <(declare -f | sort)

ルートの下。しかし、Javaに使用できる環境変数はありません。

UPD4:

strace -f java -version結果:http : //dumpz.org/67368/


strace -f java -version出力を実行して投稿してください。
ジル 'SO-悪であるのをやめる'

これは、straceの結果である:dumpz.org/67368
aetaur

回答:


12
open("$ORIGIN/../lib/i386/jli/tls/i686/sse2/cmov/libz.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)

実行中の実行可能ファイルは、通常のライブラリ検索パスに加えて、rpathでライブラリを検索します。ここでのrpathは$ORIGIN/../lib/i386/jli:$ORIGIN/../jre/lib/i386/jliです。通常$ORIGIN、ここで実行可能ファイルの場所に置き換える必要があります/usr/lib/jvm/java-6-openjdk/jre/bin

ここで$ORIGINは、置き換えられていません。この機能は、追加の特権(setuid、setgid、またはsetpcap)で実行されている実行可能ファイルではオフになります。(詳細な説明については、この記事を参照してください。)セキュリティの問題は比較的最近発見されました。DebianではDSA-2122-1で修正されたためlibc6-2.7-18lenny6、にアップグレードする前に、java実行可能ファイルが機能していたと思われます。

この症状は、java追加の特権で実行されていることを示しています。これは、通常のDebianインストールでは当てはまりません。/usr/lib/jvm/java-6-openjdk/jre/bin/javaモード755であり、機能がないことを確認します(getcap /usr/lib/jvm/java-6-openjdk/jre/bin/java、およびsetcap -r …機能がある場合は削除します)。


(元の答え。これはjavarootとしては機能するが他のユーザーとしては機能せず、異なるバイナリを呼び出していることが判明した場合に役立ちます。)

私の賭けは、あなたが他のいくつかを持っているということです java以前にバージョンPATHsudo変更しますPATH)。何をtype java言っているのかを確認してください。おそらく、ldd /path/to/bin/javaレポート対象の異なるJavaバージョンですlibjli.so => not found

そして、このJavaバージョンが見つからない理由libjli.soは、インストールされている方法と一致しないrpath(実行可能ファイルに格納されているライブラリ検索パス)を介してそれを探しているからだと推測します。にjavaバイナリ/some/where/bin/javaがあり、相対rpath(Sun JDKおよびOpenJDKの方法)がある場合、ライブラリは/some/where/lib/i386/jli/libjli.so(i386アーキテクチャを前提とする)にある必要があります。rpathが絶対の場合、次のいずれかを配置する必要がありますlibjli.so正確に指定された場所に配置、場所LD_LIBRARY_PATHを含めるように設定する必要がありlibjli.soます。


私はもともと更新されていますtype java
-ldd

ルートPATHおよびを設定しようとしましexport LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib/i386/jli/たが、同じエラーが発生しました。
-aetaur

OK、賭け金を失いました。java実行可能ファイルには追加の特権があるようですが、これは奇妙です。
ジル 'SO-悪であるのをやめる'

4

java.comから「1.7.0_60」を.tar.gzフォーマットでダウンロードし、にインストールしました/usr/local/jre1.7.0_60。その後、ハードリンクを作成し、/usr/local/bin/java上記のエラーを受け取りました。

ハードリンクをシンボリックリンクに変更すると、問題が修正されました。

短縮版:

$ sudo ln /usr/local/jre1.7.0_60/bin/java /usr/local/bin/java

悪い。

$ sudo ln -s /usr/local/jre1.7.0_60/bin/java /usr/local/bin/java

いいね。


2

と同じパス内でjava実行可能ファイルを見つけて、libjli.soそれを使用してみてください。

たとえば、で見つけlibjli.so/usr/lib/jvm/java-7-oracle/jre/lib/amd64/jli/libjli.soので、

find /usr/lib/jvm/java-7-oracle/ -name "java"

で実行可能ファイルを見つけました/usr/lib/jvm/java-7-oracle/bin/java。次に、実行可能ファイルjavaから削除し/usr/bin、上記の実行可能ファイルにシンボリックリンクしました/usr/bin


2

バグがJava実行可能ファイルでsetcapを使用していることが原因である場合は、

Oracle Java 7をsetcap cap_net_bind_service + ep および http://bugs.java.com/view_bug.do?bug_id=7157699で動作させる方法

この質問に詳細に答えます。

追伸 私たちのプロジェクトでは

sudo setcap cap_net_bind_service=+ep /path/to/java

javaバイナリが1024未満のtcp / udpポートを開くことができるようにするldconfigを呼び出してライブラリを再キャッシュします。Linuxを想定しています。


0

そのファイルの権限を確認してください。それらは次のようになり0644/-rw-r--r--ます。そうでない場合は、openjdk-6-jre-headless誰かが許可を台無しにしたことを意味するため、再インストールします。


1
lddlibjli.so => not found読めなかった場合に報告します.so(少なくともGLibc 2.11で起こることです)。
ジル 'SO-悪であるのをやめる'

0

シェパンの答えと同様に、私は強制しました libjli.soはライブラリの検索パスしました。

#/ usr / lib / jvm -name \ libjli.soを見つけます
/usr/lib/jvm/java-6-sun-1.6.0.45/jre/lib/amd64/jli/libjli.so

#export LD_LIBRARY_PATH = / usr / lib / jvm / java-6-sun / jre / lib / amd64 / jli:$ LD_LIBRARY_PATH


参考までに、私のビルド環境ではUbuntu 10.04 / 64-bitでgithub:flexiondotorg / oab-java6を使用しています。


0

何らかの奇妙な理由/usr/bin/javaで、Javaインストールを指していませんでした。これがどのように起こったのかわかりません。私はこれを実行して確認しました:

$ sudo update-alternatives --config java

それは私に次のことを与えました

There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java
Nothing to configure.
update-alternatives: warning: forcing reinstallation of alternative /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java because link group java is broken
update-alternatives: warning: not replacing /usr/bin/java with a link

そのため、解決策は、javaを削除し/usr/local/binて新しいシンボリックリンクを作成することでした。

$ sudo rm -rf /usr/bin/java
$ sudo ln -s /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java /usr/bin/java

0

同じエラーが発生しました。

それを解決する最も簡単な方法は、すべてのjdksとjresを削除するだけでなく、実行可能ファイル/ usr / bin / javaがある場合は削除することです。

そして、jdkを再インストールします。

それは私のために問題を解決しました。他の方法ではできませんでした。


0

systemdサービスからJavaアプリケーションを起動しようとして、libjli.soライブラリに関連する同じエラーが発生する場合は、先に進んでください。

現在、Fedoraにはこれに関する未解決のバグがあります。

バグ1358476 – systemdがJavaベースのサービスを実行できないようにするSELinux

その結果、SELinuxはそのライブラリへのアクセスを静かに制限します。AVC拒否メッセージはないため、コンテキストまたはポリシーの変更で修正することはできません。

/etc/ld.so.conf.d/あなたのlibjli.soファイルのフォルダを含むファイルを追加することが一つの回避策であることがわかりました:

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-5.b14.fc26.x86_64/jre/lib/amd64/jli/

そして、実行します

ldconfig

しかし、それはかなり厄介です...

より良いオプションは/bin/bash -c、サービスファイルでJavaプロセスを起動するために使用することです。

ExecStart=/bin/bash -c "/usr/bin/java -Xmx1024m -jar myApp.jar NONINTERACTIVE"

問題が修正されるまで....


する必要があり/bin/bashますか?使用するとどうなります/bin/shか?
G-Manは「Reinstate Monica」と言います

@ G-Man / bin / shで試しましたか?私もそれでうまくいくと思いますが、試してみる必要があります。あなたがそれをどう使うかで更新してください。ありがとう
快適な
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.