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

Like anything that can be useful on a Debian system, the Linux kernel sources are available in a package. To retrieve them, just install the linux-source-version package. The apt search ^linux-source command lists the various kernel versions packaged by Debian. The latest version is available in the Unstable distribution: you can retrieve them without much risk (especially if your APT is configured according to the instructions of Bagian 6.2.6, “Bekerja dengan Beberapa Distribusi”). Note that the source code contained in these packages does not correspond precisely with that published by Linus Torvalds and the kernel developers; like all distributions, Debian applies a number of patches, which might (or might not) find their way into the upstream version of Linux. These modifications include backports of fixes/features/drivers from newer kernel versions, new features not yet (entirely) merged in the upstream Linux tree, and sometimes even Debian specific changes.
The remainder of this section focuses on the 4.19 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-4.19 package has been installed. It contains /usr/src/linux-source-4.19.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-4.19.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-4.19.0-5-amd64 ~/kernel/linux-source-4.19/.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-4.19.37-falcot_4.19.37-1_amd64.deb
../linux-image-4.19.37-falcot_4.19.37-1_amd64.deb
../linux-libc-dev_4.19.37-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 vpb-driver-source (extra modules for Voicetronix telefony hardware) or leds-alix-source (driver of PCEngines ALIX 2/3 boards).
These packages are many and varied, apt-cache rdepends module-assistant$ can show the list provided by Debian. However, a complete list isn't particularly useful since there is no particular reason for compiling external modules except when you know you need it. In such cases, the device's documentation will typically detail the specific module(s) it needs to function under Linux.
For example, let's look at the dahdi-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 dahdi-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 dahdi-dkms

[...]
Setting up xtables-addons-dkms (2.12-0.1) ...
Loading new xtables-addons-2.12 DKMS files...
Building for 4.19.0-5-amd64
Building initial module for 4.19.0-5-amd64
Done.

dahdi_dummy.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/4.19.0-5-amd64/updates/dkms/
[...]
DKMS: install completed.
$ sudo dkms status
dahdi, DEB_VERSION, 4.19.0-5-amd64, x86_64: installed
$ sudo modinfo dahdi_dummy
filename:       /lib/modules/4.19.0-5-amd64/updates/dkms/dahdi_dummy.ko
license:        GPL v2
author:         Robert Pleh <robert.pleh@hermes.si>
description:    Timing-Only Driver
[...]

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 sometimes provides some of these patches in linux-patch-* packages, but they often don't make it into stable releases (sometimes for the very same reasons that they are not merged into the official upstream kernel). These packages install files in the /usr/src/kernel-patches/ directory.
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-4.9
$ make clean
$ zcat /usr/src/kernel-patches/diffs/grsecurity2/grsecurity-3.1-4.9.11-201702181444.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.