데비안에서 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는 실제로 내 자바 명령입니다.

$ 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출력을 실행 하고 게시하십시오.
Gilles '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 에서 라이브러리를 찾습니다 . 여기의 경로는 $ORIGIN/../lib/i386/jli:$ORIGIN/../jre/lib/i386/jli입니다. 일반적으로 $ORIGIN여기에서 실행 파일의 위치로 바꿔야합니다 /usr/lib/jvm/java-6-openjdk/jre/bin.

여기서는 $ORIGIN교체되지 않습니다. 추가 권한 (setuid, setgid 또는 setpcap)으로 실행되는 실행 파일에서는이 기능이 해제되어 있습니다. 그렇지 않으면 다른 라이브러리를 삽입 할 수 있고 높은 권한으로 임의 코드를 실행할 수 있습니다. ( 자세한 설명 은 이 기사 를 참조하십시오 .) 보안 문제는 비교적 최근에 발견되었습니다. 데비안에서이 수정되었습니다 DSA-2122-1 당신이 업그레이드 그렇게하기 전에, libc6-2.7-18lenny6당신의, java실행 파일이 아마 일 것이다.

이 증상은 java추가 권한으로 실행되고 있음을 나타냅니다 . 일반적인 데비안 설치에서는 그렇지 않습니다. 그 확인 /usr/lib/jvm/java-6-openjdk/jre/bin/java모드 755이며, 어떤 기능이 없습니다 ( getcap /usr/lib/jvm/java-6-openjdk/jre/bin/java그리고 setcap -r …어떤 경우 기능을 제거하기 위해).


(원본 대답 java은 루트로 작동하지만 다른 사용자로 는 작동하지 않으며 다른 바이너리를 호출하는 경우 유용합니다 .)

내 내기는 java이전에 다른 버전 이 있다는 것입니다 PATH(을 sudo변경하십시오 PATH). 내용을 확인하십시오 . 보고서 type java와 다른 Java 버전 일 수 있습니다.ldd /path/to/bin/javalibjli.so => not found

그리고이 Java 버전을 찾을 수없는 이유 libjli.so는 설치 방법과 일치하지 않는 rpath (실행 파일에 저장된 라이브러리 검색 경로)를 통해 찾고 있기 때문입니다. 에 java바이너리 /some/where/bin/java가 있고 상대 경로 (Sun JDK 및 OpenJDK의 방식)가있는 경우 라이브러리가 있어야합니다 /some/where/lib/i386/jli/libjli.so(i386 아키텍처 가정). rpath가 절대적이면 libjli.so정확한 위치를 지정하거나 LD_LIBRARY_PATHwhere를 포함하도록 설정 해야합니다 libjli.so.


나는 원래 게시물 업데이트 type java
-ldd

루트 PATH 및를 설정하려고 시도했지만 export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib/i386/jli/동일한 오류가 발생했습니다.
aetaur

좋아, 내기를 잃었다. 자바 실행 파일에 추가 권한이있는 것 같습니다.
Gilles '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 + ephttp://bugs.java.com/view_bug.do?bug_id=7157699 와 함께 작동시키는 방법

이 질문에 대해 자세히 대답합니다.

추신. 우리 프로젝트에서 우리는

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

Java 바이너리가 1024 미만의 tcp / udp 포트를 열 수있게합니다. 위의 "bug"위의 7157699는 libjli.so가 /etc/ld.so.conf.d 경로의 conf 파일에있는 디렉토리를 추가하여 빠른 솔루션을 제공합니다. 라이브러리를 다시 캐시하기 위해 ldconfig 호출 리눅스를 가정.


0

해당 파일에 대한 권한을 확인하십시오. 그들은 다음과 같아야 0644/-rw-r--r--합니다. 그렇지 않은 경우 openjdk-6-jre-headless누군가 권한을 엉망으로 만들었 기 때문에를 다시 설치 하십시오.


1
lddlibjli.so => not found읽을 수 없다면보고 할 것입니다 .so(적어도 GLibc 2.11에서 일어난 일입니다).
Gilles 'SO- 악마 그만해'

0

Tshepang의 답변과 비슷하게 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

그래서 해결책은 자바를 제거하고 /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

나는 같은 오류가 있었다.

이를 해결하는 가장 간단한 방법은 모든 jdk 및 jres와 실행 가능한 / usr / bin / java를 제거하는 것입니다.

그런 다음 jdk를 다시 설치하십시오.

그것은 나를 위해 문제를 해결했습니다. 다른 방법은 그렇지 않았습니다.


0

시스템 서비스에서 Java 응용 프로그램을 시작하려고 시도하고 libjli.so라이브러리 와 관련된 동일한 오류가 발생하는 사람은 계속 읽으십시오.

현재 Fedora에 대한 공개 버그가 있습니다 :

버그 1358476 – SELinux에서 시스템이 Java 기반 서비스를 실행하지 못하도록 방지

그 결과 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

@ G-Man / bin / sh로 사용해 보셨습니까? 나는 그것이 또한 효과가있을 것이라고 생각할 것이지만 시도해야 할 것입니다. 사용 방법을 업데이트하십시오. 감사합니다
편한
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.