SBC (Single Board Computer) seperti Raspberry Pi selain digunakan untuk hobby para antusias teknologi, juga kadang digunakan pada peralatan produksi misalnya router, server cluster, ataupun KiosK.

Kadang yang menyediakan sistem operasi bukan hanya vendor yang mengeluarkan hardwarenya saja, tapi ada beberapa distro khusus SBC yang menyediakan support linux untuk berbagai macam hardware, misalnya seperti armbian.

Tapi tahukah Kalian, kalau ada tools yang dapat Kita gunakan untuk build Linux dan semua kelengkapannya sesuai dengan kebutuhan dan konfigurasi yang Kita inginkan?. Terdapat dua major player pada area ini, yaitu Yocto dan Buildroot. Pada kesempatan kali ini, Saya akan membahas tentang bagaimana cara membuat dan melakukan kustomisasi Sistem Operasi Linux dengan menggunakan Buildroot.

Pembahasan kali ini yang akan ditekankan adalah hasil dari ukuran image linux yang kecil, tapi tidak menghilangkan fitur-fitur yang dibutuhkan. Sebagai catatan, untuk Raspberry Pi OS Lite setelah di uncompress ukuran imagenya sebesar 2GB. Kita akan mencoba membuat Image Linux dengan ukuran sekitar 200MB, karena kebutuhan yang tidak memerlukan GUI.

Ukuran kecil ini sangat berguna bila Kita hendak membuat sebuah sistem atau perangkat yang diproduksi masal atau semi-masal, dalam hal ini saya kategorikan 5-10 perangkat termasuk semi-masal. Seperti pembuatan KiosK untuk beberapa cabang kantor, gardu tol, gate parkir, mesin kasir pada banyak toko atau misalnya membuat router?. melakukan flash ukuran gigabyte vs ~200MB sangat terasa jelas perbedaan beban kerjanya, apalagi kalau Kita harus memberikan update firmware full OS.

Mari Kita mulai dengan langkah-langkahnya, dimulai dengan pre-request yang harus dipenuhi.

Kebutuhan yang harus dipenuhi

Yang harus dimiliki untuk melakukan build linux image dengan buildroot adalah Sistem Operasi Linux, baik itu yang diinstall langsung pada PC atau menggunakan Virtual Machine. Saya sudah mencoba melakukan build pada WSL/WSL2, tapi ada beberapa tools yang tidak didukung WSL terutama permasalahan generate filesystem image.

Dapat menggunakan Fedora atau Debian dan turunannya seperti Ubuntu (Atau distro lain, tapi saya tidak akan membahasnya). Berikut adalah paket-paket software yang harus diinstall terlebih dahulu pada sistem linux Kita:

Fedora

sudo dnf groupinstall "Development Tools" "Development Libraries"
sudo dnf install g++ perl

Debian dan Ubuntu

sudo apt install build-essential
sudo apt install g++ perl

Download dan Extract Buildroot

Setelah semua kebutuhan dipenuhi, Kita dapat segera melakukan download tools Buildroot, bisa dengan menggunakan browser di alamat https://buildroot.org/download.html, atau yang lebih nyaman langsung di terminal.

Buka terminal, lalu buat direktori untuk lokasi buildroot. Biasanya saya buat direktori build pada home directory:

cd ~
mkdir build
cd build

Untuk mendownloadnya bisa dengan menggunakan wget:

wget https://buildroot.org/downloads/buildroot-2022.02.1.tar.gz

Pada command di atas, Saya menggunakan buildroot versi 2022.02.1 (Versi terbaru ketika artikel ini dibuat) Untuk mengetahui url buildroot versi terbaru sekarang, bisa membuka alamat https://buildroot.org/download.html di browser, lalu pilih List stable dengan extension tar.gz, lalu klik kanan dan dan pilih Copy Link.

Setelah download selesai, lakukan extract file yang sudah di download, dan masuk kedalam direktori konten yang sudah diextract dengan command berikut:

# Ubah 2022.02.1 dengan versi yang didownload.

tar -xvf buildroot-2022.02.1.tar.gz
cd buildroot-2022.02.1

Berikut isi file pada direktori root buildroot:

[[email protected] buildroot-2022.02.1]$ ls
arch   CHANGES           configs     docs   Makefile         README   toolchain
board  Config.in         COPYING     fs     Makefile.legacy  support  utils
boot   Config.in.legacy  DEVELOPERS  linux  package          system

