1. Lựa chọn và cấu hình công cụ Buildroot cho HackberryPi CM5
Chúng ta sẽ sử dụng Buildroot thay vì Yocto cho dự án này vì Buildroot có độ phức tạp thấp hơn, cấu hình đơn giản và phù hợp hơn với mục tiêu tạo một rootfs nhẹ, nhanh cho thiết bị nhúng như HackberryPi.
Việc đầu tiên là tải về mã nguồn của Buildroot phiên bản ổn định và giải nén vào thư mục làm việc của bạn.
Download và giải nén Buildroot version 2023.08.1:
cd ~/hackberrypi-build
wget https://buildroot.org/downloads/buildroot-2023.08.1.tar.bz2
tar -xvf buildroot-2023.08.1.tar.bz2
cd buildroot-2023.08.1
Kết quả mong đợi: Thư mục buildroot-2023.08.1 xuất hiện chứa toàn bộ source code của Buildroot.
Cấu hình kiến trúc ARM và Target
Bạn cần định kiến trúc ARM cho HackberryPi (thường là armv7l hoặc armv8l tùy chip) và chọn loại target system là Linux.
Chạy lệnh menuconfig để vào giao diện cấu hình:
make menuconfig
Kết quả mong đợi: Giao diện TUI (Text User Interface) hiện ra, cho phép bạn cấu hình hệ thống.
Tùy chọn System Configuration
Tại menu chính, hãy đi đến mục "System configuration" để thiết lập các thông số cốt lõi cho rootfs.
Cấu hình các thông số sau trong menu "System configuration":
- Target architecture: Chọn ARM.
- Target architecture endianness: Chọn Little endian (chuẩn cho HackberryPi).
- Default C library: Chọn musl (nhẹ hơn glibc, phù hợp cho embedded).
- Filesystem image format: Chọn cpio archive (để tạo rootfs.cpio cho boot sớm) hoặc tar archive (để tạo rootfs.tar.gz).
- Filesystem root permissions: Để mặc định (0755).
Nhấn Save và Exit để lưu cấu hình hệ thống.
Kiểm tra file cấu hình đã tạo:
ls .config
Kết quả mong đợi: File .config được tạo ra chứa toàn bộ cấu hình bạn vừa chọn.
2. Cấu hình danh sách package cần thiết
Để hệ thống có thể tương tác và chạy các lệnh cơ bản, chúng ta cần thêm các gói phần mềm vào danh sách biên dịch. Vì đang dùng Buildroot, việc này được thực hiện qua menuconfig.
Chạy lại menuconfig và đi vào mục "Target packages":
make menuconfig
Cấu hình Shell và Core Utilities
Bạn cần một shell để điều khiển và các công cụ hệ thống cơ bản. Mặc dù Busybox rất nhẹ, nhưng để phát triển và debug, Bash là cần thiết.
Tại menu "Target packages" -> "Shells", chọn:
- Bash: Chọn Enable (mã:
BR_PACKAGE_BASH).
- Busybox: Chọn Enable (mã:
BR_PACKAGE_BUSYBOX) để có các lệnh cơ bản như ls, cp, cat, grep.
Tại menu "Target packages" -> "System utilities", chọn:
- Coreutils: Chọn Enable để có đầy đủ các lệnh chuẩn Unix.
- Findutils: Chọn Enable để có lệnh find.
Cấu hình Network Tools
Để HackberryPi có thể kết nối mạng, ping, và download dữ liệu, cần thêm các gói mạng.
Tại menu "Target packages" -> "Network configuration", chọn:
- IProute2: Chọn Enable (thay thế lệnh ifconfig cũ, cần cho ip link, ip addr).
- Net-tools: Chọn Enable (để có ifconfig, netstat).
- Wget: Chọn Enable (để tải file từ internet).
- Curl: Chọn Enable (thay thế wget cho các trường hợp cần).
Tại menu "Target packages" -> "Networking utilities", chọn:
- Ping: Chọn Enable.
- NetworkManager: Không chọn (quá nặng cho rootfs khởi động đầu tiên, chúng ta sẽ cấu hình mạng thủ công qua /etc/network).
Cấu hình Debug và Development Tools
Để debug kernel và ứng dụng, cần thêm các công cụ hỗ trợ.
Tại menu "Target packages" -> "Development tools", chọn:
- Build tools: Chọn Enable (gcc, g++, make, binutils).
- Strace: Chọn Enable (để trace system calls).
- Valgrind: Có thể chọn nếu cần, nhưng khuyến nghị bỏ qua để giảm kích thước rootfs ban đầu.
Nhấn Save và Exit để lưu cấu hình packages.
3. Biên dịch thư viện hệ thống và ứng dụng người dùng
Sau khi đã cấu hình xong, Buildroot sẽ tự động tải source code của các package đã chọn, apply các patch cần thiết, và biên dịch chúng cho kiến trúc ARM của bạn.
Quá trình này bao gồm 4 bước tự động: Download -> Patch -> Configure -> Compile. Bạn chỉ cần chạy lệnh make.
Chạy lệnh biên dịch:
make
Quá trình này có thể mất từ 30 phút đến vài tiếng tùy thuộc vào tốc độ CPU và mạng của máy chủ build (host machine).
Trong quá trình chạy, Buildroot sẽ hiển thị log chi tiết từng package đang được build. Nếu có lỗi, hãy nhìn vào thông báo cuối cùng.
Để xem lại log nếu có lỗi:
cat output/build/.config.log
Kết quả mong đợi: Lệnh chạy xong, xuất hiện dòng "Build done in X.XX minutes" và không có lỗi.
Thư mục Output
Buildroot sẽ tạo ra tất cả các file nhị phân và cấu trúc thư mục trong thư mục output.
Kiểm tra thư mục output:
ls -la output/
Kết quả mong đợi: Xuất hiện các thư mục như build, host, images, target.
- output/target: Chứa toàn bộ rootfs đã được tạo (cấu trúc thư mục /bin, /etc, /lib, ...).
- output/images: Chứa các file hình ảnh hệ thống (rootfs.cpio, rootfs.tar.gz, dtb, v.v).
4. Tạo file hệ thống tập tin rootfs.cpio hoặc rootfs.tar.gz
Dựa vào cấu hình "Filesystem image format" ở phần 1, Buildroot đã tự động tạo file hệ thống tập tin trong thư mục output/images.
Kiểm tra file đã tạo:
ls -lh output/images/
Kết quả mong đợi: Bạn sẽ thấy file rootfs.cpio (nếu chọn cpio archive) hoặc rootfs.tar.gz (nếu chọn tar archive).
Verify cấu trúc bên trong Rootfs
Để chắc chắn rằng rootfs đã được tạo đúng, chúng ta cần kiểm tra nội dung bên trong mà không cần giải nén toàn bộ ra đĩa.
Nếu bạn tạo file rootfs.cpio:
cd output/images
cpio -tv < rootfs.cpio | head -n 20
Nếu bạn tạo file rootfs.tar.gz:
cd output/images
tar -tzvf rootfs.tar.gz | head -n 20
Kết quả mong đợi: Danh sách các thư mục và file hiện ra, bao gồm:
- /bin/bash: Shell đã được biên dịch.
- /bin/busybox: Busybox đã được biên dịch.
- /usr/bin/wget: Công cụ mạng đã được biên dịch.
- /lib/libc.so: Thư viện musl.
Test Rootfs trên Host Machine (Chroot)
Để đảm bảo rootfs chạy được trên kiến trúc ARM (mô phỏng), bạn có thể thử chạy chroot nếu bạn có bộ công cụ cross-compiler trong môi trường, tuy nhiên cách đơn giản nhất để verify là kiểm tra các file binary có đúng kiến trúc ARM hay không.
Sử dụng lệnh file để kiểm tra kiến trúc của các binary:
file output/target/bin/bash
file output/target/bin/busybox
Kết quả mong đợi: Đầu ra phải hiển thị dòng tương tự:
output/target/bin/bash: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked...
Nếu thấy ELF 64-bit hoặc x86-64, nghĩa là bạn đã cấu hình sai Target architecture ở phần 1.
Copy Rootfs vào thư mục dự án HackberryPi
Di chuyển file rootfs đã tạo thành công vào thư mục chính của dự án HackberryPi để chuẩn bị cho phần 5 (Bootloader).
cp output/images/rootfs.cpio ~/hackberrypi-build/
# Hoặc nếu dùng tar.gz
# cp output/images/rootfs.tar.gz ~/hackberrypi-build/
Kiểm tra file đã copy:
ls -lh ~/hackberrypi-build/rootfs.cpio
Kết quả mong đợi: File rootfs.cpio (hoặc rootfs.tar.gz) xuất hiện trong thư mục ~/hackberrypi-build/ với kích thước khoảng vài MB (tùy số lượng package đã chọn).
Điều hướng series:
Mục lục: Series: Xây dựng hệ điều hành Linux từ source cho HackberryPi CM5
« Phần 3: Xây dựng và biên dịch Kernel Linux
Phần 5: Tạo bootloader và cấu hình khởi động U-Boot »