4 poin oleh GN⁺ 2025-10-27 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 2025-10-27
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

    • Saya juga ingat pada tahun 98 mencoba memasang Mandrake Linux lewat NetBIOS dan ISDN, lalu harus memulai ulang puluhan kali karena error checksum
      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

    • Menjalankannya sebagai image cloud relatif mudah. Selama ada driver bawaan kernel, image-nya tinggal dipasang
      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
    • Cukup buat image yang menyertakan driver virtio untuk jaringan dan penyimpanan, lalu konversi ke qcow2 dan daftarkan ke DigitalOcean atau layanan serupa
      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

    • Gentoo memang “dibangun dari source”, tetapi package manager menangani sebagian besar pekerjaan
      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