Mengapa Harus Pakai Custom Kernel?

Jika installasi distribusi Linux anda sudah mengenali seluruh hardware yang anda miliki, dan anda rasa anda tidak menemukan masalah dengan kernel yang anda gunakan saat ini, maka anda sebenarnya tidak membutuhkan custom kernel. Tetapi jika anda ingin mengoptimalkan kernel sehingga sesuai dengan konfigurasi hardware yang anda miliki, maka anda bisa melakukan kustomisasi terhadap kernel anda.

Kernel yang didistribusikan oleh distro Linux biasanya dikonfigurasi untuk umum. Secara default, setting jenis prosesor dan sub arsitektur harware yang terdapat didalam kernel di atur tidak spesifik terhadap hardware tertentu. Keuntungan dari hal ini adalah kernel sesuai untuk di "pasang" di jenis PC apapun. Kekurangannya, instruksi spesifik yang dimiliki suatu jenis prosesor tertentu (misalnya instruksi-instruksi AMD 64) tidak optimal digunakan.

Inilah indahnya Linux, kita dapat menyesuaikan konfigurasi kernel (inti dari sebuah sistem operasi) sesuai dengan hardware yang kita miliki. Untuk saya pribadi, selain untuk menyesuaikan arsitektur hardware yang saya miliki, saya melakukan custom kernel agar saya bisa menggunakan driver wireless network (bawaan manufaktur) dengan ndiswrapper.

Sistem operasi yang saya gunakan adalah Fedora 8. Meskipun Fedora 9 sudah keluar, namun saya sudah "nyaman" dengan Fedora 8. Kalau untuk "sentimental reason"-nya sih begini, logo Fedora (Infinity) sama dengan angka 8, saya mengartikannya sistem operasi ini dapat digunakan tanpa batas :D. Kalo untuk "technical reason"-nya, konfigurasi kernel bawaan Fedora 8 (2.6.23.1-42) sudah mendekati dengan hardware yang saya miliki. Saya tinggal melakukan sedikit konfigurasi untuk mendapatkan kernel yang optimal.

Saya menggunakan notebook rakitan lokal B|Y|O|N M3311 dengan processor Intel Celeron 1,8 GHz. Notebook ini sudah menyediakan webcam dengan chipset Microdia (0c45:624f). Kemudian karena saya memasang wirelessnya belakangan, saya mendapati jenis wireless yang digunakan berchipset Atheros (AR5007EG terdeteksi sebagai AR5006EG).

Hampir seluruh hardware dapat dikenali dengan baik. Untuk webcam Microdia, saya menggunakan driver dari Microdia Group. Untuk driver wireless, jika menggunakan madwifi, lampu indikator aktifitas wireless tidak berfungsi. Sedangkan jika menggunakan ndiswrapper, lampu indikator bisa berfungsi namun untuk menggunakan ndiswrapper+driver dari vendor sendiri perlu menonaktifkan konfigurasi 4KSTACKS pada kernel yang secara default diaktifkan oleh Fedora (di distro Ubuntu tidak ada masalah dengan hal ini).

Jadinya, kustomisasi kernel ini saya perlukan untuk mengubah Processor Family dari M686 ke MPENTIUM4 (lebih spesifik ke instruksi yang dimiliki oleh Intel) karena prosesor yang saya gunakan adalah Intel Celeron (P4 Based). Kemudian mengubah Sub Architecture Type dari X86_GENERICARCH ke X86_PC (PC Compatible). Untuk kompatibilitas dengan driver wireless dari vendor (saya enggan menyebut hal ini dengan driver Windows) dengan ndiswrapper, saya juga harus menonaktifkan konfigurasi 4KSTACKS pada kernel.

Tujuan saya bisa digambarkan secara umum seperti diatas. Berikutnya untuk contoh, saya hanya akan memberikan contoh melakukan kustomisasi kernel di Fedora 8. Kustomisasi kernel di distro ini sangat mudah dan terdokumentasikan dengan baik. Paket kernel yang dihasilkan dari proses kustomisasi ini juga sesuai dengan standard pemaketan kernel Fedora.

Persiapan Awal

Perhatikan bentuk prompt yang saya gunakan. Jika saya menggunakan tanda "$", artinya lakukan perintah tersebut sebagai user biasa. Jika saya menggunakan tanda "#", maka lakukan perintah tersebut sebagai root.
Anda membutuhkan aplikasi pendukung sebelum bisa melakukan kustomisasi kernel di Fedora. Untuk mendapatkan aplikasi yang dibutuhkan, cukup mengetikan perintah ini:
$ su -c 'yum install yum-utils rpmdevtools'
Setelah selesai, anda harus menyiapkan direktori kerja dengan perintah:
$ rpmdev-setuptree
Langkah ini akan membuat directory rpmbuild beserta struktur sub directory yang diperlukan untuk pemaketan kernel pada directory home anda.

