나는 chroot Jail 생성을 위한 스크립트를 작성 중이며 자동화의 일부에는 다양한 실행 파일과 해당 종속성을 감옥에 복사하는 작업이 포함됩니다. 다음 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에서는 훌륭하게 작동하지만 감옥 내에서 실행하려고 하면 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
. 분명히 이것은 알려진 종속성이지만 경로를 알 수 없습니까? 도움을 주시면 감사하겠습니다!
답변1
/etc/ld.so.conf* 또는 ldconfig를 망칠 필요 없이 즉시 작동해야 하며 매우 쉽게 수행됩니다. chroot에 /proc를 마운트하기만 하면 됩니다. 실제 루트 fs의 /etc/fstab에서 다음 줄을 사용하여 이 작업을 수행합니다.
/proc /var/chroot/ia32/proc 바인딩 없음
따라서 실제 /proc에 바인딩합니다.
모든https://github.com/cedric-vincent/PRoot/issues/9, ld-linux.so(제 생각에는) /proc/self/exe를 조사하여 $ORIGIN이 objdump -p의 RPATH 항목으로 대체되었는지 확인합니다.
나는 몇 번이나 이것에 물려 그것을 재발견해야 했습니까? 오, 강하고 현명한 구글이시여, 다음에는 가능한 한 빨리 저를 이곳으로 데려가 주세요. 미래의 제가 과거의 무릎 위에서 다시 배울 수 있도록!
답변2
추가하셔야 할 것 같습니다
/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 사용) 원하는 패키지를 설치하는 것이 덜 고통스러울 수 있습니다. 이를 통해 패키지 관리자는 종속성 해결, 필요한 모든 파일 설치, 설치 후 작업 실행 등의 모든 작업을 처리할 수 있습니다.