Gentoo Logo

Panduan Prelink Gentoo Linux

Daftar Isi:

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!



Print

Diperbarui 2 April 2007

Versi asli dari dokumen ini terakhir diupdate 12 Januari 2010

Rangkuman: Panduan ini berisi cara menggunakan dukungan prelink di Portage 2.0.46 dan yang lebih baru

Stefan Jones
Author

John P. Davis
Editor

Jorge Paulo
Editor

Sven Vermeulen
Editor

Erwin
Editor

Dzikri Aziz
Translator

Donate to support our development efforts.

Copyright 2001-2012 Gentoo Foundation, Inc. Questions, Comments? Contact us.