Setiap distrbusi memiliki tool-tool yang berbeda untuk membangun kernel modifikasi dari source. Artikel ini khusus untuk meng- kompilasi kernel sistem Fedora. Disini akan dijelaskan cara membangun kernel modifikasi menggunakan source kernel terbaru yang bisa didapatkan dari www.kernel.org (vanilla kernel) sehingga anda tidak lagi tergantung dari kernel-kernel yang di-suplay oleh distributor. Disini juga akan dijelaskan bagaimana melakukan patch pada kernel source jika anda membutuhkan fitur-fitur baru yang tidak terdapat pada kernel lama.
Saya telah mencoba cara ini pada Fedora Core 6.
Sebelumnya ingin saya katakan bahwa ini bukanlah satu-satunya cara untuk melakukan kompilasi kernel. Ada banyak cara lain untuk melakukan hal ini, tapi cara inilah yang saya gunakan. Dan saya tidak dapat memastikan bahwa cara ini pasti akan berhasil untuk anda!
1. Pendahuluan
Pada artikel ini akan dijelaskan dua cara untuk membangun sistem kernel Fedora. Yang pertama adalah khusus untuk Fedora, dan pada akhirnya anda akan memiliki paket kernel rpm yang dapat anda install atau di-share dengan teman-teman anda. Cara kedua adalah sama untuk seluruh distribusi linux, tapi hasil akhirnya bukanlah paket rpm.
Saya lebih suka melakukan semua langkah-langkah instalasi sebagai user root. Namun, mungkin juga untuk menjalankan perintah-perintah hanya menggunakan hak user biasa (misalnya user tom). Beberapa perintah seperti yum atau rpm masih tetap harus menggunakan root privilege, jadi anda harus menambahkan tom (atau siapapun username yang digunakan) pada /etc/sudoers dengan menjalankan
visudo
Tambahkan baris berikut:
Sekarang kapanpun anda menjalankan perintah yang membutuhkan hak root, seperti
yum install fedora-rpmdevtools unifdef
perintah tersebut akan memberitahukan anda, dan anda harus menjalankan perintah
sudo yum install fedora-rpmdevtools unifdef
Ingat: anda dapat melupakan tentang sudo jika menjalankan perintah sebagai root. Semua itu terserah anda untuk menentukan cara yang paling anda suka.
2. Membangun Paket Kernel rpm
Dalam bab ini akan diperlihatkan bagaimana membangun kernel dengan hasil file paket rpm yang dapat anda instal ataupun di-share dengan orang lain.
2.1 Membuat direktori rpmbuild
Buatlah direktori rpmbuild sbb:
cd ~
cp -a /usr/src/redhat/ rpmbuild
echo ‘%_topdir %(echo $HOME)/rpmbuild’ >> .rpmmacros
Kemudian instal paket-paket yang dibutuhkan untuk membuat paket rpm
yum install fedora-rpmdevtools unifdef
kemudian run atau jalankan perintah
fedora-buildrpmtree
2.2 Download Dan Install Fedora Kernel src.rpm
Kernel src.rpm Fedora Core 6 terbaru adalah kernel-2.6.18-1.2798.fc6.src.rpm, jadi kita download dan install sekarang:
cd /usr/src
wget http://download.fedora.redhat.com/pub/fedora/linux/core/6/source/SRPMS/kernel-2.6.18-1.2798.fc6.src.rpm
rpm -ivh kernel-2.6.18-1.2798.fc6.src.rpm
Jika anda melihat pesan warning berikut:
warning: user brewbuilder does not exist – using root
warning: group brewbuilder does not exist – using root
abaikan saja.
Kita telah menginstal source kernel untuk kernel 2.6.18 bersamaan dengan banyak patch untuk Fedora dan patch kernel 2.6.18.1, jadi jika kita lanjutkan mem-build kernel dari src.rpm ini, akan dihasilkan kernel 2.6.18.1.
2.3 Kernel Patch
Saya lebih tertarik untuk menginstal kernel 2.6.18.2 daripada kernel 2.6.18.1. Dalam src.rpm yang kita instal barusan sudah terdapat kernel 2.6.18 plus patch untuk kernel 2.6.18.1. Kita akan menggantikannya dengan patch untuk kernel 2.6.18.2.
cd ~/rpmbuild/SOURCES/
wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.18.2.bz2
Anda juga dapat menggunakanhttp://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc5.bz2 prepatch jika anda ingin menghasilkan kernel 2.6.19-rc5. Tolong diingat bahwa ini hanya berhasil untuk prepatch, misalnya patch untuk kernel yang belum ada versi finalnya, seperti kernel 2.6.19. Anda bisa meng-apply patch tersebut pada kernel source 2.6.18, tapi tidak untuk kernel 2.6.18.1 atau 2.6.18.2, dan seterusnya. Hal ini dijelaskan dihttp://kernel.org/patchtypes/pre.html:
Prepatches are the equivalent to alpha releases for Linux; they live in the testing directories in the archives. They should be applied using the patch(1) utility to the source code of the previous full release with a 3-part version number (for example, the 2.6.12-rc4 prepatch should be applied to the 2.6.11 kernel sources, not, for example, 2.6.11.10.)
Sekarang kita harus memodifikasi file kernel-2.6.spec agar patch kernel kita bisa dikenali:
cd ~/rpmbuild/SPECS/
vi kernel-2.6.spec
Cari baris
Patch1: patch-2.6.18.1.bz2
dan ganti dengan baris berikut ini:
Patch1: patch-2.6.18.2.bz2
(atau patch apapun yang telah anda download).
Kemudian jalankan
rpmbuild -bp kernel-2.6.spec
Jika anda ingin menghasilkan kernel untuk arsitektur yang spesifik seperti i386, i586, i686, or x86_64, anda dapat melakukannya seperti berikut:
rpmbuild -bp –target=i686 kernel-2.6.spec
Saya tidak melakukannya dalam contoh dan akan menghasilkan kernel i386. Mungkin sistem anda memiliki arsitektur yang berbeda jika anda tidak menspesifikasikannya, jadi tolong ingat hal ini jika anda berpatokan pada tutorial ini.
Sekarang tibalah kita pada bagian yang sulit-sulit gampang
. Pada file src.rpm telah terdapat banyak patch yang Fedora-specific. Beberapa diantaranya tidak cocok dengan patch 2.6.18.2 kita, jadi, jika anda melihat yang seperti ini pada output rpmbuild:
+ echo ‘Patch #300 (linux-2.6-ppc-dac960-ipr-clash.patch):’
Patch #300 (linux-2.6-ppc-dac960-ipr-clash.patch):
+ patch -p1 -s
Reversed (or previously applied) patch detected! Assume -R? [n]
Apply anyway? [n]
1 out of 1 hunk ignored — saving rejects to file drivers/block/DAC960.c.rej
error: Bad exit status from /var/tmp/rpm-tmp.46287 (%prep)
RPM build errors:
Bad exit status from /var/tmp/rpm-tmp.46287 (%prep)
anda harus mengedit ulang file kernel-2.6.spec dan men-comment patch #300:
vi kernel-2.6.spec
[...]
#Patch300: linux-2.6-ppc-dac960-ipr-clash.patch
[...]
#%patch300 -p1
[...]
|
Kemudian jalankan lagi perintah rpmbuild:
rpmbuild -bp kernel-2.6.spec
Anda harus mengulang-ulang hal ini sampai tidak ada lagi patch yang error atau gagal.
2.4 Menentukan String Identifikasi Kernel
Sekarang kita harus mengidentifikasikan string agar nantinya kita dapat mengenali kernel yang telah kita modifikasi. Untuk itu kita akan melakukannya seperti berikut:
cd ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.i386
vi Makefile
Pada baris EXTRAVERSION, kita dapat memasukkan tanda pengenal untuk kernel kita. Jadi akan terlihat seperti berikut:
EXTRAVERSION = -custom-2.6.18.2
2.5 Konfigurasi Kernel
Sebelumnya kita akan men-copy file konfigurasi dari kernel kita yang belum di upgrade:
cp /boot/config-`uname -r` ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.i386/.config
Sekarang jalankan
make menuconfig
Tunggu sampai muncul menu konfigurasi kernel. Pilihlah menu Load an Alternate Configuration File dan pilih file .config (yang telah kita copy-kan sebelumnya) sebagai file konfigurasi default.
Buatlah perubahan-perubahan yang memang dirasa perlu. Jika sudah selesai, kemudian pilih menu Exit, jawablah pertanyaan berikut (Do you wish to save your new kernel configuration?) dengan Yes
2.6 Membangun Kernel
Sekarang kita akan membangun/build paket kernel rpm dengan menjalankan perintah
make rpm
Setelah itu anda akan menemukan paket src.rpm dalam direktori ~/rpmbuild/SRPMS/, seperti ~/rpmbuild/SRPMS/kernel-2.6.18custom2.6.18.2-1.src.rpm, dan paket kernel rpm pada direktori ~/rpmbuild/RPMS/i386/ (atau ~/rpmbuild/RPMS/i586/, ~/rpmbuild/RPMS/i686/, dan seterusnya. Tergantung pada arsitektur mesin anda), misalkan ~/rpmbuild/RPMS/i386/kernel-2.6.18custom2.6.18.2-1.i386.rpm. Seperti telah anda lihat sendiri bahwa indentifikasi kernel telah ditambahkan pada nama paket.
2.7 Instal Kernel Baru
Sekarang coba masuk dalam direktori dimana paket kernel rpm baru anda dibuat (tergantung pada arsitektur mesin anda, misalkan ~/rpmbuild/RPMS/i386/), kemudian instal:
cd ~/rpmbuild/RPMS/i386
rpm -ivh kernel-2.6.18custom2.6.18.2-1.i386.rpm
(bahkan sekarang anda dapat memindahkan paket rpm ini ke komputer Fedora sistem lain dan meng-instal dengan cara yang persis sama, dengan kata lain anda tidak perlu lagi melakukan kompilasi kernel.)
Selanjutnya kita akan membuat ramdisk, karena jika tidak maka sistem tidak akan mem-boot kernel baru kita:
mkinitrd /boot/initrd-2.6.18-custom-2.6.18.2.img 2.6.18-custom-2.6.18.2
Kemudian edit file /boot/grub/menu.lst. Lihatlah pada konfigurasi yang sudah ada dan ambil salah satu bait sebagai contoh.
vi /boot/grub/menu.lst
Sebagai contoh, menu.lst saya, terlihat seperti ini saat belum ditambahkan bait baru:
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.18-1.2798.fc6)
root (hd0,0)
kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-1.2798.fc6.img
|
Dan setelahnya:
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.18-custom-2.6.18.2)
root (hd0,0)
kernel /vmlinuz-2.6.18-custom-2.6.18.2 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-custom-2.6.18.2.img
title Fedora Core (2.6.18-1.2798.fc6)
root (hd0,0)
kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-1.2798.fc6.img
|
Anda bisa mengetahui tentang file-file vmlinuz dan initrd dengan menjalankan perintah:
ls -l /boot
Sekarang reboot sistem:
shutdown -r now
Jika semuanya berjalan dengan baik, seharusnya kernel baru anda sudah berjalan. Anda dapat mengeceknya dengan perintah:
uname -r
dan akan tampil pada layar kira-kira seperti ini:
2.6.18-custom-2.6.18.2
Jika sistem tidak berjalan, restart komputer anda, dan masuk ke dalam menu GRUB. Pilih kernel lama anda untuk menjalankan sistem. Anda bisa mencoba melakukan kompilasi ulang pada kernel. Jangan lupa untuk menghapus bait dari kernel yang gagal berjalan dari file /boot/grub/menu.lst.