Pendahuluan
Dalam seri artikel ini saya ingin mempertimbangkan sistem distribusi buildroot dan berbagi pengalaman menyesuaikannya. Ini akan menjadi pengalaman praktis dalam menciptakan OS kecil dengan antarmuka grafis dan fungsionalitas minimal.
Pertama-tama, Anda tidak perlu bingung dengan sistem build dan distribusinya. Buildroot dapat membangun sistem dari sekumpulan paket yang ditawarkan. Buildroot dibangun di atas makefile dan karenanya memiliki kemampuan penyesuaian yang luar biasa. Ganti paket dengan versi lain, tambahkan paket Anda, ubah aturan untuk membuat paket, sesuaikan sistem file setelah menginstal semua paket? Buildroot dapat melakukan semua ini.
Di Rusia, buildroot digunakan, tetapi menurut saya hanya ada sedikit informasi berbahasa Rusia untuk pemula.
Tujuan dari pekerjaan ini adalah untuk membangun kit distribusi dengan live-download, antarmuka icewm dan browser. Platform target adalah virtualbox.
Mengapa membangun distribusi Anda? Seringkali Anda memerlukan fungsionalitas terbatas dengan sumber daya terbatas. Lebih sering dalam otomatisasi Anda perlu membuat firmware. Mengadaptasi distribusi untuk keperluan umum, membersihkan paket tambahan dan mengubahnya menjadi firmware lebih memakan waktu daripada membangun distrib baru. Menggunakan Gentoo juga memiliki keterbatasan.
Sistem Buildroot sangat kuat, tetapi tidak akan melakukan apa pun untuk Anda. Itu hanya bisa memberi peluang dan mengotomatiskan proses perakitan.
Sistem build alternatif (yocto, open build system, dll.) Tidak dipertimbangkan atau dibandingkan.
Di mana untuk mendapatkan dan bagaimana memulai
Situs proyek adalah buildroot.org . Di sini Anda dapat mengunduh versi saat ini dan membaca manual. Anda juga dapat menghubungi komunitas di sana, ada pelacak bug, daftar surat, dan saluran irc.
Buildroot beroperasi dengan defconfig untuk papan target perakitan. Defconfig adalah file konfigurasi yang hanya menyimpan opsi yang tidak memiliki nilai default. Dialah yang menentukan apa dan bagaimana akan dikumpulkan. Dalam hal ini, Anda dapat mengkonfigurasi secara terpisah busybox konfigurasi, linux-kernel, uClibc, bootloaders u-boot dan barebox, tetapi semuanya akan diikat ke papan target.
Setelah membongkar arsip yang diunduh atau kloning dari git, kami menyiapkan buildroot untuk bekerja. Detail tentang struktur direktori dapat ditemukan di manual, saya akan berbicara tentang yang paling penting:
board - direktori dengan file khusus untuk setiap board. Ini bisa berupa skrip untuk membentuk gambar sistem (iso, sdcart, cpio, dll.), Direktori overlay, konfigurasi kernel, dll.
configs - sebenarnya defconfig board. Defconfig adalah konfigurasi papan yang tidak lengkap. Hanya parameter selain pengaturan default yang disimpan di dalamnya.
dl - direktori dengan kode sumber yang diunduh / file untuk perakitan
output / target - sistem file rakitan OS yang dihasilkan. Selanjutnya, gambar untuk mengunduh / menginstal dibuat darinya.
output / host - utilitas host untuk membangun
paket yang dikompilasi output / build
Konfigurasi build dilakukan melalui KConfig. Sistem yang sama digunakan untuk membangun kernel linux. Daftar perintah yang paling sering digunakan (jalankan di direktori buildroot):
- make menuconfig - panggil konfigurasi build. Anda juga dapat menggunakan antarmuka grafis (make nconfig, make xconfig, make gconfig)
- make linux-menuconfig - panggil konfigurasi kernel.
- membuat hasil perakitan bersih - bersih (semua yang disimpan dalam output)
- membuat - membangun sistem. Itu tidak membangun kembali proses yang sudah dikumpulkan
- make defconfig_name - alihkan konfigurasi ke defconfig tertentu
- make list-defconfigs - tampilkan daftar defconfig
- make source - hanya unduh file instalasi, tanpa perakitan.
- buatlah bantuan - buat daftar perintah yang mungkin
Catatan dan tips penting
Buildroot tidak membangun kembali paket yang sudah dikemas! Oleh karena itu, sebuah situasi dapat muncul ketika diperlukan reassembly lengkap.
Anda dapat membangun kembali satu paket dengan perintah make packagename-rebuild. Sebagai contoh, Anda dapat membangun kembali kernel linux:
make linux-rebuild
Buildroot menyimpan status paket apa pun dengan membuat file .stamp di direktori output / build / $ nama paket:

