Product SiteDocumentation Site

8.10. Mengompilasi sebuah Kernel

Kernel yang disediakan oleh Debian menyertakan banyak fitur, sebagaimana penggerak (driver) penuh, agar dapat menangani spektrum yang luas konfigurasi perangkat keras. Oleh karena itu, beberapa pengguna lebih memilih mengompilasi ulang kernel agar hanya menyertakan beberapa yang mereka butuhkan saja. Ada dua alasan untuk pilihan ini. Pertama, mungkin untuk mengoptimalisasi konsumsi memori, karena kode kernel, bahkan jika tak pernah digunakan, memakan memori yang tidak berguna (dan tak pernah “hilang” pada ruang swap, karena dia menggunakan RAM sebenarnya), di mana dapat mengurangi performa sistem. Kernel lokal yang dikompilasi dapat membatasi resiko masalah keamanan karena hanya sebagian kode kernel yang dikompilasi dan dijalankan.
Kompilasi ulang kernel juga diperlukan jika Anda ingin menggunakan fitur tertentu yang hanya tersedia sebagai patch (dan tidak disertakan dalam versi kernel standar).

8.10.1. Perkenalan dan Prasyarat

Tidak mengejutkan Debian mengelola kernel dalam bentuk paket, yang mana tidak secara tradisional kernel dikompilasi dan diinstall. Selama kernel berada dalam kontrol sistem paket, dia dapat dicopot bersih, atau disebarkan pada beberapa mesin. Lagipula, skrip yang berhubungan dengan paket ini secara mengotomatisasi interaksi dengan bootloader dan pembuat initrd.
Sumber Linux hulu berisi apapunt yang diperlukan untuk membangun sebuah kernel paket Debian. Namun Anda masih perlu menginstall build-essential untuk memastikan bahwa Anda memiliki peralatan yang diperlukan untuk membangun sebuah paket Debian. Lagipula, langkah konfigurasi untuk kernel memerlukan paket libncurses5-dev. Akhirnya, paket fakeroot akan memungkinkan pembuatan paket Debian tanpa menggunakan hak akses administrator.

8.10.2. Mendapatkan Sumber

Seperti apapun yang dapat berguna pada sebuah sistem Debian, sumber kernel Linux tersedia dalam sebuah paket. Untuk mendapatkannya, install saja paket linux-source-versi. Perintah apt-cache search ^linux-source menampilkan berbagai variasi versi paket kernel oleh Debian. Versi terkini tersedia dalam distribusi Unstable: Anda dapat mengunduhnya tanpa banyak resiko (khususnya jika APT Anda dikonfigurasi berdasarkan instruksi Bagian 6.2.6, “Bekerja dengan Beberapa Distribusi”). Catat bahwa kode sumber yang ada dalam paket ini tidak secara persis sama dengan yang dipublikasikan oleh Linus Torvalds dan pengembang kernel; seperti seluruh distribusi, Debian menerapkan berbagai patch, yang mungkin (mungkin tidak) ditemukan pada versi hulu Linux. Modifikasi ini termasuk backport perbaikan/fitur/penggerak (driver) dari versi kernel terbaru, fitur baru yang belum (sepenuhnya) digabungkan dalam upstream Linux tree, dan terkadang bahkan perubahan spesifik Debian.
Pengingat bagian ini difokuskan pada kernel Linux versi 3.16, namun contohnya tentu saja dapat diadaptasi ke beberapa versi kernel yang Anda inginkan.
Kita asumsikan paket linux-source-3.16 telah terpasang. Ini berisi /usr/src/linux-source-3.16.tar.xz, sebuah arsip sumber kernel yang dimampatkan. Anda harus mengekstrak berkas ini dalam sebuah direktori baru (tidak langsung di bawah /usr/src/, sebab untuk mengompilasi kernel Linux tidak memerlukan hak akses khusus): ~/kernel/ cocok.
$ mkdir ~/kernel; cd ~/kernel
$ tar -xaf /usr/src/linux-source-3.16.tar.xz

8.10.3. Mengonfigurasi Kernel

