Panduan Prelink Gentoo Linux
1.
Pendahuluan
Apa itu Prelink dan apa gunanya?
Hampir semua aplikasi memanfaatkan pustaka yang digunakan bersamaan (shared
libraries). Pustaka ini harus dimuat ke memori ketika aplikasi dijalankan
dan berbagai referensi simbol harus diterjemahkan. Untuk aplikasi kecil, proses
ini berlangsung dengan cepat. Tetapi untuk program yang ditulis dengan bahasa
C++ dan yang memiliki banyak dependensi pustaka, proses ini bisa memakan waktu
yang lumayan lama.
Pada kebanyakan sistem, pustaka tidak terlalu sering berganti dan ketika sebuah
program sedang berjalan, operasi yang dijalankan untuk mengkaitkan program
hampir selalu sama. Perlink memanfaatkan situasi ini dengan membawa
kaitan tersebut dan menyimpannya dalam bentuk binari.
Prelink dapat mempersingkat waktu yang diperlukan untuk memanggil sebuah
aplikasi. Misalnya, waktu yang dibutuhkan untuk memanggil sebuah program KDE
biasa dapat dipersingkat sampai 50%. Satu-satunya pemeliharaan yang harus anda
lakukan adalah menjalankan perlink setiap kali pustaka di-upgrade untuk
mendapatkan binari baru.
Peringatan:
Prelink tidak dapat berfungsi dengan Hardened Gentoo karena proyek prelink dan
Hardened Gentoo sama-sama mencoba untuk mengubah pemetaan ruang alamat dari
pustaka, tetapi prelink dengan opsi -R mengacak alamat dasar pustaka, yang
menyediakan proteksi yang hampir sama dengan hardened.
|
Ringkasan
-
Proses prelink dilakukan dengan sebuah program yang bernama prelink.
Program ini merubah binari agar dapat dipanggil lebih cepat.
-
Jika pustaka khusus dari sebuah aplikasi berubah setelah anda
mem-prelink-nya, anda harus mengulangi kembali proses prelink. Jika
tidak, anda akan kehilangan peningkatan kecepatan yang pernah anda
dapatkan. Artinya, setiap kali anda mendapatkan pustaka barus sebagai hasil
dari upgrade sebuah paket melalui portage, anda harus mengulangi proses
prelink untuk aplikasi tersebut.
-
Perubahan pada binari dapat dikembalikan seperti semula secara penuh.
prelink memiliki fungsi undo.
-
Versi Portage saat ini dapat menangani perubahan MD5sum dan mtime binari
melalui prelink.
-
Anda tidak perlu menetapkan FEATURES="prelink" di file
make.conf; Portage akan langsung mendukung perlink jika binari
prelink ditemukan.
2.
Menyiapkan Prelink
Instalasi
Pertama anda harus menginstal prelink. Proses emerge akan langsung
memeriksa apakah sistem anda dapat menggunakan prelink dengan aman.
Daftar Kode 2.1: Instalasi prelink |
# emerge prelink
|
Banyak pengguna yang mendapatkan error ketika menginstal prelink karena adanya
kegagalan pada beberapa pemeriksaan. Pemeriksaan ini dilakukan untuk alasan
keamanan, tingkah laku perlink tidak dapat diduga jika anda menonaktifkan
pemeriksaan ini. Error emerge biasanya hanya disebabkan oleh paket-paket inti;
binutils, gcc, dan glibc. Coba instal ulang paket-paket
tersebut secara berurutan.
Catatan:
Saran: Jika anda mendapatkan error, coba kompilasi dan uji sendiri
prelink (./configure ; make ; make check ). Ketika
gagal, anda akan menemukan file-file *.log di direktorinya.
File-file ini mungkin dapat memberikan petunjuk bagi anda.
|
Jika anda telah mencoba untuk mengulangi langkah-langkah yang telah anda
lakukan di komputer lain tetapi masih mendapatkan error, kunjungilah Bugzilla untuk membuat laporan bug jika
belum ada yang melaporkannya.
Menyiapkan Sistem
Pastikan juga anda tidak menggunakan flag -fPIC di variabel
CFLAGS/CXXFLAGS. Jika anda menggunakannya, anda harus membangun ulang seluruh
sistem anda tanpa flag tersebut.
Konfigurasi
Jalankan env-update untuk menciptakan file /etc/prelink.conf
yang akan memberitahukan perlink tentang file apa saja yang harus
di-prelink.
Daftar Kode 2.2: Menjalankan env-update |
# env-update
|
Sayangnya, anda tidak dapat mem-prelink file-file yang dikompilasi oleh
binutils versi lama. Kebanyakan aplikasi ini hanya disediakan dalam
bentuk binari yang diinstal di /opt. Dengan menciptakan file
berikut ini, anda dapat memerintahkan prelink untuk tidak memprosesnya.
Daftar Kode 2.3: /etc/env.d/60prelink |
PRELINK_PATH_MASK="/opt"
|
Catatan:
Anda dapat menambahkan direktori lain dengan memisahkannya dengan titik dua.
|
3.
Proses Prelink
Cara Menggunakan Prelink
Penulis menggunakan perintah berikut untuk mem-prelink semua binari di dalam
direktori yang terdaftar di /etc/prelink.conf.
Daftar Kode 3.1: Prelink file-file terdaftar |
# prelink -amR
|
Peringatan:
Telah diketahui bahwa jika anda hanya memilki sedikit ruang kosong di harddisk
anda dan anda mem-prelink seluruh sistem anda, maka kemungkinan binari anda
akan disusutkan. Hal ini akan menghasilkan sistem yang kacau. Gunakan perintah
file atau readelf untuk memeriksa file binari. Atau, periksa sisa
ruang kosong yang anda miliki dengan perintah df -h.
|
| Opsi-opsi: |
| -a |
"All": prelink semua binari |
| -m |
Menghemat memori virtual. Ini diperlukan jika anda akan mem-prelink banyak
pustaka.
|
| -R |
Random -- mengacak urutan alamat. Opsi ini akan meningkatkan proteksi
terhadap serangan buffer overflows.
|
Catatan:
Untuk mengetahui opsi-opsi lain yang tersedia, bacalah man prelink
|
Tugas Cron Prelink
sys-devel/prelink-20060213 dan yang lebih baru menginstal sebuah tugas
cron di /etc/cron.daily/prelink. Untuk menggunakannya, edit file
/etc/conf.d/prelink. Ini akan menjalankan prelink di belakang
setiap hari, agar anda tidak perlu menjalankannya lagi.
Mempercepat KDE Setelah Proses Prelink
Waktu yang diperlukan untuk memanggil aplikasi KDE dapat dipersingkat setelah
proses prelink. Jika anda memberitahukan KDE bahwa anda telah mem-prelink-nya,
KDE akan menonaktifkan kdeinit (karena tidak diperlukan lagi), yang
akhirnya dapat lebih mempercepat KDE.
Tetapkan KDE_IS_PRELINKED="true" di /etc/env.d/*kdepaths*
untuk memberitahukan KDE tentang prelink.
Menghapus prelink
Jika anda berubah pikiran dan tidak ingin menggunakan prelink lagi, anda harus
menghapus tugas cron prelink terlebih dahulu dari /etc/cron.daily
dan /etc/conf.d/prelink sebelum anda meng-unmerge prelink.
Kemudian, anda harus menghapus prelink dari semua binari:
Daftar Kode 3.2: Menghapus prelink dari semua binari |
# prelink -au
|
Terakhir, unmerge paket prelink:
Daftar Kode 3.3: Unmerge prelink |
# emerge -aC prelink
|
4.
Masalah-masalah dan Pemecahannya
"Cannot prelink against non-PIC shared library"
Masalah ini disebabkan oleh pustaka yang tidak dikompilasi dengan benar karena
menggunakan opsi -fPIC gcc untuk semua file objeknya.
Berikut ini adalah pustaka yang belum atau tidak dapat diperbaiki:
-
Pustaka pada paket wine, termasuk winex. Prelink tidak akan
dapat mempercepat pemanggilan binari MS windows.
-
Pustaka di paket media-video/mjpegtools,
/usr/lib/liblavfile-1.6.so.0.
-
Pustaka OpenGl nVidia,
/usr/lib/opengl/nvidia/lib/libGL.so.*. Karena alasan performa,
pustaka ini dikompilasi tanpa dukungan PIC.
Jika pustaka anda yang bermasalah tidak dicantumkan di atas, tolong laporkan,
lebih baik lagi jika anda mengikutsertakan tambalan (patch) untuk
menambahkan -fPIC di CFLAGS.
Ketika saya mem-prelink sistem saya, beberapa binari statis tidak bisa
digunakan lagi
Menurut glibc, tidak ada satupun binari yang 100% statis. Jika anda
mengkompilasi sebuah binari secara statis dengan glibc, binari ini masih akan
bergantung pada file lain. Berikut ini adalah penjelasan dari Dick Howell:
"Menurut saya, ide binari statis adalah menyediakan semua yang diperlukan pada
file yang didownload, jadi tidak ada lagi yang bergantung pada pustaka lokal
di sistem target. Sayangnya, di Linux, dan menurut saya di semua sistem operasi
yang menggunakan GLIBC, hal ini tidak selalu benar. Ada "libnss" (name
service switch, ada juga yang menyebutnya network security system)
yang menyediakan fungsi-fungsi untuk mengakses berbagai database untuk
otentikasi, informasi jaringan, dan beberapa fungsi lain. Ide ini bertujuan
untuk menjadikan sebuah aplikasi independen dari lingkungan jaringan yang telah
dikonfigurasi. Memang bagus, tetapi perubahan pada GLIBC dapat menyebabkan
masalah ketika aplikasi tersebut diluncurkan. Anda juga tidak dapat mengkaitkan
"libnss" secara statis karena telah dikonfigurasi untuk setiap komputer secara
individual. Masalahnya, menurut saya, datang dari pengaitan pustaka lain GLIBC
secara statis, terutama "libpthread", "libm", dan "libc", yang mendatangkan
fungsi pemanggilan yang tidak kompatibel dengan "libnss".
Prelink terhenti dengan pesan "prelink: dso.c:306: fdopen_dso: Assertion
`j == k' failed."
Masalah ini sudah diketahui, carilah masalah yang mirip dengan masalah yang
anda dapatkan di sini. Prelink tidak
dapat mengatasi binari UPX yang dipadatkan. Sejak prelink-20021213, tidak ada
perbaikan yang dapat dilakukan kecuali menyembunyikan binari ini ketika anda
melakukan proses prelink. Bacalah bagian Konfigurasi di atas untuk mengetahui cara
melakukannya.
Saya menggunakan grsecurity dan kelihatannya prelink tidak berhasil
Untuk melakukan prelink pada sistem yang menggunakan grsecurity dengan
"randomized mmap() base", anda harus menonaktifkan "randomized mmap() base"
untuk /lib/ld-2.3.*.so. Anda dapat melakukannya dengan utilitas
chpax, tetapi harus dilakukan ketika file tersebut sedang tidak
digunakan (mis. dengan cara boot dari CD rescue).
Prelink gagal dengan pesan error "prelink: Can't walk directory tree XXXX:
Too many levels of symbolic links"
Symlink anda diletakkan terlalu jauh di dalam. Ini terjadi ketika sebuah
symlink menunjuk ke dirinya sendiri. /usr/lib/lib -> lib adalah
contoh yang paling umum. Untuk memperbaikinya, anda boleh mencari sendiri
symlink tersebut, atau dengan menggunakan utilitas yang disediakan oleh paket
symlinks:
Daftar Kode 4.1: Memperbaiki symlink |
# emerge symlinks
# symlinks -drv /
|
Penjelasan lebih lanjut bisa anda dapatkan di Bugzilla dan topik
forum
ini.
5.
Penutup
Prelink dapat mempersingkat waktu yang dibutuhkan untuk memanggil aplikasi
besar secara drastis. Dukungannya telah diikutsertakan di Portage. Prelink juga
aman digunakan karena anda dapat mengembalikan binari yang telah anda prelink
kapan saja, jika anda mendapatkan masalah. Anda hanya harus selalu untuk
mengulangi proses prelink ketika anda meng-upgrade glibc atau pustaka lain!
Singkat kata, seomga berhasil!
Isi dokumen ini dilisensikan dengan lisensi Creative Commons -
Attribution / Share Alike.
|