Saya membuat skrip pembuatan chroot jails dan bagian dari otomatisasi itu termasuk menyalin berbagai executable dan dependensinya ke dalam jail. Saya menggunakan baris bash berikut untuk mem-parsing path file dari daftar dependensi (untuk java, misalnya):
$ 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
Ini berfungsi baik untuk Node.js dan Python, tetapi ketika saya mencoba mengeksekusi java
dari dalam penjara, saya mendapatkan kesalahan:
java: kesalahan saat memuat pustaka bersama: libjli.so: tidak bisa membuka file objek bersama: Tidak ada file atau direktori tersebut
Ternyata libjli.so path hilang dari daftar dependensi ... setidaknya yang ldd
menunjukkan kita (baris 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)
Saya menemukan file ...
$ 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
... tapi saya ingin tahu mengapa itu tidak terdaftar ldd
. Tampaknya ini adalah ketergantungan yang diketahui, tetapi jalurnya tidak diketahui? Bantuan apa pun dihargai!
sumber
Jawaban:
Seharusnya bekerja di luar kotak - tanpa mengacaukan /etc/ld.so.conf* atau ldconfig - dan dapat dengan mudah melakukannya. Cukup pasang / proc di chroot Anda. Saya melakukan ini dengan baris berikut di / etc / fstab di fs root-real saya:
/ proc / var / chroot / ia32 / proc tidak mengikat
Jadi mengikatnya dengan yang asli / proc.
Per https://github.com/cedric-vincent/PRoot/issues/9 , ld-linux.so (saya kira begitu) menentukan $ ASLI untuk menggantikan entri RPATH objdump -p dengan melihat / proc / self / exe.
Berapa kali saya digigit oleh ini dan harus menemukannya kembali? Tolong, oh Google yang perkasa dan bijaksana, bawa aku kembali ke sini secepatnya, jadi aku-masa depan bisa belajar lagi di masa lalu-aku!
sumber
/proc/self/exe
adalah petunjuk yang hilang di sisiku. Pemasangan/proc
di chroot saya berhasil.Tampaknya Anda perlu menambahkan
ke /etc/ld.so.conf, atau lebih mungkin ke file baru di /etc/ld.so.conf.d. Kemudian jalankan
ldconfig
untuk memperbarui cache sehinggaldd
akan menemukan perpustakaan.Untuk skrip chroot, dalam jangka panjang Anda mungkin akan lebih sedikit kesusahan untuk mengambil pendekatan berbasis paket, membuat instalasi basis terlebih dahulu (menggunakan mis. Debootstrap pada host berbasis Debian), kemudian menginstal paket yang Anda inginkan. Itu memungkinkan manajer paket menangani semua pekerjaan menyelesaikan dependensi, menginstal semua file yang diperlukan, dan menjalankan tugas-tugas postinstall.
sumber