Langkah selanjutnya mengonfigurasi kernel berdasarkan kebutuhan Anda. Prosedur tepatnya tergantung pada tujuannya.
Ketika mengompilasi versi kernel lebih baru (mungkin dengan patch tambahan), konfigurasinya sebaiknya akan sedekat mungkin dengan yang ditawarkan oleh Debian. Dalam hal ini, dan daripada mengonfigurasi segalanya dari scratch, cukup menyalin berkas /boot/config-versi (versi kernel yang sedang digunakan, yang dapat ditemukan dengan perintah uname -r) ke sebuah berkas .config dalam direktori yang berisi sumber kernel.
$ cp /boot/config-3.16.0-4-amd64 ~/kernel/linux-source-3.16/.config
Kecuali Anda perlu mengubah konfigurasi, Anda dapat berhenti di sini dan melompat ke Bagian 8.10.4, “Kompilasi dan Membangun Paket”. Namun jika Anda perlu mengubahnya, atau jika Anda memutuskan untuk mengonfigurasi semuanya dari awal, Anda perlu meluangkan waktu untuk mengonfigurasi kernel Anda. Ada berbagai antarmuka terdedikasi dalam direktori sumber kernel yang dapat digunakan dengan memanggil perintah make target, dimana target merupakan salah satu dari nilai-nilai yang dijelaskan di bawah.
make menuconfig mengkompilasi dan mengeksekusi sebuah antarmuka mode teks (inilah di mana paket libncurses5-dev diperlukan) yang memungkinkan navigasi pilihan yang tersedia dalam sebuah struktur hirarkis. Menekan tombol Spasi megubah nilai opsi yang dipilih, dan Enter memvalidasi tombol yang dipilih di layar bagian bawah; Select mengembalikan ke sub-menu yang dipilih; Exit menutup layar saat ini dan kembali ke hirarki sebelumnya; Help akan menampilkan informasi yang lebih rinci atas peran dari opsi yang sedang dipilih. Tombol panah memungkinkan perpindahan pada daftar pilihan dan tombol. Untuk keluar dari program konfigurasi, pilih Exit dari menu utama. Program kemudian menawarkan untuk menyimpan perubahan yang telah Anda buat; terima jika Anda merasa puas dengan pilihan Anda.
Antarmuka lain memiliki fitur yang mirip, namun mereka bekerja dengan antarmuka grafis yang lebih modern; serperti make xconfig yang menggunakan antarmuka grafis Qt, dan make gconfig yang menggunakan GTK+. Yang pertama memerlukan libqt4-dev, sedangkan yang berikutnya memerlukan libglade2-dev dan libgtk2.0-dev.
Ketika menggunakan salah satu antarmuka konfigurasi tersebut, sebaiknya dimulai dengan konfigurasi standar. Kernel menyediakan konfigurasi tersebut dalam arch/arch/configs/*_defconfig dan Anda dapat menaruh konfigurasi pilihan dengan perintah seperti make x86_64_defconfig (dalam hal ini PC 64-bit) atau make i386_defconfig (dalam hal ini PC 32-bit).

8.10.4. Kompilasi dan Membangun Paket

Ketika konfigurasi kernel telah siap, perintah sederhana make deb-pkg akan menghasilkan hingga 5 paket Debian: linux-image-versi yang berisi image kernel dan modul yang sesuai, linux-headers-versi yang berisi berkas header yang diperlukan untuk membangun modul eksternal, linux-firmware-image-versi yang berisi berkas firmware yang diperlukan oleh beberapa penggerak, linux-image-versi-dbg yang berisi simbol debugging untuk image kernel dan modulnya, dan linux-libc-dev yang berisi header yang sesuai dengan pustaka tingkat pengguna seperti GNU glibc.
version didefinisikan dengan rentetan versi hulu (sebagaimana didefinisikan oleh variabel VERSION, PATCHLEVEL, SUBLEVEL dan EXTRAVERSION dalam Makefile), dari parameter konfigurasi LOCALVERSION, dan variabel lingkungan LOCALVERSION. Versi paket menggunakan string versi yang sama dengan revisi ditambahkan yang umumnya ditingkatkan (dan diurutkan dalam .version), kecuali jika Anda meng-override-nya dengan variabel lingkungan KDEB_PKGVERSION.
$ make deb-pkg LOCALVERSION=-falcot KDEB_PKGVERSION=$(make kernelversion)-1
[...]
$ ls ../*.deb
../linux-headers-3.16.7-ckt4-falcot_3.16.7-1_amd64.deb
../linux-image-3.16.7-ckt4-falcot_3.16.7-1_amd64.deb
../linux-image-3.16.7-ckt4-falcot-dbg_3.16.7-1_amd64.deb
../linux-libc-dev_3.16.7-1_amd64.deb

8.10.5. Kompilasi Modul Eksternal

Beberapa modul dikelola di luar kernel Linux resmi. Untuk menggunakannya, mereka harus dikompilasi bersama dengan kernel yang tepat. Beberapa modul pihak ketiga yang umum disediakan oleh Debian dalam paket khusus, serperti xtables-addons-source (modul-modul ekstra untuk iptables) atau oss4-source (Open Sound System, beberapa alternatif driver audio).
Paket eksternal ini ada banyak variasinya dan kami tidak akan menampilkan seluruh daftarnya di sini; perintah apt-cache search source$ dapat memersempit kolom pencarian. Akan tetapi, daftar yang lengkap terkadang tidak berguna karena ada alasan khusus untuk mengompilasi modul eksternal kecuali ketika Anda tahu Anda memerlukannya. Dalam kasus tertentu, dokumentasi perangkat keras akan secara khas merinci modul spesifik yang diperlukannya agar berfungsi di Linux.
Misalnya, mari lihat pada paket xtables-addons-source: setelah instalasi, sebuah sumber modul .tar.bz2 tersimpan di /usr/src/. Kita dapat mengekstraknya secara manual berkas tarball tersebut dan membangun modul, dalam prakteknya kita lebih memilih untuk mengotomatisasi seluruh menggunakan DKMS. Kebanyakan modul menawarkan integrasi DKMS yang diperlukan dalam sebuah paket yang diakhiri dengan akhiran -dkms. Dalam kasus kita, hanya perlu menginstall xtables-addons-dkms untuk mengompilasi modul kernel bagi kernel saat ini asal telah tersedia paket linux-headers-* yang cocok dengan kernel yang terinstall. Umpamanya, Jika Anda menggunakan linux-image-amd64, Anda juga perlu menginstall linux-headers-amd64.
$ sudo apt install xtables-addons-dkms

[...]
Setting up xtables-addons-dkms (2.6-1) ...
Loading new xtables-addons-2.6 DKMS files...
First Installation: checking all kernels...
Building only for 3.16.0-4-amd64
Building initial module for 3.16.0-4-amd64
Done.

xt_ACCOUNT:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/3.16.0-4-amd64/updates/dkms/
[...]
DKMS: install completed.
$ sudo dkms status
xtables-addons, 2.6, 3.16.0-4-amd64, x86_64: installed
$ sudo modinfo xt_ACCOUNT
filename:       /lib/modules/3.16.0-4-amd64/updates/dkms/xt_ACCOUNT.ko
license:        GPL
alias:          ipt_ACCOUNT
author:         Intra2net AG <opensource@intra2net.com>
description:    Xtables: per-IP accounting for large prefixes
[...]

8.10.6. Menerapkan Patch Kernel

Beberapa fitur tidak disertakan dalam kernel standar karena belum maksimalnya atau ketidaksepakatan dengan maintainer kernel. Beberapa fitur mungkin didistribusikan sebagai patch di mana setiap orang bebas untuk menerapkan ke sumber kernel.
Debian mendistribusikan beberapa patch ini dalam paket linux-patch-* atau kernel-patch-* (misalnya, linux-patch-grsecurity2, yang menyempitkan beberapa peraturan keamanan kernel). Paket ini menginstall berkas dalam direktori /usr/src/kernel-patches/.
Untuk menerapkan satu atau lebih patch ini yang terinstall, gunakan perintah patch dalam direktori sumber kemudian mulai kompilasi kernel sebagaimana dijelaskan di atas.
$ cd ~/kernel/linux-source-3.16
$ make clean
$ zcat /usr/src/kernel-patches/diffs/grsecurity2/grsecurity-3.0-3.17.1-201410250027.patch.gz | patch -p1
Catat bahwa patch yang diberikan mungkin tidak bekerja dengan setiap versi kernel; mungkin saja sebuah patch gagal ketika diterapkan ke sumber kernel. Sebuah pesan error akan ditampilkan dan memberikan beberapa rincian tentang kesalahan; dalam kasus ini, mengacu ke dokumentasi yang tersedia dalam paket Debian dari patch tersebut (dalam direktori /usr/share/doc/linux-patch-*/). Dalam banyak kasus, maintainer menunjukkan versi kernel mana patch mereka ditujukan.