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.
The remainder of this section focuses on the 3.16 version of the Linux kernel, but the examples can, of course, be adapted to the particular version of the kernel that you want.
We assume the linux-source-3.16 package has been installed. It contains /usr/src/linux-source-3.16.tar.xz, a compressed archive of the kernel sources. You must extract these files in a new directory (not directly under /usr/src/, since there is no need for special permissions to compile a Linux kernel): ~/kernel/ is appropriate.
$ 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
Unless you need to change the configuration, you can stop here and skip to Bagian 8.10.4, “Kompilasi dan Membangun Paket”. If you need to change it, on the other hand, or if you decide to reconfigure everything from scratch, you must take the time to configure your kernel. There are various dedicated interfaces in the kernel source directory that can be used by calling the make target command, where target is one of the values described below.
make menuconfig compiles and executes a text-mode interface (this is where the libncurses5-dev package is required) which allows navigating the options available in a hierarchical structure. Pressing the Space key changes the value of the selected option, and Enter validates the button selected at the bottom of the screen; Select returns to the selected sub-menu; Exit closes the current screen and moves back up in the hierarchy; Help will display more detailed information on the role of the selected option. The arrow keys allow moving within the list of options and buttons. To exit the configuration program, choose Exit from the main menu. The program then offers to save the changes you've made; accept if you are satisfied with your choices.
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.
When using one of those configuration interfaces, it is always a good idea to start from a reasonable default configuration. The kernel provides such configurations in arch/arch/configs/*_defconfig and you can put your selected configuration in place with a command like make x86_64_defconfig (in the case of a 64-bit PC) or make i386_defconfig (in the case of a 32-bit PC).

8.10.4. Kompilasi dan Membangun Paket

Once the kernel configuration is ready, a simple make deb-pkg will generate up to 5 Debian packages: linux-image-version that contains the kernel image and the associated modules, linux-headers-version which contains the header files required to build external modules, linux-firmware-image-version which contains the firmware files needed by some drivers (this package might be missing when you build from the kernel sources provided by Debian), linux-image-version-dbg which contains the debugging symbols for the kernel image and its modules, and linux-libc-dev which contains headers relevant to some user-space libraries like 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

Some modules are maintained outside of the official Linux kernel. To use them, they must be compiled alongside the matching kernel. A number of common third party modules are provided by Debian in dedicated packages, such as xtables-addons-source (extra modules for iptables) or oss4-source (Open Sound System, some alternative audio drivers).
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.
For example, let's look at the xtables-addons-source package: after installation, a .tar.bz2 of the module's sources is stored in /usr/src/. While we could manually extract the tarball and build the module, in practice we prefer to automate all this using DKMS. Most modules offer the required DKMS integration in a package ending with a -dkms suffix. In our case, installing xtables-addons-dkms is all that is needed to compile the kernel module for the current kernel provided that we have the linux-headers-* package matching the installed kernel. For instance, if you use linux-image-amd64, you would also install 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.