Di bagian ini, saya mempertimbangkan beberapa kemampuan penyesuaian yang saya butuhkan. Ini bukan daftar lengkap apa yang ditawarkan buildroot, tetapi mereka cukup berfungsi dan tidak memerlukan intervensi dalam file buildroot itu sendiri.
Menggunakan mekanisme EKSTERNAL untuk penyesuaian
Pada artikel sebelumnya, kami mempertimbangkan contoh sederhana untuk menambahkan konfigurasi Anda dengan menambahkan defconfig board dan file yang diperlukan langsung ke direktori Buildroot.
Tetapi metode ini sangat tidak nyaman, terutama saat memperbarui buildroot. Untuk mengatasi masalah ini, ada mekanisme pohon eksternal . Esensinya adalah Anda dapat menyimpan board, konfigurasi, paket, dan direktori lain di direktori yang terpisah (misalnya, saya menggunakan direktori patch untuk menerapkan patch ke paket, lebih banyak di bagian terpisah) dan buildroot akan menambahkannya ke direktori yang ada di direktori sendiri.
Catatan: Anda dapat menerapkan beberapa pohon eksternal sekaligus, ada contoh di manual buildroot
Buat direktori my_tree yang terletak di sebelah direktori buildroot dan transfer konfigurasi kami di sana. Outputnya harus struktur file berikut:
[alexey@alexey-pc my_tree]$ tree . ├── board │ └── my_x86_board │ ├── bef_cr_fs_img.sh │ ├── linux.config │ ├── rootfs_overlay │ └── users.txt ├── Config.in ├── configs │ └── my_x86_board_defconfig ├── external.desc ├── external.mk ├── package └── patches 6 directories, 7 files
Seperti yang Anda lihat, secara umum, struktur mengikuti struktur buildroot.
Direktori board berisi file khusus untuk setiap board dalam kasus kami:
- bef_cr_fs_img.sh - skrip yang akan dieksekusi setelah membangun sistem file target, tetapi sebelum mengemasnya menjadi gambar. Di masa depan kita akan menggunakannya
- linux.config - konfigurasi kernel
- rootfs_overlay - direktori untuk overlay di atas sistem file target
- users.txt - file dengan deskripsi pengguna yang dibuat
Direktori configs berisi defconfigs dari board kami. Kami hanya punya satu.
Paket - katalog dengan paket kami. Awalnya, buildroot berisi deskripsi dan aturan untuk membangun sejumlah paket. Nanti kita akan menambahkan window manager icewm dan Slim logon manager di sini.
Patch - memungkinkan Anda untuk menyimpan patch Anda dengan mudah untuk paket yang berbeda. Lebih detail di bagian terpisah di bawah ini.
Sekarang kita perlu menambahkan file deskripsi external-tree kita. 3 file bertanggung jawab untuk ini: external.desc, Config.in, external.mk.
external.desc berisi deskripsi aktual:
[alexey@alexey-pc my_tree]$ cat external.desc name: my_tree desc: My simple external-tree for article
Baris pertama adalah namanya. Di masa mendatang, buildroot membuat variabel $ (BR2_EXTERNAL_MY_TREE_PATH) , yang harus digunakan saat mengonfigurasi perakitan. Misalnya, jalur ke file dengan pengguna dapat diatur dengan cara berikut:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txt
Baris kedua adalah deskripsi singkat yang bisa dibaca manusia.
Config.in, external.mk - file untuk deskripsi paket yang ditambahkan. Jika Anda tidak menambahkan paket Anda, maka file-file ini dapat dibiarkan kosong. Sejauh ini kita akan melakukannya.
Sekarang kita sudah siapkan external-tree kita, berisi defconfig dari board kita dan file-file yang dibutuhkannya. Kami akan pergi ke direktori buildroot, kami akan menentukan untuk menggunakan pohon eksternal:
[alexey@alexey-pc buildroot]$ make BR2_EXTERNAL=../my_tree/ my_x86_board_defconfig
Pada perintah pertama, kita menggunakan argumen BR2_EXTERNAL = .. / my_tree / , menunjukkan penggunaan pohon eksternal. Anda dapat menentukan beberapa pohon eksternal untuk digunakan pada saat yang sama. Cukup untuk melakukan ini sekali, setelah itu dihasilkan file output / .br-external.mk yang menyimpan informasi tentang pohon eksternal yang digunakan:
[alexey@alexey-pc buildroot]$ cat output/.br-external.mk
Penting! Dalam file ini, path-nya akan absolut!
Item menu Opsi eksternal muncul:

Submenu ini akan berisi paket-paket kami dari pohon eksternal kami. Sekarang bagian ini kosong.
Sekarang lebih penting bagi kita untuk menulis ulang jalur yang diperlukan untuk menggunakan pohon eksternal.
Perhatikan bahwa di bagian Opsi pembuatan → Lokasi untuk menyimpan konfigurasi buildroot, akan ada jalur absolut ke defconfig yang disimpan. Ini dibentuk pada saat menentukan penggunaan extgernal_tree.
Juga di bagian Konfigurasi sistem, perbaiki jalurnya. Untuk tabel dengan pengguna dibuat:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txt
Di bagian Kernel, ubah jalur ke konfigurasi kernel:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/linux.config
Sekarang, majelis akan menggunakan file kita dari pohon eksternal kita. Saat mentransfer ke direktori lain, memperbarui buildroot, kami akan memiliki masalah minimum.
Menambahkan overlay root fs:
Mekanisme ini memudahkan untuk menambah / mengganti file dalam sistem file target.
Jika file dalam overlay root fs tetapi tidak pada target, maka akan ditambahkan
Jika file dalam overlay root fs dan dalam target, maka itu akan diganti.
Pertama, setel path ke root overlay fs. Ini dilakukan di bagian System configuration → Root direktori overlay direktori filesystem:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/rootfs_overlay/
Sekarang mari kita buat dua file.
[alexey@alexey-pc my_small_linux]$ cat my_tree/board/my_x86_board/rootfs_overlay/etc/hosts 127.0.0.1 localhost 127.0.1.1 my_small_linux 8.8.8.8 google-public-dns-a.google.com. [alexey@alexey-pc my_small_linux]$ cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt This is new file from overlay
File pertama (my_tree / board / my_x86_board / rootfs_overlay / etc / hosts) akan menggantikan file / etc / hosts pada sistem jadi. File kedua (cat my_tree / board / my_x86_board / rootfs_overlay / new_file.txt) akan ditambahkan.
Kami mengumpulkan dan memeriksa:

Eksekusi skrip penyesuaian pada berbagai tahap perakitan sistem
Seringkali, Anda perlu melakukan beberapa tindakan di dalam sistem file target sebelum dikemas ke dalam gambar.
Ini dapat dilakukan di bagian Konfigurasi sistem:

Dua skrip pertama dieksekusi setelah membangun sistem file target, tetapi sebelum mengemasnya menjadi gambar. Perbedaannya adalah bahwa skrip fakeroot dieksekusi dalam konteks fakeroot, mereka mensimulasikan pekerjaan dari pengguna root.
Script terakhir dijalankan setelah membuat gambar sistem. Anda dapat melakukan tindakan tambahan di dalamnya, misalnya, menyalin file yang diperlukan ke server nfs atau membuat gambar firmware perangkat Anda.
Sebagai contoh, saya akan membuat skrip yang akan menulis versi dan tanggal pembuatannya di / etc /.
Pertama, saya akan menunjukkan path ke file ini di pohon eksternal saya:

Dan sekarang skrip itu sendiri:
[alexey@alexey-pc buildroot]$ cat ../my_tree/board/my_x86_board/bef_cr_fs_img.sh
Setelah perakitan, Anda dapat melihat file ini di sistem.
Dalam praktiknya, sebuah skrip bisa menjadi besar. Oleh karena itu, dalam proyek nyata, saya melangkah lebih maju:
- Membuat direktori (my_tree / board_my_x86_board / inside_fakeroot_scripts), di mana skrip untuk dieksekusi, dengan nomor seri, bohong. Misalnya, 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
- Saya menulis sebuah skrip (my_tree / board_my_x86_board / run_inside_fakeroot.sh) yang melewati direktori ini dan secara berurutan menjalankan skrip di dalamnya
- Skrip ini ditunjukkan dalam pengaturan papan di konfigurasi Sistem -> Skrip khusus untuk dijalankan di dalam lingkungan fakeroot ($ (BR2_EXTERNAL_my_tree_PATH) / board/my_x86_board/run_inside_fakeroot.sh)