Memperoleh Kernel Source

Untuk memperoleh kernel source pada Fedora, anda tinggal mengetikan perintah berikut:
$ su -c 'yumdownloader --source kernel'
Instruksi ini akan melakukan download kernel source versi terakhir yang ada di repositories. Jika anda membutuhkan versi lain, silahkan anda browse sendiri kernel lain yang sesuai dengan release distro Fedora anda.

Menginstall Dependencies

Untuk menginstall dependencies yang diperlukan untuk build kernel, ketikan perintah berikut:
$ su -c 'yum-builddep kernel-<version>.src.rpm'
Silahkan ganti <version> dengan versi kernel yang anda dapatkan.

Install Kernel Source

Install kernel source dengan perintah:
$ rpm -ivh kernel-<version>.src.rpm
Abaikan warning mengenai "user doesn't exists - using root" yang keluar ketika proses ini. Proses ini akan mengextract isi dari paket kernel source ke directory rpmbuild yang telah disiapkan sebelumnya.

Menyiapkan Kernel Source Tree

Masuk ke directory SPECS pada direktori kerja yang telah kita siapkan dengan mengetikan perintah berikut:
$ cd ~/rpmbuild/SPECS
Kemudian untuk menyiapkan Kernel Source Tree, ketikan perintah berikut:
$ rpmbuild -bp --target=`uname -m` kernel.spec
Yang akan anda dapatkan dari perintah tersebut adalah direktori build kernel di ~/rpmbuild/BUILD/kernel-<version>/linux-<version>.<arch>. Dimana <version> adalah versi kernel anda dan <arch> adalah arsitektur mesin anda.
Kita asumsikan tidak akan menambahkan patch apapun pada kernel yang akan kita kustomisasi ini, sehingga langkah selanjutnya adalah melakukan konfigurasi kernel.

Konfigurasi Kernel

Pindah ke direktory build kernel dengan perintah:
$ cd ~/rpmbuild/BUILD/kernel-<version>/linux-<version>.<arch>
Pilih salah satu konfigurasi yang diinginkan dari ~/rpmbuild/BUILD/kernel-<version>/linux-<version>.<arch>/configs/ dengan perintah:
$ cp configs/<desired-config-file> .config
Dimana <desired-config-file> adalah salah satu file konfigurasi yang kita pilih.

Ketikan perintah:
$ make oldconfig
untuk mengaktifkan konfigurasi lama (default) yang kita pilih. Kemudian untuk kembali ke tujuan awal kita, langkah berikut inilah yang merupakan langkah utama dalam kustomisasi kernel.

Anda dapat memilih salah satu perintah berikut yang sesuai dengan keinginan anda:
$ make config
untuk melakukan konfigurasi kernel secara text-based, atau:
$ make menuconfig
untuk melakukan konfigurasi kernel dengan TUI (Text User Interface), atau:
$ make xconfig
untuk melakukan konfigurasi kernel jika anda menggunakan KDE, atau:
$ make gconfig
untuk melakukan konfigurasi kernel dengan interface Gtk pada desktop GNOME.

Saya sendiri lebih menyukai pilihan terakhir :D karena lebih user friendly. Langkah ini akan menampilkan konfigurasi kernel yang kebanyakan berupa input switch (Yes, No atau Module). Yes artinya kita mengaktifkan konfigurasi tersebut, N berarti menonaktifkan konfigurasi dan pilihan M untuk mengaktifkan konfigurasi tersebut menjadi modul (jika memungkinkan).
Untuk tujuan saya, saya melakukan navigasi berikut:
  1. Kernel hacking -> Use 4Kb for kernel stacks instead of 8Kb -> Not Set (Uncheck)
  2. Processor type and features -> Subarchitecture Type -> PC-compatible -> Set (Check)
  3. Processor type and features -> Processor family -> Pentium-4/Celeron(P4-based)/Pentium-4 M/older Xeon -> Set (Check)
Setelah memodifikasi konfigurasi ini, simpan konfigurasi tersebut dan anda akan kembali ke prompt.

Copy .config ke SOURCE

Copy konfigurasi hasil modifikasi anda ke directory SOURCE dalam direktori kerja anda dengan perintah:
$ cp .config ~/rpmbuild/SOURCES/config-<arch>
dimana <arch> merupakan arsitektur mesin anda, dalam contoh yang saya gunakan <arch> = i686.

Menyiapkan File Build

Pindah ke directory SPECS dengan perintah:
$ cd ~/rpmbuild/SPECS
Edit file kernel.spec kemudian ganti baris ini:
#% define buildid .local
dengan baris berikut:
%define buildid .identitaskernel
Silahkan ganti .identitaskernel dengan build id anda. Saya menggunakan .M3311 sebagai build id yang menandakan kernel ini untuk notebook B|Y|O|N seri M3311. Harap perhatikan untuk menghilangkan spasi diantara tanda "%" dan kata "define".

