pengenalan
Dalam rangkaian artikel ini, saya ingin melihat sistem build distribusi buildroot dan berbagi pengalaman saya dalam menyesuaikannya. Di sini Anda akan mendapatkan pengalaman praktis dalam membuat OS kecil dengan antarmuka grafis dan fungsionalitas minimal.
Pertama-tama, Anda tidak boleh bingung antara sistem build dan distribusinya. Buildroot dapat membangun sistem dari sekumpulan paket yang ditawarkan padanya. Buildroot dibangun di atas makefile dan karenanya memiliki kemampuan penyesuaian yang sangat besar. Ganti paket dengan versi lain, tambahkan paket Anda sendiri, ubah aturan pembuatan 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 merakit kit distribusi dengan pengunduhan langsung, antarmuka icewm, dan browser. Platform targetnya adalah kotak virtual.
Mengapa membangun distribusi Anda sendiri? Seringkali fungsionalitas yang terbatas diperlukan dengan sumber daya yang terbatas. Bahkan lebih sering dalam otomatisasi Anda perlu membuat firmware. Mengadaptasi distribusi tujuan umum dengan membersihkan paket-paket yang tidak diperlukan dan mengubahnya menjadi firmware lebih memakan banyak tenaga dibandingkan membangun distribusi baru. Menggunakan Gentoo juga memiliki keterbatasan.
Sistem Buildroot sangat kuat, tetapi tidak akan memberikan manfaat apa pun bagi Anda. Itu hanya dapat mengaktifkan dan mengotomatiskan proses perakitan.
Sistem pembangunan alternatif (yocto, sistem pembangunan terbuka, dan lainnya) tidak dipertimbangkan atau dibandingkan.
Di mana mendapatkannya dan bagaimana memulainya
Situs web proyek -
Buildroot mengoperasikan defconfigs untuk papan target build. Defconfig adalah file konfigurasi yang hanya menyimpan opsi yang tidak memiliki nilai default. Dialah yang menentukan apa yang akan dikumpulkan dan bagaimana caranya. Dalam hal ini, Anda dapat secara terpisah mengkonfigurasi konfigurasi bootloader busybox, linux-kernel, uglibc, u-boot dan barebox, tetapi semuanya akan terikat ke papan target.
Setelah membongkar arsip yang diunduh atau mengkloning dari git, kami mendapatkan buildroot yang siap digunakan. Anda dapat membaca lebih lanjut tentang struktur direktori di manual; Saya akan memberi tahu Anda tentang yang paling penting:
papan — direktori dengan file khusus untuk setiap papan. Ini bisa berupa skrip untuk membentuk image sistem (iso, sdcart, cpio, dan lainnya), direktori overlay, konfigurasi kernel, dll.
konfigurasi — defconfig papan yang sebenarnya. Defconfig adalah konfigurasi papan yang tidak lengkap. Ini hanya menyimpan parameter yang berbeda dari pengaturan default
dl — direktori dengan kode sumber/file yang diunduh untuk perakitan
keluaran/sasaran — sistem file rakitan dari OS yang dihasilkan. Selanjutnya, gambar dibuat darinya untuk diunduh/instalasi
keluaran/host - utilitas host untuk perakitan
keluaran/bangun - paket rakitan
Majelis dikonfigurasi melalui KConfig. Sistem yang sama digunakan untuk membangun kernel Linux. Daftar perintah yang paling umum digunakan (dijalankan di direktori buildroot):
- make menuconfig - memanggil konfigurasi build. Anda juga dapat menggunakan antarmuka grafis (buat nconfig, buat xconfig, buat gconfig)
- make linux-menuconfig - memanggil konfigurasi kernel.
- make clean - membersihkan hasil build (semuanya tersimpan di output)
- membuat - membangun sistem. Ini tidak merakit kembali proses yang sudah dirakit.
- make defconfig_name - mengalihkan konfigurasi ke defconfig tertentu
- make list-defconfigs - tampilkan daftar defconfigs
- make source - cukup unduh file instalasi, tanpa membangun.
- buat bantuan - buat daftar perintah yang mungkin
Catatan penting dan tips bermanfaat
Buildroot tidak membangun kembali paket yang telah dibuat! Oleh karena itu, situasi mungkin timbul ketika diperlukan perakitan kembali secara menyeluruh.
Anda dapat membangun kembali paket terpisah dengan perintah buat nama paket-rebuild. Misalnya, Anda dapat membangun kembali kernel Linux:
make linux-rebuild
Buildroot menyimpan status paket apa pun dengan membuat file .stamp di direktori output/build/$packagename:
Oleh karena itu, Anda dapat membangun kembali root-fs dan image 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 Berguna
buildroot memiliki sekumpulan variabel untuk memudahkan konfigurasi
- $TOPDIR - direktori buildroot
- $BASEDIR - direktori OUTPUT
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR — host fs, staging fs, target fs direktori build.
- $BUILD_DIR - direktori dengan paket yang belum dibongkar dan dibuat
Visualisasi
buildroot memiliki fitur visualisasi, Anda dapat membuat diagram ketergantungan, grafik waktu pembuatan, dan grafik ukuran paket di sistem akhir. Hasilnya berupa file pdf (bisa dipilih svn,png) di direktori output/graph.
Contoh perintah visualisasi:
make graph-depends
membangun pohon ketergantunganmake <pkg>-graph-depends
membangun pohon ketergantungan untuk paket tertentuBR2_GRAPH_OUT=png make graph-build
waktu pembuatan plot dengan keluaran PNGmake graph-size
ukuran paket plot
Skrip yang berguna
Ada subdirektori di direktori buildroot utilitas dengan skrip yang berguna. Misalnya, ada skrip yang memeriksa kebenaran deskripsi paket. Ini mungkin berguna saat menambahkan paket Anda sendiri (saya akan melakukannya nanti). File utils/readme.txt berisi deskripsi skrip ini.
Mari kita membangun distribusi stok
Penting untuk diingat bahwa semua operasi dilakukan atas nama pengguna biasa, bukan root.
Semua perintah dijalankan di buildroot. Paket buildroot sudah menyertakan serangkaian konfigurasi untuk banyak papan umum dan virtualisasi.
Mari kita lihat daftar konfigurasinya:
Beralih ke konfigurasi qemu_x86_64_defconfig
make qemu_x86_64_defconfig
Dan kami memulai perakitan
make
Build berhasil diselesaikan, lihat hasilnya:
Buildroot telah mengkompilasi gambar yang dapat Anda jalankan di Qemu dan memverifikasi bahwa gambar tersebut 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 Anda sendiri
Menambahkan File Papan
Mari kita lihat daftar konfigurasinya:
Dalam daftar kita melihat pc_x86_64_efi_defconfig. Kami akan membuat papan kami sendiri dengan menyalinnya dari konfigurasi:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig
Mari segera buat direktori board untuk menyimpan skrip, rootfs-overlay, dan file lain yang diperlukan:
mkdir board/my_x86_board
Beralih ke defconfig ini:
make my_x86_board_defconfig
Jadi, sekarang konfigurasi build (disimpan dalam .config di root direktori buildroot) sesuai dengan mesin target boot x86-64 legacy (bios).
Mari kita salin konfigurasi kernel linux (berguna nanti):
cp board/pc/linux.config board/my_x86_board/
Mengatur parameter build melalui KConfig
Mari kita mulai penyiapannya:
make menuconfig
Jendela KConfig akan terbuka. Dimungkinkan untuk mengkonfigurasi dengan antarmuka grafis (buat nconfig, buat xconfig, buat gconfig):
Kita masuk ke bagian pertama Opsi Target. Di sini Anda dapat memilih arsitektur target yang pembangunannya akan dilakukan.
Opsi build - ada berbagai pengaturan build di sini. Anda dapat menentukan direktori dengan kode sumber, jumlah thread build, mirror untuk mengunduh kode sumber, dan pengaturan lainnya. Biarkan pengaturannya default.
Toolchain – alat pembangunannya sendiri dikonfigurasikan di sini. Baca lebih lanjut tentang dia.
Jenis rantai alat – jenis rantai alat yang digunakan. Ini bisa berupa rantai alat yang dibangun di dalam buildroot atau yang eksternal (Anda dapat menentukan direktori dengan yang sudah dibangun atau url untuk mengunduh). Ada opsi tambahan untuk arsitektur yang berbeda. Misalnya, untuk lengan Anda cukup memilih versi Linaro dari rantai alat eksternal.
Perpustakaan C – pemilihan perpustakaan C. Pengoperasian seluruh sistem bergantung pada ini. Biasanya, glibc digunakan, yang mendukung semua fungsi yang mungkin. Namun mungkin terlalu besar untuk sistem tertanam, sehingga uglibc atau musl sering dipilih. Kami akan memilih glibc (ini akan diperlukan nanti untuk menggunakan systemd).
Seri Kernel Header dan Custom Kernel Headers – harus sesuai dengan versi kernel yang akan ada di sistem rakitan. Untuk header kernel, Anda juga dapat menentukan jalur ke repositori tarball atau git.
GCC COMPILER VERSIONS – pilih versi compiler yang akan digunakan untuk pembuatan
Aktifkan dukungan C++ – pilih untuk membangun dengan dukungan untuk pustaka C++ di sistem. Ini akan berguna bagi kita di masa depan.
Opsi gcc tambahan – Anda dapat mengatur opsi kompiler tambahan. Kami tidak membutuhkannya untuk saat ini.
Konfigurasi sistem memungkinkan Anda mengatur parameter masa depan dari sistem yang dibuat:
Sebagian besar poinnya jelas dari judulnya. Mari kita perhatikan hal-hal berikut ini:
Jalur ke tabel pengguna - tabel dengan pengguna yang akan dibuat (
Contoh berkas. Pengguna pengguna akan dibuat dengan kata sandi admin, secara otomatis gid/uid, /bin/sh shell, pengguna grup default, root anggota grup, komentar Foo pengguna
[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt
user -1 user -1 =admin /home/user /bin/sh root Foo user
Direktori overlay sistem file root - direktori yang dihamparkan di atas target-fs yang telah dirakit. Menambahkan file baru dan mengganti file yang sudah ada.
Skrip khusus untuk dijalankan sebelum membuat gambar sistem file - Skrip dieksekusi segera sebelum melipat sistem file menjadi gambar. Biarkan skripnya kosong untuk saat ini.
Mari kita pergi 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 ditawarkan, masukkan versi secara manual, tentukan repositori atau tarball yang sudah jadi.
Konfigurasi kernel — jalur ke konfigurasi kernel. Anda dapat memilih konfigurasi default untuk arsitektur yang dipilih atau defocnfig dari Linux. Sumber Linux berisi sekumpulan defconfigs untuk sistem target yang berbeda. Anda dapat menemukan yang Anda butuhkan
Bagian Paket target memungkinkan Anda memilih paket mana yang akan diinstal pada sistem yang sedang dibangun. Mari kita biarkan tidak berubah untuk saat ini. Kami akan menambahkan paket kami ke daftar ini nanti.
Gambar sistem file - daftar gambar sistem file yang akan dikumpulkan. Tambahkan gambar iso
Bootloader - pemilihan bootloader untuk dikumpulkan. Ayo pilih isolinix
Mengonfigurasi Systemd
Systemd menjadi salah satu pilar Linux, bersama dengan kernel dan glibc. Oleh karena itu, saya memindahkan pengaturannya ke item terpisah.
Dikonfigurasi melalui make menuconfig, lalu Paket target → Alat sistem → systemd. Di sini Anda dapat menentukan layanan systemd mana yang akan diinstal dan dimulai ketika sistem dimulai.
Menyimpan konfigurasi sistem
Kami menyimpan konfigurasi ini melalui KConfig.
Kemudian simpan defconfig kami:
make savedefconfig
Konfigurasi Kernel Linux
Konfigurasi kernel Linux dipanggil dengan perintah berikut:
make linux-menuconfig
Mari tambahkan dukungan untuk kartu video Virtualbox
Mari tambahkan dukungan integrasi Virtualbox Guest
Simpan dan keluar. PENTING: konfigurasi akan disimpan di 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
Setelah itu kami akan melakukan perakitan kembali seluruh sistem secara menyeluruh. buildroot tidak membangun kembali apa yang telah dibangun, Anda harus menentukan paket untuk membangun kembali secara manual. Agar tidak membuang waktu dan kegelisahan, lebih mudah untuk membangun kembali sistem kecil secara keseluruhan):
make clean;make
Setelah menyelesaikan build, luncurkan VirtualBox (diuji pada versi 5.2 dan 6.0) dengan mem-boot dari CD Parameter sistem:
Berjalan dari iso rakitan:
Daftar bahan yang digunakan
- Panduan buildroot
Sumber: www.habr.com