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.9 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.9 package has been installed. It contains /usr/src/linux-source-4.9.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.9.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.9.0-3-amd64 ~/kernel/linux-source-4.9/.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.9.30-ckt4-falcot_4.9.30-1_amd64.deb
../linux-image-4.9.30-ckt4-falcot_4.9.30-1_amd64.deb
../linux-image-4.9.30-ckt4-falcot-dbg_4.9.30-1_amd64.deb
../linux-libc-dev_4.9.30-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.12-0.1) ...
Loading new xtables-addons-2.12 DKMS files...
Building for 4.9.0-3-amd64
Building initial module for 4.9.0-3-amd64
Done.
xt_ACCOUNT:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/4.9.0-3-amd64/updates/dkms/
[...]
DKMS: install completed.
$
sudo dkms status
xtables-addons, 2.12, 4.9.0-3-amd64, x86_64: installed
$
sudo modinfo xt_ACCOUNT
filename: /lib/modules/4.9.0-3-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 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.