Build Kernel (Base)

Ini adalah langkah yang ditunggu, langkah ini akan melakukan kompilasi dan build dari kernel yang sudah kita modifikasi. Untuk langkah pertama, silahkan ketikan perintah berikut:
$ rpmbuild -ba --with baseonly --without debuginfo --target=`uname   -m` kernel.spec
Kita menggunakan -ba untuk melakukan build kernel menjadi paket rpm dan src.rpm. Menggunakan --with baseonly karena kita hanya menginginkan kernel standard saja (selain PAE dan xen). Menggunakan --without debuginfo karena kita tidak menginginkan debug info dari hasil kompilasi kernel. Kemudian parameter --target=`uname -m` untuk menentukan target arsitektur dari proses build yang kita kehendaki. Sedangkan kernel.spec merupakan file build yang berisi informasi proses yang harus dilakukan oleh compiler.

Dari proses ini akan diperoleh paket kernel dan kernel-devel pada directory ~/rpmbuild/RPMS/<arch>. Pada contoh saya, <arch> = i686 dan file tersebut adalah: kernel-2.6.23.1-42.M3311.fc8.i686.rpm dan kernel-devel-2.6.23.1-42.M3311.fc8.i686.rpm. Proses ini memakan waktu agak lama, tergantung dari kecepatan prosesor anda.

Build Kernel Headers

Idealnya memang untuk arsitektur i686 tidak membutuhkan lagi paket kernel-headers karena sudah diwakili oleh paket kernel-devel. Namun, beberapa aplikasi yang dicompile dari source (seperti ndiswrapper salah satunya) membutuhkan paket kernel-headers karena masih mengacu ke arsitektur i386.

Untuk melakukan build pake kernel-headers, silahkan ketikan perintah berikut:
$ rpmbuild -ba --without debuginfo --target=i386 kernel.spec
Mirip dengan perintah sebelumnya namun kita menghilangkan parameter --with baseonly dan mengatur target arsitektur ke i386 dengan parameter --target=i386. Anda akan mendapatkan paket kernel-headers pada directory ~/rpmbuild/RPMS/i386.

Build Kernel Doc

Jika anda menghendaki paket kernel-doc, silahkan anda ketikan perintah berikut:
$ rpmbuild -ba --without debuginfo --target=noarch kernel.spec
Kali ini perintah tersebut hanya kita ubah target arsitekturnya ke --target=noarch. Dan anda akan mendapatkan paket kernel-doc pada directory ~/rpmbuild/RPMS/noarch.

Saya sendiri sempat kebingungan bagaimana mendapatkan paket kernel-headers dan kernel-doc pada proses build ini. Namun setelah membaca algoritma pada file kernel.spec, akhirnya saya temukan cara buildnya dengan hanya mengubah target arsitektur build. Silahkan anda pelajari sendiri isi file tersebut untuk lebih jelas.

Installasi kernel

Setelah semua langkah panjang diatas, sebaiknya sebelum installasi anda copy file hasil build ke directory lain sehingga keempat paket kernel berada pada directory yang sama. Keempat paket kernel tersebut dalam contoh saya adalah:
  • kernel-2.6.23.1-42.M3311.fc8.i686.rpm
  • kernel-devel-2.6.23.1-42.M3311.fc8.i686.rpm
  • kernel-headers-2.6.23.1-42.M3311.fc8.i386.rpm
  • kernel-doc-2.6.23.1-42.M3311.fc8.noarch.rpm
Berikutnya tinggal kita install (sebagai root) dengan cara biasa seperti:
# rpm -ivh kernel*.rpm
Nah, beginilah asyiknya bagi saya menggunakan Fedora. Proses kompilasi custom kernel sangat mudah dan hasil akhirnya yang kita dapatkan adalah paket kernel custom yang sesuai dengan pemaketan standard Fedora. Saya belum pernah mencoba di distro berbasis RPM lainnya.

Di Ubuntu, paket kernel dipecah menjadi beberapa bagian. Yang belum saya ketahui salah satunya adalah bagaimana cara membuat paket restricted-modules dari custom kernel yang kita buat di Ubuntu. Beberapa tutorial di Internet hanya menunjukan cara membuat kernel base-nya saja.

Diluar permasalahan tersebut, kedua distro merupakan distro favorit saya. Fedora saya gunakan sendiri karena kebutuhan spesifik saya, sedangkan Ubuntu saya rekomendasikan kepada siapapun yang ingin nyaman menggunakan Linux karena dukungan aplikasi dan komunitas yang kuat.

Apa yang saya rasakan setelah melalui seluruh proses custom kernel ini adalah peningkatan performa yang cukup signifikan dalam proses startup sistem operasi dan ketika bekerja menggunakan IDE NetBeans 6.1.