Estoy escribiendo la creación de cárceles chroot y parte de esa automatización incluye copiar varios ejecutables y sus dependencias en la cárcel. Estoy usando la siguiente línea bash para analizar las rutas de archivo de una lista de dependencias (para Java, por ejemplo):
$ 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
Esto funciona muy bien para Node.js y Python, pero cuando intento ejecutar java
desde la cárcel, aparece un error:
java: error al cargar bibliotecas compartidas: libjli.so: no se puede abrir el archivo de objeto compartido: No existe tal archivo o directorio
Resulta que la ruta libjli.so falta en la lista de dependencias ... al menos las que ldd
nos muestran (línea 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)
Encontré el archivo ...
$ 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
... pero me gustaría saber por qué no figura en la lista ldd
. Es aparentemente una dependencia conocida, pero la ruta es desconocida? Cualquier ayuda es apreciada!
fuente
Respuestas:
Se supone que funciona de inmediato, sin alterar /etc/ld.so.conf* o ldconfig, y puede hacerlo fácilmente. Simplemente monte / proc en su chroot. Hago esto con la siguiente línea en / etc / fstab en mi raíz real fs:
/ proc / var / chroot / ia32 / proc none bind
Por lo tanto, vincularlo al real / proc.
Según https://github.com/cedric-vincent/PRoot/issues/9 , ld-linux.so (supongo que lo es) determina $ ORIGIN para sustituir en las entradas RPATH de objdump -p mirando / proc / self / exe.
¿Cuántas veces he sido mordido por esto y tuve que redescubrirlo? ¡Por favor, oh poderoso y sabio Google, llévame aquí rápidamente la próxima vez, para que el futuro pueda aprender de nuevo a la altura del pasado!
fuente
/proc/self/exe
fue la pista faltante a mi lado. Montar/proc
en mi chroot hizo el truco.Parece que necesitas agregar
a /etc/ld.so.conf, o más probablemente a un nuevo archivo en /etc/ld.so.conf.d. Luego ejecute
ldconfig
para actualizar el caché paraldd
que encuentre la biblioteca.Para los chroots de secuencias de comandos, probablemente tendrá menos dolor a largo plazo para adoptar un enfoque basado en paquetes, creando primero una instalación base (utilizando, por ejemplo, debootstrap en hosts basados en Debian), y luego instalando los paquetes que desee. Eso permite que el administrador de paquetes se encargue de todo el trabajo de resolver dependencias, instalar todos los archivos necesarios y ejecutar tareas posteriores a la instalación.
fuente