Buildroot - phần 2. Tạo cấu hình bo mạch của bạn; sử dụng cây bên ngoài, lớp phủ rootfs, tập lệnh hậu xây dựng

Trong phần này, tôi xem xét một số tùy chọn tùy chỉnh mà tôi cần. Đây không phải là danh sách đầy đủ những gì buildroot cung cấp, nhưng chúng khá chức năng và không yêu cầu can thiệp vào các tệp của buildroot.

Sử dụng cơ chế EXTERNAL để tùy chỉnh

Trong một bài viết trước Chúng ta đã xem xét một ví dụ đơn giản về việc thêm cấu hình của riêng bạn bằng cách thêm trực tiếp defconfig của bo mạch và các tệp cần thiết vào thư mục Buildroot.

Nhưng cách này không thuận tiện lắm, nhất là khi cập nhật buildroot. Đã có cơ chế giải quyết vấn đề này cây bên ngoài. Bản chất của nó là bạn có thể lưu trữ board, configs, packages và các thư mục khác trong một thư mục riêng (ví dụ: tôi sử dụng thư mục Patch để áp dụng các bản vá cho các gói, thông tin chi tiết hơn trong một phần riêng) và chính buildroot sẽ thêm chúng vào những thư mục đó trong thư mục của nó.

Lưu ý: bạn có thể phủ nhiều cây bên ngoài cùng một lúc, có một ví dụ trong hướng dẫn buildroot

Hãy tạo một thư mục my_tree, nằm bên cạnh thư mục buildroot và chuyển cấu hình của chúng ta vào đó. Đầu ra phải có cấu trúc tệp sau:

