Membuat Distro Linux Minimalis dari 0
Kali ini kita akan membangun OS Linux sendiri dari 0 atau bahasa kerennya from scratch jadi teman-teman yang mau belajar ngoprek Linux bisa mengikuti tutorial ini step by step.
Prasyarat:
Pada praktek kali ini saya menggunakan:
- Distro Linux Ubuntu 24 sebagai OS Host untuk Development. Saya menyarankan menggunakan Virtualization saja baik itu Docker, Mesin Virtual (seperti Virtual Box / VMWare) atau WSL jika anda menggunakan Windows, agar jika terjadi error yang tidak diinginkan, tidak mempengaruhi OS utama anda.
- Koneksi Internet. Dibutuhkan untuk mendownload dependency.
1️⃣ Install Dependency
apt install bzip2 git vim make gcc libncurses-dev flex bison bc cpio libelf-dev libssl-dev syslinux dosfstools
2️ ⃣ Clone Linux Repository
Clone Linux repository, disini saya tidak menclone seluruh riwayat git melainkan commit terakhir saja.
git clone --depth 1 https://github.com/torvalds/linux.git
3️⃣ Konfigurasi Kernel
cd linux
make menuconfig

- Pilih 64-bit kernel -> exit
- Compile, dengan membagi job menjadi 8, sesuaikan dengan core prosesor computer kita.
make -j 8
- Jika sukses pada akhir proses muncul pesan:
Kernel: arch/x86/boot/bzImage is ready
- Copy
bzImage:
mkdir /boot-files
cp arch/x86/boot/bzImage /boot-files/
4️⃣ Install Busybox
Sampai tahap ini kita baru mempunyai kernel, tapi belum mempunyai tools/utility yang membranal menjadi OS yang utuh. Salah satu aplikasi yang bisa kita gunakan adalah Busybox. BusyBox adalah sebuah utility, ataulebih tepatnya adalah sebuah koleksi dari berbagai utility (alat bantu) sistem operasi Unix/Linux yang digabungkan ke dalam satu file tunggal. BusyBox bukanlah sebuah sistem operasi yang lengkap secara mandiri, melainkan sebuah aplikasi di ruang pengguna (userspace).
Untuk bisa berfungsi, BusyBox harus dijalankan pada sistem yang sudah memiliki kernel (paling sering Linux, tetapi bisa juga Android atau FreeBSD). Tanpa kernel, BusyBox tidak bisa berinteraksi dengan perangkat keras komputer atau ponsel.
Pasangan Sempurna: Dalam pembuatan sistem minimalis (seperti router atau sistem embedded), developer biasanya menggabungkan Kernel Linux + BusyBox. Kombinasi ini sudah cukup untuk membuat sebuah perangkat berfungsi dan bisa menerima perintah dari user.
-
Berikut adalah poin penting mengapa BusyBox disebut sebagai utility:
- Multi-Utility Program: BusyBox merupakan satu file biner yang bertindak seperti ratusan utility berbeda. Di dalamnya terdapat versi ringkas dari perintah-perintah umum seperti
ls,cp,mv,grep, danmkdir. - Menyediakan Perintah Dasar: Tanpa BusyBox, sistem yang sangat kecil (seperti router atau perangkat Android tertentu) mungkin tidak memiliki perintah dasar untuk mengelola file atau jaringan.
- Applets: Setiap utility di dalam BusyBox disebut sebagai "applet". Applet ini dirancang untuk menggunakan kode yang sama secara bersama-sama sehingga ukurannya sangat efisien (sekitar 1–5 MB saja).
- Penggunaan yang Praktis: BusyBox masih menjadi utility standar dalam infrastruktur modern seperti Docker containers dan distro Linux ringan seperti Alpine Linux untuk menjaga sistem tetap ramping.
- Multi-Utility Program: BusyBox merupakan satu file biner yang bertindak seperti ratusan utility berbeda. Di dalamnya terdapat versi ringkas dari perintah-perintah umum seperti
-
Clone Busybox
git clone --depth 1 https://git.busybox.net/busybox
- Konfigurasi:
cd busybox
make menuconfig

