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

Unsurprisingly, Debian manages the kernel in the form of a package, which is not how kernels have traditionally been compiled and installed. Since the kernel remains under the control of the packaging system, it can then be removed cleanly, or deployed on several machines. Furthermore, the scripts associated with these packages automate the interaction with the bootloader and the initrd generator.
Sumber Linux hulu berisi apapun yang diperlukan untuk membangun sebuah paket kernel Debian. Namun Anda masih perlu memasang build-essential untuk memastikan bahwa Anda memiliki peralatan yang diperlukan untuk membangun sebuah paket Debian. Lebih jauh, langkah konfigurasi untuk kernel memerlukan paket libncurses-dev (sebelumnya libncurses5-dev, yang kini adalah sebuah paket transisi). 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 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.
Sisa bagian ini difokuskan pada kernel Linux versi 5.10, namun contohnya tentu saja dapat diadaptasi ke versi kernel tertentu yang Anda inginkan.
We assume the linux-source-5.10 package has been installed. It contains /usr/src/linux-source-6.1.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-6.1.tar.xz
Untuk membangun kernel dari sumber murni, cukup unduh tarball versi pilihan Anda dari kernel.org, verifikasi integritas setelah mengimpor kunci pengelola kernel, lalu lanjutkan seperti yang dijelaskan dalam bab-bab berikut.

$ wget https://kernel.org/pub/linux/kernel/v6.x/linux-6.1.99.tar.xz
[..]
$ wget https://kernel.org/pub/linux/kernel/v6.x/linux-6.1.99.tar.sign
[..]
$ unxz -c linux-6.1.99.tar.xz | gpg --verify linux-6.1.99.tar.sign -
gpg: Signature made Mon 15 Jul 2024 03:24:49 AM EDT
gpg:                using RSA key 647F28654894E3BD457199BE38DBBDC86092693E
gpg: Good signature from "Greg Kroah-Hartman <gregkh@linuxfoundation.org>" [unknown]
gpg:                 aka "Greg Kroah-Hartman <gregkh@kernel.org>" [unknown]
gpg:                 aka "Greg Kroah-Hartman (Linux kernel stable release signing key) <greg@kroah.com>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 647F 2865 4894 E3BD 4571  99BE 38DB BDC8 6092 693E

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 awal, 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. Pastikan telah membaca bilah sisi TIPS debian/certs/debian-uefi-certs.pem yang hilang dalam kasus ini.
$ cp /boot/config-6.1.0-21-amd64 ~/kernel/linux-source-6.1/.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 libncurses-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; seperti make xconfig yang menggunakan antarmuka grafis Qt, dan make gconfig yang menggunakan GTK+. Yang pertama memerlukan qtbase5-dev, sedangkan yang kedua 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

