Ich schreibe Skripte für die Erstellung von Chroot-Gefängnissen und ein Teil dieser Automatisierung umfasst das Kopieren verschiedener ausführbarer Dateien und ihrer Abhängigkeiten in das Gefängnis. Ich verwende die folgende Bash-Zeile, um die Dateipfade aus einer Liste von Abhängigkeiten (zum Beispiel für Java) zu analysieren:
$ 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
Dies funktioniert gut für Node.js und Python, aber wenn ich versuche, java
aus dem Gefängnis heraus auszuführen , erhalte ich eine Fehlermeldung:
java: Fehler beim Laden von gemeinsam genutzten Bibliotheken: libjli.so: Datei für gemeinsam genutzte Objekte kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis
Es stellt sich heraus, dass der Pfad libjli.so in der Liste der Abhängigkeiten fehlt ... zumindest die, ldd
die uns zeigen (Zeile 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)
Ich habe die Datei gefunden ...
$ 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
... aber ich würde gerne wissen, warum es nicht mit aufgeführt ist ldd
. Es ist anscheinend eine bekannte Abhängigkeit, aber der Pfad ist unbekannt? Jede Hilfe wird geschätzt!
quelle
Antworten:
Es soll sofort funktionieren - ohne Probleme mit /etc/ld.so.conf* oder ldconfig - und es kann dies problemlos tun. Montieren Sie einfach / proc in Ihrer Chroot. Ich mache das mit der folgenden Zeile in / etc / fstab in meiner Real-Root-Fs:
/ proc / var / chroot / ia32 / proc keine Bindung
Damit binde ich es an den Real / Proc.
Per https://github.com/cedric-vincent/PRoot/issues/9 bestimmt ld-linux.so (ich denke es ist) $ ORIGIN für das Einsetzen in die RPATH-Einträge des objdump -p, indem es sich / proc / self / ansieht exe.
Wie oft wurde ich davon gebissen und musste es wieder entdecken? Bitte, oh mächtiger und weiser Google, führe mich das nächste Mal schnell hierher zurück, damit die Zukunft - ich kann wieder am Knie meiner Vergangenheit lernen!
quelle
/proc/self/exe
war der fehlende Hinweis an meiner Seite. Die Montage/proc
in meiner Chroot hat es geschafft.Es scheint, dass Sie hinzufügen müssen
zu /etc/ld.so.conf oder eher zu einer neuen Datei in /etc/ld.so.conf.d. Führen Sie dann aus
ldconfig
, um den Cache zu aktualisieren, damitldd
die Bibliothek gefunden wird.Bei Scripting-Chroots werden Sie auf lange Sicht wahrscheinlich weniger Probleme haben, einen paketbasierten Ansatz zu wählen, indem Sie zuerst eine Basisinstallation erstellen (z. B. mit debootstrap auf Debian-basierten Hosts) und dann die gewünschten Pakete installieren. Auf diese Weise erledigt der Paketmanager die gesamte Arbeit zum Auflösen von Abhängigkeiten, zum Installieren aller erforderlichen Dateien und zum Ausführen von Aufgaben nach der Installation.
quelle