[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

Như bạn có thể thấy, nhìn chung cấu trúc lặp lại cấu trúc của buildroot.

Thư mục bảng chứa các tệp cụ thể cho từng bảng trong trường hợp của chúng tôi:

  • bef_cr_fs_img.sh là một tập lệnh sẽ được thực thi sau khi xây dựng hệ thống tệp đích nhưng trước khi đóng gói nó thành hình ảnh. Chúng tôi sẽ sử dụng nó trong tương lai
  • linux.config - cấu hình kernel
  • rootfs_overlay - thư mục để phủ lên trên hệ thống tệp đích
  • user.txt - một tệp mô tả người dùng sẽ được tạo

Thư mục cấu hình chứa defconfig bảng của chúng tôi. Chúng tôi chỉ có một.

Đóng gói - danh mục với các gói của chúng tôi. Ban đầu, buildroot chứa các mô tả và quy tắc để xây dựng một số gói giới hạn. Sau này chúng tôi sẽ thêm trình quản lý cửa sổ Icewm và trình quản lý đăng nhập đồ họa Slim vào đây.
Các bản vá lỗi — cho phép bạn lưu trữ các bản vá của mình một cách thuận tiện cho các gói khác nhau. Thêm chi tiết trong một phần riêng biệt dưới đây.
Bây giờ chúng ta cần thêm các tệp mô tả cho cây bên ngoài. Có 3 tệp chịu trách nhiệm cho việc này: external.desc, Config.in, external.mk.

bên ngoài.desc chứa mô tả thực tế:

[alexey@alexey-pc my_tree]$ cat external.desc 
name: my_tree
desc: My simple external-tree for article

Dòng đầu tiên là tiêu đề. Trong tương lai buildroot tạo một biến $(BR2_EXTERNAL_MY_TREE_PATH), nên được sử dụng khi cấu hình tập hợp. Ví dụ: đường dẫn đến tệp người dùng có thể được đặt như sau:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txt

Dòng thứ hai là một mô tả ngắn gọn, dễ đọc.

Cấu hình.in, bên ngoài.mk - các tập tin để mô tả các gói được thêm vào. Nếu bạn không thêm các gói của riêng mình thì các tệp này có thể để trống. Hiện tại, đó là những gì chúng tôi sẽ làm.
Bây giờ chúng ta đã có sẵn cây bên ngoài, chứa cấu hình defconfig của bảng và các tệp mà nó cần. Hãy vào thư mục buildroot và chỉ định sử dụng cây bên ngoài:

[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

Trong lệnh đầu tiên chúng ta sử dụng đối số BR2_EXTERNAL=../my_tree/, cho biết việc sử dụng cây bên ngoài. Bạn có thể chỉ định một số cây bên ngoài để sử dụng cùng một lúc. Trong trường hợp này, bạn chỉ cần thực hiện việc này một lần, sau đó một tệp đầu ra/.br-external.mk được tạo lưu trữ thông tin về cây bên ngoài được sử dụng:

[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

Quan trọng! Các đường dẫn trong tệp này sẽ là tuyệt đối!

Một mục Tùy chọn bên ngoài đã xuất hiện trong menu:

Buildroot - phần 2. Tạo cấu hình bo mạch của bạn; sử dụng cây bên ngoài, lớp phủ rootfs, tập lệnh hậu xây dựng

Menu con này sẽ chứa các gói của chúng tôi từ cây bên ngoài. Phần này hiện đang trống.

Bây giờ điều quan trọng hơn là chúng ta phải viết lại các đường dẫn cần thiết để sử dụng cây bên ngoài.

Xin lưu ý rằng trong phần Tùy chọn xây dựng → Vị trí lưu cấu hình buildroot sẽ có đường dẫn tuyệt đối đến defconfig đã lưu. Nó được hình thành tại thời điểm chỉ định việc sử dụng extgernal_tree.

Chúng tôi cũng sẽ sửa lại các đường dẫn trong phần Cấu hình hệ thống. Đối với một bảng có người dùng đã tạo:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txt

Trong phần Kernel thay đổi đường dẫn đến cấu hình kernel:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/linux.config

Bây giờ các tập tin từ cây bên ngoài của chúng tôi sẽ được sử dụng trong quá trình lắp ráp. Khi chuyển sang thư mục khác hoặc cập nhật buildroot, chúng ta sẽ gặp ít vấn đề nhất.

Thêm lớp phủ fs gốc:

Cơ chế này cho phép bạn dễ dàng thêm/thay thế các tệp trong hệ thống tệp đích.
Nếu tệp nằm trong lớp phủ gốc fs nhưng không nằm trong mục tiêu thì nó sẽ được thêm vào
Nếu tệp nằm trong lớp phủ gốc fs và trong mục tiêu thì nó sẽ được thay thế.
Trước tiên, hãy đặt đường dẫn đến thư mục lớp phủ fs gốc. Việc này được thực hiện trong phần Cấu hình hệ thống → Thư mục lớp phủ hệ thống tập tin gốc:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/rootfs_overlay/

Bây giờ hãy tạo hai tập tin.

[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

Tệp đầu tiên (my_tree/board/my_x86_board/rootfs_overlay/etc/hosts) sẽ thay thế tệp /etc/hosts trên hệ thống đã hoàn thiện. Tệp thứ hai (cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt) sẽ được thêm vào.

Chúng tôi thu thập và kiểm tra:

Buildroot - phần 2. Tạo cấu hình bo mạch của bạn; sử dụng cây bên ngoài, lớp phủ rootfs, tập lệnh hậu xây dựng

Thực thi các tập lệnh tùy chỉnh ở các giai đoạn lắp ráp hệ thống khác nhau

Thường thì bạn cần thực hiện một số công việc bên trong hệ thống tệp đích trước khi nó được đóng gói thành hình ảnh.

Điều này có thể được thực hiện trong phần Cấu hình hệ thống:

Buildroot - phần 2. Tạo cấu hình bo mạch của bạn; sử dụng cây bên ngoài, lớp phủ rootfs, tập lệnh hậu xây dựng

Hai tập lệnh đầu tiên được thực thi sau khi hệ thống tệp đích được xây dựng nhưng trước khi nó được đóng gói thành hình ảnh. Sự khác biệt là tập lệnh fakeroot được thực thi trong ngữ cảnh của fakeroot, mô phỏng hoạt động của người dùng root.

Tập lệnh cuối cùng được thực thi sau khi hình ảnh hệ thống được tạo. Bạn có thể thực hiện các hành động bổ sung trong đó, chẳng hạn như sao chép các tệp cần thiết vào máy chủ NFS hoặc tạo hình ảnh phần sụn thiết bị của bạn.

Ví dụ: tôi sẽ tạo một tập lệnh ghi phiên bản và ngày xây dựng vào /etc/.
Đầu tiên tôi sẽ chỉ ra đường dẫn đến tệp này trong cây bên ngoài của mình:

Buildroot - phần 2. Tạo cấu hình bo mạch của bạn; sử dụng cây bên ngoài, lớp phủ rootfs, tập lệnh hậu xây dựng

Và bây giờ chính kịch bản:

[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

Sau khi lắp ráp, bạn có thể thấy tập tin này trên hệ thống.

Trong thực tế, tập lệnh có thể trở nên lớn. Vì vậy, trong dự án thực tế, tôi đã thực hiện một lộ trình nâng cao hơn:

  1. Tôi đã tạo một thư mục (my_tree/board_my_x86_board/inside_fakeroot_scripts) trong đó có các tập lệnh được thực thi, kèm theo số sê-ri. Ví dụ: 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
  2. Tôi đã viết một tập lệnh (my_tree/board_my_x86_board/run_inside_fakeroot.sh) đi qua thư mục này và thực thi tuần tự các tập lệnh có trong đó
  3. Đã chỉ định tập lệnh này trong cài đặt bảng trong phần Cấu hình hệ thống -> Tập lệnh tùy chỉnh để chạy bên trong môi trường fakeroot ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh)

Nguồn: www.habr.com

Thêm một lời nhận xét