Setelah konfigurasi kernel siap, sekadar menjalankan make deb-pkg akan menghasilkan hingga 5 paket Debian:
linux-image-versi
berisi image kernel dan modul-modul terkait,
linux-headers-versi
berisi berkas-berkas header yang diperlukan untuk membangun modul eksternal,
linux-firmware-image-versi
berisi berkas-berkas firmware yang dibutuhkan oleh beberapa driver (paket ini mungkin kurang ketika Anda membangun dari sumber kernel yang disediakan oleh Debian),
linux-image-versi-dbg
berisi simbol debug untuk image kernel dan modulnya (hanya dibuat jika CONFIG_DEBUG_INFO=y), dan
linux-libc-dev
berisi header yang relevan dengan beberapa pustaka ruang pengguna seperti GNU glibc.
version didefinisikan dengan menyambung 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 yang ditambahkan, yang secara reguler dinaikkan (dan disimpan dalam .version), kecuali jika Anda menimpanya dengan variabel lingkungan KDEB_PKGVERSION.
$ make deb-pkg LOCALVERSION=-falcot KDEB_PKGVERSION=$(make kernelversion)-1
[...]
$ ls ../*.deb
../linux-headers-5.10.46-falcot_5.10.46-1_amd64.deb
../linux-image-5.10.46-falcot_5.10.46-1_amd64.deb
../linux-image-5.10.46-falcot-dbg_5.10.46-1_amd64.deb
../linux-libc-dev_5.10.46-1_amd64.deb
Seluruh proses membutuhkan sekitar 20 GB ruang kosong, setidaknya 8 GB RAM, dan beberapa jam kompilasi (menggunakan satu core) untuk kernel Debian amd64 standar. Persyaratan ini dapat dikurangi secara drastis dengan menonaktifkan informasi debug menggunakan CONFIG_DEBUG_INFO=n, tetapi ini akan membuat tidak mungkin untuk melacak kesalahan kernel ("oops") menggunakan gdb dan juga menghentikan pembuatan paket linux-image-version-dbg.

8.10.5. Kompilasi Modul Eksternal

Beberapa modul dikelola di luar kernel Linux resmi. Untuk menggunakannya, mereka harus dikompilasi bersama dengan kernel yang cocok. Beberapa modul pihak ketiga yang umum disediakan oleh Debian dalam paket khusus, seperti vpb-driver-source (modul-modul ekstra untuk perangkat keras teleponi Voicetronix) atau leds-alix-source (driver papan PCEngines ALIX 2/3).
Paket-paket ini ada banyak dan bervariasi, perintah apt-cache rdepends module-assistant$ dapat menampilkan daftar yang disediakan oleh Debian. Akan tetapi, daftar yang lengkap terkadang tidak berguna karena ada alasan khusus untuk mengompilasi modul eksternal kecuali ketika Anda tahu Anda memerlukannya. Dalam kasus tersebut, dokumentasi perangkat keras akan secara khas merinci modul spesifik yang diperlukannya agar berfungsi di Linux.
Misalnya, mari lihat pada paket dahdi-source: setelah instalasi, sebuah sumber modul .tar.bz2 tersimpan di /usr/src/. Walaupun kita dapat mengekstrak secara manual berkas tarball tersebut dan membangun modul, dalam prakteknya kita lebih memilih untuk mengotomatisasi semua ini menggunakan kerangka kerja DKMS (Dynamic Kernel Module Support). Kebanyakan modul menawarkan integrasi DKMS yang diperlukan dalam sebuah paket yang diakhiri dengan akhiran -dkms. Dalam kasus kita, hanya perlu memasang dahdi-dkms untuk mengompilasi modul kernel bagi kernel saat ini asal telah tersedia paket linux-headers-* yang cocok dengan kernel yang terpasang. Umpamanya, jika Anda menggunakan linux-image-amd64, Anda juga perlu memasang linux-headers-amd64.
$ sudo apt install dahdi-dkms
[...]
Setting up dkms (3.0.10-8+deb12u1) ...
Setting up linux-compiler-gcc-12-x86 (6.1.99-1) ...
Setting up fxload (0.0.20081013-2) ...
Setting up linux-headers-6.1.0-23-common (6.1.99-1) ...
Setting up linux-kbuild-6.1 (6.1.99-1) ...
Setting up dahdi-dkms (1:2.11.1.0.20170917~dfsg-8.4) ...
Loading new dahdi-2.11.1.0.20170917 DKMS files...
Building for 6.1.0-23-amd64
Building initial module for 6.1.0-23-amd64
Done.

dahdi_dummy.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/6.1.0-23-amd64/updates/dkms/

dahdi_dynamic_eth.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/6.1.0-23-amd64/updates/dkms/

[..]
depmod...
Setting up dahdi-linux (1:2.11.1.0.20170917~dfsg-8.4) ...
Setting up linux-headers-6.1.0-23-amd64 (6.1.99-1) ...
/etc/kernel/header_postinst.d/dkms:
dkms: running auto installation service for kernel 6.1.0-23-amd64.
dkms: autoinstall for kernel: 6.1.0-23-amd64.
Setting up linux-headers-amd64 (6.1.99-1) ...
Processing triggers for man-db (2.11.2-2) ...

$ sudo dkms status
dahdi/2.11.1.0.20170917, 6.1.0-23-amd64, x86_64: installed
$ sudo modinfo dahdi_dummy
 filename:       /lib/modules/6.1.0-23-amd64/updates/dkms/dahdi_dummy.ko
license:        GPL v2
author:         Robert Pleh <robert.pleh@hermes.si>
description:    Timing-Only Driver
depends:        dahdi
retpoline:      Y
name:           dahdi_dummy
vermagic:       6.1.0-23-amd64 SMP preempt mod_unload modversions 
sig_id:         PKCS#7
signer:         DKMS module signing key
sig_key:        69:A6:CA:D5:86:6A:FE:F4:A8:04:6A:31:8B:AB:E1:07:88:BA:45:C7
sig_hashalgo:   sha256
signature:      9B:F9:8E:38:4D:06:A6:20:52:33:D9:AE:9D:B9:83:17:BB:5A:18:F1:
		F2:5B:F3:12:06:0A:1D:48:C3:BA:89:2C:40:64:1C:2C:52:7C:46:BE:
		27:49:F5:55:42:1B:71:38:A2:1B:FA:58:BB:CE:7C:70:2C:EC:37:7B:
		65:91:A1:E7:23:6E:B6:92:9D:B9:20:43:F5:39:7F:95:CA:36:DC:C0:
		DA:82:49:AC:21:69:65:DF:5D:0F:C5:8F:E5:E6:92:76:F1:DD:18:7E:
		91:D2:DC:43:86:CA:5B:66:7C:FF:AE:EA:F9:06:F8:55:4A:1F:C0:56:
		8B:F7:6C:9E:77:35:9B:E0:14:9D:C4:68:D8:5E:FD:3F:53:73:F1:B6:
		12:67:9E:F4:68:48:C8:A7:80:69:42:01:83:52:D8:EF:54:FE:11:E4:
		63:3C:6F:B3:B6:BF:E9:4F:DF:52:C4:A7:6B:35:D6:3B:C9:E2:FD:48:
		70:41:D1:D1:68:4C:D4:12:7F:CB:7D:92:E5:E6:79:4A:5B:5E:7C:38:
		1D:98:B2:EF:0E:F3:8D:07:1B:51:75:2A:58:2E:F2:53:BA:6A:79:F5:
		AD:D1:12:08:E1:15:EC:5C:7A:CF:99:A2:9B:DB:BB:C0:EE:BD:C0:96:
		77:92:D7:CC:68:14:A2:61:E0:F2:65:64:54:70:B8:73
parm:           debug:int

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 kadang mendistribusikan beberapa patch ini dalam paket linux-patch-*, tapi seringkali mereka tidak mencapai rilis stabil (kadang untuk alasan yang sama dengan mengapa mereka tidak digabung ke dalam kernel hulu resmi). Paket ini menginstall berkas dalam direktori /usr/src/kernel-patches/.
Untuk menerapkan satu atau lebih patch yang terpasang ini, gunakan perintah patch dalam direktori sumber kemudian mulai kompilasi kernel sebagaimana dijelaskan di atas. Berikut ini menunjukkan contoh lama menggunakan linux-patch-grsecurity2 dan linux-source-4.9.
$ 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.