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 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.
Kita asumsikan paket linux-source-5.10 telah terpasang. Ini berisi /usr/src/linux-source-5.10.tar.xz
, sebuah arsip sumber kernel yang dikompresi. 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-5.10.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.
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-5.10.0-8-amd64 ~/kernel/linux-source-5.10/.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 (2.8.4-3) ...
Setting up linux-headers-5.10.0-8-amd64 (5.10.46-4) ...
/etc/kernel/header_postinst.d/dkms:
dkms: running auto installation service for kernel 5.10.0-8-amd64:.
Setting up dahdi-dkms (1:2.11.1.0.20170917~dfsg-7.4) ...
Loading new dahdi-2.11.1.0.20170917~dfsg-7.4 DKMS files...
Building for 5.10.0-8-amd64
Building initial module for 5.10.0-8-amd64
Done.
dahdi_dummy.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/5.10.0-8-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/5.10.0-8-amd64/updates/dkms/
[...]
DKMS: install completed.
$
sudo dkms status
dahdi, 2.11.1.0.20170917~dfsg-7.4, 5.10.0-8-amd64, x86_64: installed
$
sudo modinfo dahdi_dummy
filename: /lib/modules/5.10.0-8-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: 5.10.0-8-amd64 SMP mod_unload modversions
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.