Memilih Konfigurasi Hardware

Buildroot mendukung banyak konfigurasi hardware, baik itu SBC atau bahkan komputer biasa dengan prosesor Intel-x86. Untuk menampilkan daftar konfigurasi hardware yang didukung buildroot, bisa dengan menggunakan command:

make list-defconfigs

Listnya sangat banyak dan mungkin berubah-ubah setiap versi, disini Saya hanya akan tampilkan beberapa yang mungkin berguna, atau biasanya hardwarenya tersedia di Indonesia:

...
bananapi_m1_plus_defconfig          - Build for bananapi_m1_plus
bananapi_m2_plus_defconfig          - Build for bananapi_m2_plus
bananapi...
...
beagleboardx15_defconfig            - Build for beagleboardx15
beagleboneai_defconfig              - Build for beagleboneai
...
odroidc2_defconfig                  - Build for odroidc2
odroidxu4_defconfig                 - Build for odroidxu4
...
orangepi_lite2_defconfig            - Build for orangepi_lite2
orangepi_lite_defconfig             - Build for orangepi_lite
orangepi_one_defconfig              - Build for orangepi_one
orangepi...
...
pc_x86_64_bios_defconfig            - Build for pc_x86_64_bios
pc_x86_64_efi_defconfig             - Build for pc_x86_64_efi
...
raspberrypi0_defconfig              - Build for raspberrypi0
raspberrypi0w_defconfig             - Build for raspberrypi0w
raspberrypi2_defconfig              - Build for raspberrypi2
raspberrypi3_64_defconfig           - Build for raspberrypi3_64
raspberrypi3_defconfig              - Build for raspberrypi3
raspberrypi3_qt5we_defconfig        - Build for raspberrypi3_qt5we
raspberrypi4_64_defconfig           - Build for raspberrypi4_64
raspberrypi4_defconfig              - Build for raspberrypi4
raspberrypicm4io_64_defconfig       - Build for raspberrypicm4io_64
raspberrypicm4io_defconfig          - Build for raspberrypicm4io
raspberrypi_defconfig               - Build for raspberrypi
raspberrypizero2w_defconfig         - Build for raspberrypizero2w
...

Yang mungkin banyak digunakan pc_x86_64* dengan raspberrypi*, dimana pc_x86_64 adalah konfigurasi untuk PC dengan prosesor Intel/AMD (x86) 64bit seperti Laptop atau Komputer Desktop, sedangkan raspberrypi tentunya untuk raspberry pi, baik itu versi 1,2,3 atau 4.

Pada artikel ini, Kita akan mencoba membuat buildroot linux untuk raspberry pi 3 dengan Linux 32bit, jadi yang dipilih raspberrypi3_defconfig.

Untuk build buildroot raspberry pi dengan linux 64bit, bisa pilih yang raspberrypi3_64_defconfig, dan untuk raspberry pi versi lainnya bisa dipilih sesuai dengan nama konfignya, yang menurut Saya sudah sangat jelas. Dan bila ingin membuat image untuk laptop/pc intel, gunakan pc_x86_64_bios_defconfig (atau pc_x86_64_efi_defconfig bila booting menggunakan uefi).

Bila konfigurasi hardware telah ditemukan, untuk menggunakan konfig yang dimaksud, dapat dengan menjalankan command berikut:

make raspberrypi3_defconfig

Ubah raspberrypi3_defconfig sesuai dengan konfig yang tadi dijelaskan. Setelah konfig di-set, maka buildroot sudah siap untuk di-build. Tapi selain menggunakan konfig bawaan, Kita juga dapat melakukan konfigurasi lain, seperti software apa saja yang ingin dimasukkan.

Menu Config

Untuk melakukan kustomisasi pada image yang akan dibuat, bisa dengan menjalankan command berikut:

make menuconfig

Maka akan muncul tampilan tatap muka untuk melakukan kustomisasi seperti berikut:

Pada menu ini, Kita dapat melakukan kustomisasi sesuai dengan kategori pada menu di atas. Biasanya Saya tidak menyentuh Target options, dan Build options karena banyak yang berhubungan dengan konfigurasi platform hardware yang bila salah konfig bisa jadi tidak bisa booting sama sekali, tapi untuk coba-coba silahkan saja dijelajahi.

Yang biasa saya ubah, mulai dari toolchain:

Sesuai kebutuhan, karena secara default library C yang akan dibuild adalah uClibc-ng, dan kadang yang saya butuhkan adalah Glibc, maka Saya ubah isinya menjadi glibc.

