Buildroot - bagian 2. Membuat konfigurasi papan Anda; penerapan skrip eksternal tree, rootfs-overlay, post-build

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 # # configuration written to /home/alexey/dev/article/ramdisk/buildroot/.config # [alexey@alexey-pc buildroot]$ make menuconfig 

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 # # Automatically generated file; DO NOT EDIT. # BR2_EXTERNAL ?= /home/alexey/dev/article/ramdisk/my_small_linux/my_tree BR2_EXTERNAL_NAMES = BR2_EXTERNAL_DIRS = BR2_EXTERNAL_MKS = BR2_EXTERNAL_NAMES += my_tree BR2_EXTERNAL_DIRS += /home/alexey/dev/article/ramdisk/my_small_linux/my_tree BR2_EXTERNAL_MKS += /home/alexey/dev/article/ramdisk/my_small_linux/my_tree/external.mk export BR2_EXTERNAL_my_tree_PATH = /home/alexey/dev/article/ramdisk/my_small_linux/my_tree export BR2_EXTERNAL_my_tree_DESC = My simple external-tree for article 

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 #!/bin/sh echo "my small linux 1.0 pre alpha" > output/target/etc/mysmalllinux-release date >> output/target/etc/mysmalllinux-release 

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:


  1. 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
  2. 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
  3. 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)

Source: https://habr.com/ru/post/id449348/


All Articles