Oleh karena itu, Anda dapat membangun kembali root-fs dan gambar tanpa membangun kembali paket:
rm output/build/host-gcc-final-*/.stamp_host_installed;rm -rf output/target;find output/ -name ".stamp_target_installed" |xargs rm -rf ; make
Variabel yang Berguna
Buildroot memiliki serangkaian variabel untuk konfigurasi yang mudah
- $ TOPDIR - direktori root dari buildroot
- Direktori $ BASEDIR - OUTPUT
- $ HOST_DIR, $ STAGING_DIR, $ TARGET_DIR - direktori assembly host fs, pementasan fs, target fs.
- $ BUILD_DIR - direktori dengan paket yang belum dibuka dan dirakit
Visualisasi
Buildroot memiliki kemampuan untuk memvisualisasikan. Anda dapat membangun diagram dependensi, timeline build, grafik ukuran paket dalam sistem akhir. Hasilnya dalam bentuk file pdf (Anda dapat memilih dari svn, png) di direktori output / grafik.
Contoh perintah visualisasi:
make graph-depends
membangun pohon ketergantunganmake <pkg>-graph-depends
build membangun pohon dependensi paketBR2_GRAPH_OUT=png make graph-build
waktu perakitan dengan output dalam PNGmake graph-size
paket plot make graph-size
Skrip yang bermanfaat
Direktori buildroot memiliki subdirektori utils dengan skrip yang bermanfaat. Misalnya, ada skrip yang memverifikasi deskripsi paket yang benar. Ini bisa bermanfaat saat menambahkan paket saya (saya akan melakukannya nanti). File utils / readme.txt berisi deskripsi skrip-skrip ini.
Mari kita membangun distribusi stok
Penting untuk diingat bahwa semua operasi dilakukan atas nama pengguna biasa, bukan root.
Semua perintah dijalankan di root buildroot. Paket buildroot sudah memiliki satu set konfigurasi untuk banyak papan umum dan virtualisasi.
Kami melihat daftar konfigurasi:

Beralih ke konfigurasi qemu_x86_64_defconfig
make qemu_x86_64_defconfig
Dan kami memulai perakitan
make
Perakitan selesai dengan sukses, kami melihat hasilnya:

Buildroot telah mengompilasi gambar yang dapat Anda jalankan di Qemu dan memastikannya berfungsi.
qemu-system-x86_64 -kernel output/images/bzImage -hda \ output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S
Hasilnya adalah sistem yang berjalan di qemu:

Membuat konfigurasi papan khusus
Menambahkan File Papan
Kami melihat daftar konfigurasi:

Dalam daftar kita melihat pc_x86_64_bios_defconfig. Kami akan membuat papan kami dengan menyalinnya dari konfigurasi:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig
Segera buat direktori board untuk menyimpan skrip, overlay rootfs, dan file lain yang diperlukan:
mkdir board/my_x86_board
Beralih ke defconfig ini:
make my_x86_board_defconfig
Dengan demikian, sekarang konfigurasi build (disimpan dalam .config di root direktori buildroot) sesuai dengan mesin target x86-64 legacy (bios) dengan memuat.
Salin konfigurasi linux-kernel (berguna di masa depan):
cp board/pc/linux.config board/my_x86_board/
Konfigurasikan opsi bangun melalui KConfig
Jalankan pengaturan:
make menuconfig
Jendela KConfig terbuka. Dimungkinkan untuk mengkonfigurasi dengan antarmuka grafis (make nconfig, make xconfig, make gconfig):

Kami memasuki bagian pertama dari Opsi Target. Di sini Anda dapat memilih arsitektur target untuk perakitan yang akan dilakukan.

Opsi pembuatan - ada berbagai pengaturan pembuatan di sini. Anda dapat menentukan direktori dengan kode sumber, jumlah utas perakitan, mirror untuk mengunduh kode sumber, dan pengaturan lainnya. Biarkan pengaturan default.
Toolchain - di sini alat bantu dikonfigurasikan. Lebih banyak tentang dia.