Dan masih dalam toolchain, karena Saya membuat program dengan C dan banyak sekali menggunakan instuksi multicore dengan OpenMP, maka Saya cek OpenMP support:

Setelah selesai pada toolchain, silahkan keluar ke menu utama, dan masuk ke System configuration:

Disini Kita bisa mengubah hostname default dan system banner, misalnya kita ganti dengan osku, dan Selamat datang di OS-Ku. Disini juga Kita bisa set password untuk user root.

Setelah System configuration, yang paling penting adalah kustomisasi Target Packages. dimana pada menu ini Kita bisa memilih software apa saja yang akan Kita masukan kedalam image yang akan Kita buat:

Terdapat banyak sekali aplikasi, library, development tools dan utility yang bisa dipilih, misalnya pada menu Audio and video application Saya pilih alsa-utils agar dapat menyalakan suara dan menjalankan command aplay untuk memainkan file wav:

Atau memilih openssh pada Networking application agar bisa melakukan remote dengan ssh:

Juga Saya include juga mc dan nano pada Text editors and viewers, karena Saya tidak begitu terbiasa dengan vi 😂:

Setelah selesai pilih memilihnya, Kita bisa kembali ke menu utama. Menu lain seperti Filesystem images, Bootloaders, dan lainnya jarang sekali saya ubah, tapi silahkan bila ingin mencoba mengubahnya untuk pembelajaran. Bila telah selesai, Pilih < Exit > lalu pastika konfigurasi yang telah dilakukan disimpan dengan mengkonfirmasi save.

Kernel Linux Menu Config

Bagi yang pernah melakukan compile Kernel Linux, pasti sudah familiar dengan linux menuconfig, tampilannya sama dengan buildroot menuconfig, tapi isi menunya berbeda. Bila tidak ingin mengubah apapun pada Kernel Linux, bagian ini bisa di lewat, tapi bila ingin mengubah misalnya menambah driver atau konfigurasi kernel lainnya, bisa dengan menjalankan command berikut:

make linux-menuconfig

Bila pertama kali menjalankan command di atas, maka Kita harus sedikit bersabar, silahkan ditunggu dulu (Lumayan lamanya), karena buildroot akan melakukan download beberapa tools dan kernel linux itu terlebih dahulu, dan melakukan compile beberapa komponen sebelum menu berikut tampil:

Ini adalah tampilan menu konfigurasi untuk kernel linux, terdapat banyak sekali konfigurasi, tapi hati-hati banyak konfigurasi default kalau dimatikan bisa menyebabkan image yang dibuild tidak dapat booting. Yang mungkin berguna untuk dikustom (rekomendasi hanya menambah) adalah bagian Device Drivers.

Bila kira-kira ada hardware yang tidak terdeteksi, atau kemungkinan tidak di-include pada konfigurasi ini, silahkan tambahkan, misalnya saya menambahkan beberapa driver untuk hardware usb-to-serial di dalam USB support:

Bila selesai pilih memilihnya, silahkan kembali ke menu utama, dan pilih < Exit > lalu pastikan konfigurasi tersimpan dengan memilih Save.

Melakukan Build

Setelah semua konfigurasi selesai, maka hal terakhir yang harus dilakukan adalah melakukan build dan compile semua source yang telah dipilih dengan menjalankan:

make

Silahkan tunggu, karena proses build ini membutuhkan waktu yang lama. Perintah ini akan menjalankan proses download semua paket yang dipilih sebelumnya dan melakukan compile sesuai dengan konfigurasi yang ditentukan. Pada komputer Saya biasanya proses ini memerlukan waktu sekitar 15-20 menit (tergantung koneksi internet juga). Kita bisa menambahkan argumen -j4 atau -j(Jumlah prosesor) untuk melakukan proses secara paralel:

make -j4
Proses make yang panjang dan memakan waktu yang cukup lama

Hasil Build

Setelah build selesai, maka image untuk diclone pada sdcard akan berada pada direktori output/images/:

File sdcard.img merupakan file yang siap di-clone/burn pada sdcard dengan menggunakan dd, Balena Echer atau untuk windows bisa menggunakan rufus.

Penutup

Sekian pembahasan membuat image linux dengan menggunakan buildroot. Untuk preview hasil dari build akan Saya sajikan pada artikel selanjutnya. Semoga Bermanfaat, dan sampai jumpa lagi.