- Select
Settings-> Pada Build Options centangBuild static binary (no shared libs)->Exit. Cara untuk mengatur agar tidak tergantung pada library external.
Pada kernel Linux modern, dukungan untuk CBQ (Class Based Queueing) telah dihapus dari header sistem, sedangkan BusyBox versi lama masih mencoba mengompilasi fitur tersebut melalui utilitas tc
Untuk mengatasi itu:
- Navigasi ke:
Networking Utilities---> Cari itemtc(utilitas trafic control). - Hapus tanda centang (tekan
N) untuk menonaktifkan fitur tersebut
- Compile
make -j 8
initramfsadalah tempat kernel akan me-load file system setelah booting, jadi kita akan memasukan / put Busybox kedalam direkori/boot/initrams
mkdir /boot-files/initramfs
make CONFIG_PREFIX=/boot-files/initramfs install
5️⃣ Konfigurasi Boot
- Pindah ke direktori
bootinitramfs:
cd /boot-files/initramfs/
- Terdapat beberapa direktori:
ls
bin init sbin usr
- Kita akan memanggil shell ketika kernel memulai
initramfs, kernel akan mencariinitfile, jadi disini saya akan membuatinitfile yang akan memanggilsheel. Fun fact kita akan menggunakanshelluntuk memanggilshell:
vim init
- Isi file dengan kode:
#!/bin/sh
/bin/sh
- Berikan permission:
chmod +x init
- File
linuxrcadalah skrip inisialisasi awal yang menjembatani antara pemuatan Kernel dan masuknya kita ke dalam sistem operasi lengkap. Di sistem modern, fungsinya telah diambil alih oleh file/initdi dalaminitramfs. Disini kita akan menghapuslinuxrc:
rm linuxrc
- Kita akan membuat archive
.cpiountuk mengemas semua yang dibutuhkaninitramfsyang didukung kernel. Kita akan menggunakan perintahfindlalu mencompress-nya dengan namainit.cpio:
find . | cpio -o -H newc > ../init.cpio
Perintah tersebut di atas digunakan untuk mengemas (archive) seluruh isi direktori initramfs menjadi satu file binary agar bisa dibaca oleh kernel Linux saat proses booting.
Berikut adalah penjelasan detail per komponennya:
find: Perintah ini mencari dan menampilkan daftar semua file dan folder di dalam direktori saat ini secara rekursif (termasuk semua sub-folder di dalamnya). Titik.menandakan direktori tempat Anda berada sekarang (yang berisi BusyBox dan struktur folderbin,dev,proc, dll).|(Pipe): Simbol garis tegak ini berfungsi untuk mengirimkan daftar file yang ditemukan olehfindtadi sebagai input ke perintah berikutnya (cpio).cpio -o -H newcIni adalah perintah inti untuk membuat arsip:-o(copy-out): Instruksi untuk membuat file arsip dari daftar file yang diterima.-H newc: Ini adalah bagian yang paling krusial. Argumen ini menentukan format arsip yang digunakan. Formatnewcadalah standar yang dipahami oleh kernel Linux untukinitramfs. Jika Anda tidak menggunakan format ini, kernel tidak akan bisa mengekstrak isinya saat booting.
> ../init.cpio: Simbol>mengarahkan output (hasil pengemasan) ke sebuah file baru. Dalam kasus ini, file tersebut dinamaiinit.cpiodan diletakkan satu folder di atas direktori saat ini (../).
File init.cpio inilah yang nantinya Anda panggil di konfigurasi bootloader (seperti Syslinux atau GRUB) sebagai initrd agar sistem operasi bisa berjalan.
Seringkali setelah menjadi .cpio, file tersebut dikompres lagi agar ukurannya lebih kecil menggunakan perintah gzip, misalnya:
find . | cpio -o -H newc | gzip > ../init.cpio.gz
6️⃣ Membuat Boot Loader
Kita akan melakukan konfigurasi bootloader dengan syslinux:
- Pindah ke direktori boot
cd /boot-files
- Install syslinux:
apt install syslinux
- Membuat file boot:
dd if=/dev/zero of=boot bs=1M count=50
Perintah tersebut digunakan untuk membuat sebuah file kosong sebesar 50 Megabyte (MB) yang nantinya akan digunakan sebagai virtual disk atau citra (image) untuk bootloader.
-
Berikut adalah penjelasan detail per bagian dari perintah tersebut:
dd: Merupakan singkatan dari Data Duplicator. Ini adalah line tools perintah untuk menyalin dan mengonversi data pada level byte.if=/dev/zero: (if= Input File). Sumber datanya berasal dari/dev/zero, sebuah file perangkat khusus di Linux yang menghasilkan aliran data bernilai nol (kosong) terus-menerus.of=boot: (of= Output File). Nama file yang akan dibuat adalah "boot". File inilah yang akan menjadi wadah sistem atau initramfs kita nanti.bs=1M: (bs= Block Size). Menentukan ukuran setiap blok data sebesar 1 Megabyte.count=50: Ini menentukan berapa kali blok tersebut ditulis.- Jika
bs=1Mdancount=50, maka total ukuran file adalah 50 MB.
Mengapa ini dilakukan saat membuat Bootloader/Initramfs?
-
Dalam konteks penggunaan Syslinux, langkah-langkah yang biasanya kita lakukan setelah perintah di atas adalah:
- Memformat file tersebut: Memberikan sistem berkas (misal FAT32) ke file boot tersebut menggunakan perintah
mkfs.vfat. - Menginstal Syslinux: Memasukkan kode bootloader ke dalam file tersebut agar bisa "booting".
- Mengisi file: Memasukkan kernel Linux dan file BusyBox (initramfs) yang sudah kita buat sebelumnya ke dalam file image ini.
- Memformat file tersebut: Memberikan sistem berkas (misal FAT32) ke file boot tersebut menggunakan perintah
-
Jika kita melihat isi direktori, maka akan ada file image
bootyang baru dibuat.
ls
boot bzImage init.cpio initramfs
- Sejauh ini file tersebut masih kosong, kita akan memasukan file system ke dalamnya, disini kita akan menggunakan filesystem FAT, karena filesystem tersebut disupport syslinux. Untuk itu kita akan menginstall
dosfstools:
apt install dosfstools
- Membuat file system (format) FAT pada file atau partisi bernama "boot".
mkfs -t fat boot
- Menginstal bootloader Syslinux ke dalam file atau partisi bernama "boot" yang sebelumnya sudah kita format
syslinux boot
- Sampai tahap ini file
bootsudah siap untuk di boot, jadi ini akan langsung melakukan boot terhadap syslinux. Tapi kita masih perlu menyalin Kernel dan Initramfs ke dalam imagesboot. Untuk melakukan copy file yang dibutuhkan ke dalam imagesbootcaranya sangat mudah:
-
Membuat direktori temporary untuk melakukan
mount. Contoh direktori dengan namam.mkdir m -
Mount
bootke dalam direktori tersebut:mount boot m -
Copy file yang dibutuhkan ke dalam direktori tersebut:
cp bzImage init.cpio m -
Unmount:
umount m
7️⃣ Testing OS
Untuk melakukan testing kita bisa menggunakan qemu sebagai virtual manchine. Sebelum instalasi, pastikan prosesor anda mendukung virtualisasi (VT-x atau AMD-V). Jalankan perintah:
egrep -c '(vmx|svm)' /proc/cpuinfo
Jika hasilnya lebih dari 0, berarti sistem kita mendukung virtualisasi.
- Install Qemu
sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager virtinst -y
Verifikasi Instalasi: Pastikan services libvirtd berjalan dengan benar:
systemctl status libvirtd
Jika mesin virtual dijalankan tanpa akses root setiap saat, masukkan user ke grup libvirt dan kvm.
sudo adduser $USER libvirt
sudo adduser $USER kvm
- Menjalankan OS kita dengan Qemu:
qemu-system-x86_64 boot
- Masukan perintah di bawah ini pada bagian
boot:untuk masuk ke booting OS:
/bzImage -initrd=/init.cpio


Selamat Distro Linux Sederhana anda sudah berjalan, tentunya ini hanya sebagai media untuk belajar (educational purpose) atau sekedar hobi saja bukan untuk production. Dan pasti masih banyak yang perlu diperbaiki, teman-teman bisa oprek lebih luas lagi untuk pengembangannya.