Pada chapter sebelumnya kita belajar membaca dan mengubah file .config. Sekarang kita jalankan perjalanan lengkapnya: mengunduh source kernel dari kernel.org, mengompilasi kernel sendiri, memasangnya berdampingan dengan kernel lama, lalu memilihnya saat boot. Proses ini butuh waktu berjam-jam dan ruang disk belasan gigabyte — tetapi tidak butuh keahlian khusus, hanya disiplin mengikuti urutan langkah. Perjalanan ini juga cara terbaik memahami bagaimana kernel benar-benar terbentuk dari source menjadi file yang dimuat bootloader.

Mengapa Mengompilasi Kernel Sendiri #

Untuk kebanyakan kebutuhan, kernel bawaan distribusi sudah lebih dari cukup. Alasan yang sah untuk mengompilasi sendiri biasanya salah satu dari ini:

  • Belajar — tidak ada cara lebih cepat memahami struktur kernel daripada melihat proses bangunnya baris demi baris.
  • Kernel minimal — perangkat embed atau container dengan ruang sangat terbatas membuang ribuan driver yang tak terpakai agar image kecil dan boot cepat.
  • Patch khusus — patch real-time, hardening khusus, atau fitur eksperimental yang belum masuk kernel rilis distribusi.
  • Debugging — mengaktifkan opsi debug seperti KASAN untuk menelusuri galat driver.

Perlu dicatat bahwa jalur lama berbasis paket kernel-package dan fakeroot sudah lama ditinggalkan; prosedur modern cukup memakai make bawaan kernel, dan itulah yang kita ikuti di sini.

Menyiapkan Perangkat dan Kode Sumber #

Di Debian dan turunannya, perangkat build disiapkan sekali dengan manajer paket:

bash
sudo apt install build-essential libncurses-dev flex bison \
     libssl-dev libelf-dev dwarves

Daftar lengkap versi minimal tiap alat dipelihara di dokumentasi kebutuhan build kernel . Selanjutnya unduh rilis stabil dari kernel.org — file linux-6.x.y.tar.xz berukuran sekitar 140 MB — lalu ekstrak ke direktori kerja:

bash
tar -xf linux-6.12.4.tar.xz
cd linux-6.12.4

Perintah di atas memerlukan unduhan dan root sehingga tidak bisa dijalankan di lingkungan latihan; urutan prosesnya tetap kita ikuti tuntas di bawah.

Prosedur Kompilasi Langkah demi Langkah #

Seluruh proses berlangsung dari dalam direktori source kernel. Setiap langkah dijabarkan beserta perannya:

  1. Salin konfigurasi lama: cp /boot/config-$(uname -r) .config — mengambil opsi kernel yang sedang berjalan sebagai titik awal, sehingga kernel baru hampir pasti tetap bisa boot di hardware kita.
  2. Perbarui ke skema opsi baru: make olddefconfig — versi kernel baru menambah dan membuang opsi; langkah ini menjawab semua pertanyaan baru dengan nilai bawaan tanpa interaksi.
  3. Sesuaikan opsi: make menuconfig — buka antarmuka dari chapter kernel configuration lalu ubah opsi yang diperlukan.
  4. Beri nama versi lokal: isi Local version di menu General setup (atau scripts/config --set-str LOCALVERSION "-budi") — akhiran -budi memisahkan kernel buatan sendiri dari kernel distro, terlihat pada uname -r dan seluruh nama file di /boot serta /lib/modules.
  5. Kompilasi: make -j$(nproc) — membangun kernel dan modul secara paralel sebanyak jumlah core CPU; nproc menghitung core secara otomatis.
  6. Pasang modul: sudo make modules_install — menyalin semua .ko ke /lib/modules/6.12.4-budi/ sehingga modprobe menemukannya.
  7. Pasang kernel: sudo make install — menyalin vmlinuz, System.map, dan config ke /boot, lalu di Debian otomatis menjalankan update-initramfs dan update-grub; kita tidak perlu mengedit bootloader secara manual.
  8. Boot kernel baru: sudo reboot, lalu pilih entri kernel baru di menu GRUB; verifikasi dengan uname -r yang kini berakhiran -budi.

Waktu kompilasi berjalan 20 menit pada mesin 16 core hingga beberapa jam pada laptop tua; ruang kerja yang dibutuhkan source, object file, dan modul mencapai 15–25 GB. Sambil menunggu, log build bisa diikuti untuk melihat bagaimana kernel terbentuk.

Membaca Log Kompilasi #

File log-build.txt pada bundle chapter ini berisi potongan log make yang disederhanakan:

bash
cat log-build.txt

Output yang Dihasilkan:

text
  UPD     include/config/kernel.release
  GEN     Makefile
  CALL    scripts/checksyscalls.sh
  CC      init/main.o
  CC      init/version.o
  LD      init/built-in.a
  CC      kernel/fork.o
  CC      kernel/sched/core.o
  LD      vmlinux
  SORTTAB vmlinux
  OBJCOPY arch/x86/boot/compressed/vmlinux.bin
  Kernel: arch/x86/boot/bzImage is ready

Baris-baris di atas menceritakan tahap akhir pembentukan kernel. Prefix CC berarti satu file C selesai dikompilasi menjadi object; LD merangkai object-object menjadi arsip built-in.a; saat baris LD vmlinux muncul, kernel utuh (belum terkompresi, bisa ratusan MB) sudah terhubung menjadi satu. Tahap OBJCOPY kemudian memotong dan menyalinnya menjadi vmlinux.bin, dan baris pamungkas — Kernel: arch/x86/boot/bzImage is ready — menandakan image kernel terkompresi siap dipakai. Inilah file yang oleh prosedur make install disalin ke /boot dengan nama vmlinuz.

Artefak yang Muncul di /boot #

Proses make install menaruh empat file di /boot. Karena langkah tersebut membutuhkan root yang tidak tersedia di lingkungan latihan, kita buat replika namanya untuk mempelajari skemanya:

bash
mkdir -p boot-latihan
touch "boot-latihan/vmlinuz-6.12.4-budi" "boot-latihan/System.map-6.12.4-budi" \
      "boot-latihan/config-6.12.4-budi" "boot-latihan/initrd.img-6.12.4-budi"
ls boot-latihan

Output yang Dihasilkan:

text
System.map-6.12.4-budi
config-6.12.4-budi
initrd.img-6.12.4-budi
vmlinuz-6.12.4-budi

Peran tiap file pada pola nama <nama>-<versi>-<akhiran lokal>:

FileIsi
vmlinuz-6.12.4-budiimage kernel terkompresi (bzImage) yang dimuat GRUB ke memori
System.map-6.12.4-buditabel alamat simbol kernel — rujukan alat debugging seperti klogd
config-6.12.4-budisalinan .config yang dipakai membangun kernel ini — sumber audit
initrd.img-6.12.4-budiinitramfs awal yang memuat driver sebelum root filesystem aktif

Initramfs dan cara kerjanya saat boot sudah kita bahas tuntas pada chapter initramfs , dan mekanisme GRUB memilih entri pada chapter bootloader dan GRUB .

Mengompilasi kernel menuntun kita menyentuh titik paling dalam sistem operasi. Selanjutnya kita kembali ke level proses dengan pertanyaan operasional sehari-hari: bagaimana mencegah satu layanan aplikasi memakan seluruh CPU dan memori server? Jawabannya adalah cgroups, yang kita bedah pada chapter berikutnya.