Java JDK отсутствует путь libjli.so в списке зависимостей, Debian


8

Я пишу сценарии создания chroot-jail'ов, и часть этой автоматизации включает в себя копирование различных исполняемых файлов и их зависимостей в 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. Это известная зависимость, по-видимому, но путь неизвестен? Любая помощь приветствуется!


Интересный вопрос, вы можете попробовать задать это на форуме openjdk.
Фахим Митха

В случае, если кто-то споткнется об этом из Google: кажется, что это может быть дубликат с unix.stackexchange.com/questions/16656 , который имеет больше информации (и разные ответы).
ишавит

Ответы:


7

Предполагается, что он работает «из коробки» - без возни с /etc/ld.so.conf* или ldconfig - и это легко сделать. Просто смонтируйте / proc в вашем chroot. Я делаю это со следующей строкой в ​​/ etc / fstab в моем реальном root-файле fs:

/ proc / var / chroot / ia32 / proc none bind

Таким образом, связывая его с реальным / proc.

Согласно https://github.com/cedric-vincent/PRoot/issues/9 , ld-linux.so (я полагаю, это так) определяет $ ORIGIN для подстановки в записи RPATH objdump -p, просматривая / proc / self / Exe.

Сколько раз я был укушен этим и должен был заново открыть это? Пожалуйста, о могучий и мудрый Гугл, в следующий раз быстро приведи меня сюда, чтобы будущее - я мог учиться снова на колене прошлого - меня!


1
Спасибо. Вы указали на /proc/self/exeпропавшую подсказку на моей стороне. Монтаж /procв моем chroot сделал свое дело.
Тино

3

Кажется, вам нужно добавить

/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/jli

в /etc/ld.so.conf или, более вероятно, в новый файл в /etc/ld.so.conf.d. Затем запустите, ldconfigчтобы обновить кэш, чтобы lddнайти библиотеку.

Для сценариев chroot в долгосрочной перспективе вам, вероятно, будет меньше проблем с подходом на основе пакетов: сначала создайте базовую установку (например, с помощью debootstrap на хостах на основе Debian), а затем установите нужные вам пакеты. Это позволяет менеджеру пакетов позаботиться обо всей работе по разрешению зависимостей, установке всех необходимых файлов и выполнению задач после установки.


И можете ли вы сказать мне, почему это не было в ld.so.conf или в одном из включенных файлов? Должна ли ОС поместить его туда во время установки?
Рип Лееб

Нет, я этого не знаю. Я могу сказать, что вижу такой же результат на моем хосте Ubuntu 14.04, и все же java запускается нормально. Поэтому необходимо динамически разрешать зависимость во время выполнения.
Эндрю Шульман
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.