Xây dựng hệ thống tập tin gốc bằng Buildroot cho hệ nhúng ARM

Hệ thống tập tin gốc (rootfs) là thành phần thiết yếu trong quá trình khởi động hệ điều hành Linux. Đây là hệ thống tập tin đầu tiên được nhân Linux gắn kết (mount) khi khởi động, chứa các tệp nhị phân nhân, tập lệnh khởi tạo như rcS, inittab, và các dịch vụ nền tảng. Trong môi trường nhúng, nếu không có rootfs hợp lệ, nhân Linux dù đã được nạp vào bộ nhớ cũng không thể hoàn tất quá trình khởi động.

Sử dụng Buildroot để tạo rootfs

Buildroot là một khung công cụ mã nguồn mở giúp tự động xây dựng hệ thống Linux nhúng thông qua biên dịch chéo. Nó dựa trên hệ thống Makefile và cấu hình Kconfig, cho phép người dùng tùy chỉnh hệ thống theo phần cứng mục tiêu.

1. Tải và giải nén mã nguồn

Phiên bản Buildroot 2020.02.6 được sử dụng trong ví dụ này:

tar -vxjf buildroot-2020.02.6.tar.bz2
cd buildroot-2020.02.6

2. Cấu hình Buildroot

Chạy giao diện cấu hình đồ họa:

make menuconfig

Cấu hình kiến trúc mục tiêu:

  • Target Architecture: ARM (little endian)
  • Target Architecture Variant: cortex-A7
  • Target ABI: EABIhf
  • Floating point strategy: NEON/VFPv4

Cấu hình chuỗi công cụ biên dịch chéo (toolchain):

  • Toolchain type: External toolchain
  • Toolchain path: /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf
  • Toolchain prefix: arm-none-linux-gnueabihf
  • External toolchain gcc version: 9.x
  • Kernel headers series: 4.20.x
  • C library: glibc
  • Bật các tùy chọn: SSP support, RPC support, C++ support, MMU support

Cấu hình hệ thống:

  • System hostname: ATK-stm32mp1
  • Init system: BusyBox
  • /dev management: Dynamic using devtmpfs + mdev
  • Tùy chọn đặt mật khẩu root (có thể tắt để thuận tiện phát triển)

Định dạng hệ thống tập tin đầu ra:

  • Bật ext2/3/4 root filesystem, chọn định dạng ext4
  • Thiết lập kích thước: 1G

Vô hiệu hóa việc biên dịch U-Boot và nhân Linux:

  • Bỏ chọn Linux Kernel trong mục Kernel
  • Bỏ chọn U-Boot trong mục Bootloaders

Gói phần mềm cơ bản:

  • Trong Target packages → System tools, bật kmod để hỗ trợ quản lý module nhân

Lưu cấu hình dưới tên stm32mp1_atk_defconfig để tái sử dụng:

make stm32mp1_atk_defconfig

3. Biên dịch hệ thống

make -j8

Kết quả được lưu tại output/images/rootfs.tar. Giải nén vào thư mục NFS để kiểm thử:

cp output/images/rootfs.tar /home/alientek/linux/nfs/rootfs/
cd /home/alientek/linux/nfs/rootfs/
tar -xvf rootfs.tar

4. Tùy chỉnh BusyBox

Truy cập cấu hình BusyBox:

make busybox-menuconfig
  • Settings → Support Unicode: Bật
  • Linux System Utilities → mdev: Đảm bảo được chọn
  • Linux Module Utilities → depmod: Bật để hỗ trợ phân tích phụ thuộc module
  • Không chọn Build static binarySimplified modutils

Sau khi chỉnh sửa, biên dịch lại BusyBox và toàn bộ hệ thống:

make busybox
make -j8

5. Thêm phần mềm bên thứ ba

Kích hoạt VSFTPD:

  • Target packages → Networking applications → vsftpd

Kích hoạt SSH:

  • Target packages → Networking applications → openssh

Sau khi cấu hình, biên dịch lại và cập nhật thư mục NFS.

6. Kiểm thử hệ thống

Chạy chương trình thử nghiệm:

# hello.c
#include <stdio.h>
#include <unistd.h>

int main(void) {
    while (1) {
        printf("hello world!\n");
        sleep(2);
    }
    return 0;
}

Biên dịch bằng công cụ chéo:

arm-none-linux-gnueabihf-gcc hello.c -o hello

Chép vào /drivers trên rootfs và chạy nền:

./hello &
ps
kill -9 <PID>

Hỗ trợ tiếng Việt: Đảm bảo BusyBox đã bật Unicode và biến môi trường ngôn ngữ được thiết lập đúng.

Tự khởi động: Thêm lệnh vào /etc/init.d/rcS hoặc tạo tập lệnh mới bắt đầu bằng chữ S, ví dụ Sautorun.

Cấu hình mạng: Tạo /etc/resolv.conf với nội dung:

nameserver 114.114.114.114
nameserver 192.168.1.1

Hiển thị đường dẫn trong terminal: Tạo tập lệnh /etc/profile.d/myprofile.sh:

#!/bin/sh
PS1='[\u@\h]:\w$ '
export PS1

Gỡ lỗi driver: Gắn debugfs để truy cập /sys/kernel/debug:

mount -t debugfs none /sys/kernel/debug

7. Đóng gói và ghi vào eMMC

Tạo ảnh ext4:

dd if=/dev/zero of=rootfs.ext4 bs=1M count=1024
mkfs.ext4 -L rootfs rootfs.ext4

Gắn và sao chép nội dung rootfs:

sudo mkdir /mnt/rootfs
sudo mount rootfs.ext4 /mnt/rootfs
sudo cp -drf /home/alientek/linux/nfs/rootfs/* /mnt/rootfs/
sudo umount /mnt/rootfs

Sử dụng STM32CubeProgrammer để ghi rootfs.ext4 vào phân vùng eMMC. Cấu hình U-Boot để khởi động từ eMMC:

setenv bootcmd 'ext4load mmc 1:2 c2000000 uImage; ext4load mmc 1:2 c4000000 stm32mp157datk.dtb; bootm c2000000 - c4000000'
setenv bootargs 'console=ttySTM0,115200 root=/dev/mmcblk1p3 rootwait rw'
saveenv
boot

Sau khi khởi động, kích hoạt và cấu hình giao diện mạng:

ifconfig eth0 up
ifconfig eth0 192.168.1.250 netmask 255.255.255.0
# hoặc
udhcpc

Thẻ: Buildroot embedded-linux ARM rootfs BusyBox

Đăng vào ngày 10 tháng 7 lúc 02:37