Jenis Toolchain - jenis toolchain yang digunakan. Itu bisa bawaan untuk buildroot atau toolchain eksternal (Anda bisa menentukan direktori dengan yang sudah dibangun sebelumnya atau url untuk mengunduh). Untuk arsitektur yang berbeda ada opsi tambahan. Misalnya, untuk arm, Anda cukup memilih versi toolchain eksternal Linaro.
Perpustakaan C - pilihan perpustakaan C. Operasi seluruh sistem tergantung pada ini. Glibc biasanya digunakan, mendukung semua fungsionalitas yang mungkin. Tetapi mungkin terlalu besar untuk sistem embedded, jadi uClibc atau musl sering dipilih. Kami akan memilih glibc (di masa depan akan diperlukan untuk menggunakan systemd).
Kernel Headers dan Custom Kernel Headers series - harus cocok dengan versi kernel yang akan ada di sistem build. Untuk header kernel, Anda juga bisa menentukan path ke repositori tarball atau git.
GCC COMPILER VERSIONS - pilih versi kompiler yang akan digunakan untuk perakitan
Aktifkan dukungan C ++ - pilih untuk perakitan dengan dukungan untuk perpustakaan c ++ dalam sistem. Di masa depan, ini akan berguna.
Opsi gcc tambahan - Anda dapat mengatur opsi kompiler tambahan. Kami tidak perlu sejauh ini.
Konfigurasi sistem memungkinkan Anda untuk mengatur parameter masa depan untuk sistem yang dibuat:

Sebagian besar poin jelas dari namanya. Perhatikan poin-poin berikut:
Path ke tabel pengguna - tabel dengan pengguna yang dibuat ( https://buildroot.org/downloads/manual/manual.html#makeuser-syntax ).
Contoh file. Pengguna pengguna akan dibuat dengan admin kata sandi, secara otomatis gid / uid, / bin / sh shell, pengguna grup default, anggota grup root, komentar pengguna Foo
[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt user -1 user -1 =admin /home/user /bin/sh root Foo user
Root direktori overlay filesystem - direktori yang ditumpangkan di atas target-fs yang dirakit. Menambahkan file baru dan menggantikan yang sudah ada.
Skrip khusus untuk dijalankan sebelum membuat gambar sistem file - Skrip yang dieksekusi segera sebelum sistem file diciutkan menjadi gambar. Script itu sendiri akan dibiarkan kosong untuk saat ini.
Mari kita pindah ke bagian Kernel

Pengaturan kernel diatur di sini. Kernel itu sendiri dikonfigurasi melalui make linux-menuconfig.
Anda dapat mengatur versi kernel dengan berbagai cara: pilih dari yang diusulkan, masukkan versi secara manual, tentukan repositori atau tarball siap.
Konfigurasi kernel - jalur ke konfigurasi kernel. Anda dapat memilih konfigurasi default untuk arsitektur yang dipilih atau defocnfig dari Linux. Sumber Linux memiliki set defconfig untuk sistem target yang berbeda. Anda dapat menemukan yang tepat dengan melihat langsung sumbernya di sini . Misalnya, untuk papan hitam tulang beagle, Anda dapat memilih konfigurasi .
Bagian Paket target memungkinkan Anda memilih paket mana yang akan diinstal pada sistem build. Biarkan tidak berubah untuk saat ini. Nanti kami akan menambahkan paket kami ke daftar ini.
Gambar sistem file - daftar gambar sistem file yang akan dikompilasi. Tambahkan gambar iso

Bootloaders - pilihan bootloader untuk dibangun Pilih isolinix

Konfigurasi Systemd
Systemd menjadi salah satu pilar linux, bersama dengan kernel dan glibc. Karena itu, saya membuat konfigurasinya dalam paragraf terpisah.
Ini dikonfigurasikan melalui make menuconfig, lalu paket Target → System tools → systemd. Di sini Anda dapat menentukan layanan systemd mana yang akan diinstal dan dimulai pada startup sistem.

Menyimpan konfigurasi sistem
Simpan konfigurasi ini melalui KConfig.
Kemudian simpan defconfig kami:
make savedefconfig
Konfigurasi kernel Linux
Konfigurasi kernel linux dipanggil dengan perintah berikut:
make linux-menuconfig
Tambahkan dukungan untuk kartu grafis Virtualbox

Tambahkan dukungan integrasi Virtualbox Guest

Simpan dan keluar. PENTING : konfigurasi akan disimpan dalam output / build / linux- $ version / config, tetapi tidak di board / my_x86_board / linux.config

Oleh karena itu, Anda perlu menyalin konfigurasi secara manual ke lokasi penyimpanan:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config
Dengan perintah ini saya menyalin konfigurasi kernel FULL, yang tidak selalu diperlukan. Cara yang lebih benar adalah menjaga defconfig kernel:
make linux-update-defconfig
Setelah itu, kami melakukan reassembly lengkap dari seluruh sistem. Karena buildroot tidak memasang kembali yang sudah dirakit, Anda harus secara manual menentukan paket untuk pemasangan kembali. Agar tidak kehilangan waktu dan saraf, lebih mudah untuk membangun kembali seluruh sistem kecil):
make clean;make
Setelah selesai membangun, jalankan VirtualBox (diuji pada versi 5.2 dan 6.0) dengan mem-boot dari drive-cd. Parameter sistem:

Mulai dari iso yang dirakit:

Daftar bahan yang digunakan
- Manual buildroot