- Menjelaskan langkah demi langkah proses membuat “distro Linux mikro” dengan membangun kernel Linux secara langsung dan menyusun ruang pengguna seminimal mungkin
- Membahas dari dasar peran kernel sistem operasi, komponen penyusun distro Linux, serta hubungan antara kernel dan ruang pengguna
- Menggunakan arsitektur RISC-V (mesin
riscv64 virt di QEMU) sebagai contoh, tetapi prinsip yang sama juga dapat diterapkan pada arsitektur lain seperti x86
- Membangun lingkungan Linux minimal yang benar-benar dapat dijalankan yang mencakup proses
init, initramfs, dan shell sederhana yang ditulis dengan Go
- Terakhir, memperkenalkan cara membuat distro mikro yang benar-benar berguna dengan proyek
u-root, lalu menutupnya sebagai panduan pengantar untuk membantu memahami keseluruhan struktur sistem Linux
Apa itu kernel sistem operasi
- Kernel adalah komponen inti sistem operasi yang bertanggung jawab atas pengelolaan sumber daya perangkat keras dan pengendalian eksekusi program
- Bahkan di lingkungan single-core, kernel menyediakan fungsi pengelolaan multitasking yang membuat banyak program tampak berjalan secara bersamaan
- Kernel mengabstraksikan kontrol perangkat I/O sehingga aplikasi tidak perlu menangani langsung alamat perangkat keras atau nilai register yang rinci
- Misalnya, program cukup meminta untuk “menulis pesan ke keluaran standar”, dan kernel yang menangani interaksi dengan perangkat keras sebenarnya
- Kernel menyediakan cara akses data tingkat tinggi melalui antarmuka filesystem
- File bukan sekadar data di disk, tetapi berfungsi sebagai antarmuka logis untuk berkomunikasi dengan kernel
- Kernel menyediakan isolasi antarproses dan model komunikasi, sehingga setiap aplikasi dapat berjalan secara mandiri atau bekerja sama
- Kernel Linux bersifat open source, dapat berjalan di berbagai arsitektur, dan merupakan salah satu kernel yang paling luas digunakan di seluruh dunia
Apa itu distro Linux
- Dengan kernel Linux saja, pengguna tidak bisa menjalankan browser web atau aplikasi GUI; diperlukan beberapa lapisan infrastruktur perangkat lunak di atas kernel
- Pengaturan jaringan, alokasi IP, pengelolaan VPN, dan sebagainya ditangani oleh program ruang pengguna tingkat atas, bukan oleh kernel
- Karena itu, distro Linux didefinisikan sebagai gabungan kernel + infrastruktur ruang pengguna
- Distro mencakup paket, alat, konfigurasi, proses inisialisasi (
init), dan lainnya di atas fungsi dasar yang disediakan kernel
- Tingkat kompleksitas distro beragam, dari konfigurasi minimal seperti Arch Linux hingga konfigurasi yang ramah pengguna seperti Ubuntu
Infrastruktur di luar kernel: ruang pengguna dan proses init
- Setelah kernel selesai booting, hal pertama yang dijalankan adalah proses
init dengan PID 1
init adalah leluhur semua proses ruang pengguna berikutnya, yang menjalankan layanan dan alat sistem secara berurutan
- Kumpulan berbagai proses dan alat yang dijalankan oleh
init adalah komponen nyata penyusun distro Linux
- Semakin kompleks sebuah distro, semakin banyak fungsi yang tidak perlu menumpuk sehingga kadang dikritik sebagai “bloated”
- Sebaliknya, dengan membuat distro mikro kustom, kita dapat membangun sistem ringan yang hanya memuat fungsi minimum
Membangun kernel Linux untuk RISC-V
- Membangun kernel untuk RISC-V di lingkungan
x86 dengan menggunakan toolchain cross-compilation
- Unduh source
linux-6.5.2.tar.xz dari kernel.org, lalu jalankan make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- defconfig
- Pengaturan kernel dapat diedit secara visual melalui
menuconfig
- Setelah build paralel dengan
make -j16, akan dihasilkan arch/riscv/boot/Image
- Boot di QEMU dengan
qemu-system-riscv64 -machine virt -kernel arch/riscv/boot/Image
- Dari log boot, dapat dilihat pesan seperti deteksi lapisan SBI, inisialisasi UART, dan aktivasi printk
Hambatan pertama: tidak ada root filesystem
- Saat booting kernel, terjadi kernel panic dengan error
VFS: Unable to mount root fs
- Penyebabnya: root filesystem (
initramfs) tidak disediakan
- Filesystem tidak hanya bisa dibangun di disk, tetapi juga berbasis RAM (
initramfs)
initramfs dikemas dalam format cpio, dan di QEMU dapat dimuat dengan opsi -initrd
Membangun initramfs dan menjalankan “Hello world”
- Kebutuhan minimum adalah adanya biner
/init
- Tulis
init.c lalu build dengan static link (-static)
- Kemas dengan
cpio -o -H newc < file_list.txt > initramfs.cpio
- Saat dijalankan di QEMU, muncul output “Hello world”, lalu terjadi kernel panic lagi karena
init selesai
- Solusinya: tambahkan loop tak berujung agar
init tidak berhenti
Menambahkan shell sederhana yang ditulis dengan Go
init menjalankan /little_shell menggunakan fork dan execl
little_shell.go adalah shell sederhana yang menerima input pengguna dan menggemakan output perintah
- Build untuk RISC-V dengan
GOOS=linux GOARCH=riscv64 go build little_shell.go
init dan little_shell sama-sama berbagi output melalui UART
- Input/output standar dikelola sebagai file handle dan diwariskan saat
fork
- Hasilnya, tercipta lingkungan Linux dasar dengan output “Hello from init” dan input shell yang saling muncul bergantian
Ringkasan peran kernel
- Abstraksi perangkat keras: program pengguna dapat menampilkan output tanpa perlu mengetahui detail UART atau perangkat
- Penyediaan antarmuka tingkat tinggi: akses ke biner lain (
little_shell) melalui filesystem
- Isolasi proses:
init dan shell berjalan di ruang memori yang independen
- Di atas perangkat keras yang kompleks, kernel menyediakan fondasi eksekusi yang stabil dan portabel
Definisi sistem operasi
- Ada yang menganggap hanya kernel sebagai sistem operasi, dan ada pula yang menganggap seluruh distro sebagai sistem operasi
- Yang penting adalah memahami batas peran dan struktur interaksi antara kernel dan ruang pengguna
Membuat distro mikro yang benar-benar berguna dengan u-root
- Proyek u-root menyediakan sekumpulan alat ruang pengguna berbasis Go
u-root juga mencakup bootloader ruang pengguna dan lingkungan shell yang berjalan di atas kernel Linux
- Setelah instalasi, jalankan perintah
GOOS=linux GOARCH=riscv64 u-root untuk membuat initramfs secara otomatis
- File
/tmp/initramfs.linux_riscv64.cpio dapat dijalankan di QEMU
- Saat booting, akan muncul banner “Welcome to u-root!” bersama prompt shell dasar
- Mendukung perintah dasar seperti
ls, pwd, echo, serta fitur tab completion
Praktik koneksi jaringan
- Tambahkan perangkat
virtio-net-device dan virtio-rng-pci ke QEMU
- Gunakan opsi
-device virtio-net-device,netdev=usernet -netdev user,id=usernet
- Dengan
dhclient dari u-root, IP akan dialokasikan otomatis melalui DHCP
- Contoh:
10.0.2.15/24 dialokasikan ke eth0
- Dengan
wget http://google.com, akses ke jaringan eksternal berhasil, dan unduhan index.html dapat dikonfirmasi
Pentingnya package manager dan init
- Distro umum menggunakan package manager untuk memasang dan memperbarui perangkat lunak secara dinamis
- Praktik ini memakai pendekatan bergaya embedded, sehingga seluruh image harus dibangun ulang
init bukan sekadar peluncur proses, melainkan komponen inti untuk inisialisasi perangkat, pengelolaan layanan, dan kendali boot sistem
- Melalui source
init milik u-root, kita dapat melihat berbagai proses penyiapan perangkat seperti /dev
Repositori GitHub
- Seluruh kode dan contoh dalam panduan ini tersedia di popovicu/linux-micro-distro
- Build image
initramfs dan reproduksi praktiknya dapat dilakukan
1 komentar
Komentar Hacker News
Sudah beberapa bulan saya membuat sendiri distro Linux mikro
Mode pengguna terdiri dari satu binary statis tunggal, dan hanya ada beberapa file untuk mendukung container microVM confidential
Khususnya, struktur initramfs sangat menarik. Proses kernel mengekstrak arsip cpio, masuk ke tmpfs, lalu menjalankan /init terasa seperti sihir
Beberapa arsip cpio juga bisa digabung, masing-masing bisa dikompresi, lalu dioverlay secara berurutan
Berkat desain yang sederhana namun elegan ini, saya belajar banyak dengan menulis sendiri kode unpack
Belakangan ini qemu mulai mendukung uftrace pada arsitektur utama
Ini menjadi jawaban yang tepat saat para ahli bertanya, “Bagaimana cara men-debug ini?”
Detail terkait bisa dilihat di thread ini
Saya juga sedang mengerjakan proyek serupa — azathos
Ini mencakup toy init, shell, dan beberapa utilitas buatan sendiri
Saya memasukkan GNU coreutils untuk debugging, dan sekarang sedang fokus pada fitur menggambar jendela di framebuffer
Proyek ini benar-benar keren. Ini mengingatkan saya pada masa membuat “distro” berbasis floppy pada tahun 98 untuk imaging PC Windows lewat UDP broadcast
“make bzimage”, error skrip init, reboot tanpa akhir… banyak kenangan
Menariknya, cara modern ternyata tidak terlalu berbeda. Akan seru dan edukatif kalau di-port ke Raspberry Pi. Mungkin saya akan mencobanya sendiri
Akhirnya teman saya membakar isi sftp ke CD untuk menyelesaikannya, tapi saat itu hanya bisa ditulis pada kecepatan 2x
Saya penasaran seberapa sulit menjalankan ini sebagai image cloud (misalnya: Vultr, DigitalOcean) atau menampilkan GUI untuk menjalankan Firefox
Cara lain juga memungkinkan: boot lewat distro lain lalu menjalankan kernel sendiri dengan kexec untuk memasangnya di memori
Contoh implementasi nyata bisa dilihat di nixos-anywhere
Ini pekerjaan yang lebih sederhana dari dugaan
Akan sangat menarik kalau ada versi proyek ini yang dibuat untuk Raspberry Pi
Saya sempat bertanya kenapa orang membuat hal seperti ini sendiri, lalu terpikir apakah tidak cukup menjelajahi Linux lewat Gentoo saja
Kustomisasi user space memang memungkinkan, tetapi kurang cocok untuk benar-benar mempelajari Linux itu sendiri
Bahkan hanya dengan melihat stage3 tarball saja, itu sudah setara dengan “mini distro”
Untuk belajar, ini memang sangat bagus, dan kalau ingin cepat jadi, buildroot adalah pilihan yang baik
Saya belajar banyak berkat tulisan ini. Terima kasih atas postingan yang sangat padat informasi ini