第四章 根文件系统构建:Buildroot配置、文件系统定制、打包生成rootfs.img

好,咱们继续往下走。前面几章我们把内核和驱动都搞定了,现在该聊聊根文件系统了。说实话,很多做嵌入式的朋友容易忽略这一步,觉得随便找个busybox凑合一下就行。但在我做过的项目里,根文件系统没配好,后面调试起来真是欲哭无泪。

今天我就带大家一步步搞定T113-S3的根文件系统。咱们用Buildroot,这玩意儿确实好用。

4.1 Buildroot是个啥?为啥选它?

Buildroot,说白了就是一个自动化构建工具。你给它一个配置文件,它就能帮你把交叉编译工具链、bootloader、内核、根文件系统一股脑全搞定。我个人习惯用Buildroot而不是Yocto,原因很简单——Buildroot轻量,编译快,对于T113-S3这种单板来说完全够用。

我记得第一次用Yocto编译全志平台,等了整整一个下午。Buildroot呢?第一次全编译也就半小时左右,后面增量编译更快。

4.2 Buildroot配置实战

咱们先下载Buildroot。我建议用长期支持版本,比如2023.02.x或者2024.02.x。别追新,稳定第一。

wget https://buildroot.org/downloads/buildroot-2023.02.12.tar.gz
tar xvf buildroot-2023.02.12.tar.gz
cd buildroot-2023.02.12

然后开始配置。T113-S3是ARM Cortex-A7架构,所以目标架构选ARM,目标变体选cortex-a7。

make menuconfig

这里有几个关键配置项,我列个表给大家参考:

配置项 推荐值 说明
Target Architecture ARM (little endian) T113-S3是ARM架构
Target Architecture Variant cortex-a7 CPU核心类型
Target ABI EABIhf 硬浮点,性能更好
Floating point strategy NEON/VFPv4 全志芯片支持NEON
Toolchain type Buildroot internal 自动构建工具链
Kernel Linux kernel 勾选后指定内核源码路径
Root filesystem ext4 / squashfs 根据需求选择
小提示:如果你跟我一样喜欢调试,建议先选ext4。squashfs是只读的,虽然省空间,但调试时改文件不方便。

4.3 文件系统定制——加料不加价

Buildroot默认生成的文件系统很精简,就一个busybox加基本工具。但咱们做双屏异显,肯定要加一些自己的东西。

我个人习惯在board/allwinner/t113-s3/目录下建一个overlay文件夹。这个overlay目录里的文件,Buildroot会原封不动地拷贝到根文件系统里。

mkdir -p board/allwinner/t113-s3/overlay/etc
mkdir -p board/allwinner/t113-s3/overlay/usr/bin
mkdir -p board/allwinner/t113-s3/overlay/lib/firmware

举个例子,咱们双屏异显需要fb0和fb1两个framebuffer设备。我习惯在/etc/init.d/里加一个启动脚本:

#!/bin/sh
# 双屏异显初始化脚本
echo "Initializing dual display..."

# 设置fb0为主屏(LCD)
echo 0 > /sys/class/graphics/fb0/blank

# 设置fb1为副屏(HDMI或MIPI)
echo 0 > /sys/class/graphics/fb1/blank

# 设置显示参数
fbset -fb /dev/fb0 -xres 1024 -yres 600 -depth 32
fbset -fb /dev/fb1 -xres 1280 -yres 720 -depth 32

echo "Dual display ready."

嗯,这里要注意:脚本要加执行权限,不然Buildroot不会帮你加。

chmod +x board/allwinner/t113-s3/overlay/etc/init.d/S99dualdisplay
曾经踩过的坑:我曾经把overlay里的脚本权限忘了加,结果板子启动后双屏死活不亮。查了半天才发现是脚本没执行。从那以后,我每次都会检查一遍权限。

4.4 打包生成rootfs.img

配置好了,overlay也加完了,接下来就是编译打包。Buildroot会自动生成rootfs.img,但咱们得告诉它用什么格式。

make menuconfigFilesystem images菜单里,勾选你想要的格式。我一般选ext4:

Filesystem images --->
  [*] ext2/3/4 root filesystem
    (ext4) ext2/3/4 variant
    (131072) number of inodes (0 auto)
    (262144) rootfs size in KB (0 auto)

然后直接编译:

make

编译完成后,生成的rootfs.img在output/images/目录下。你可以用file命令看看:

file output/images/rootfs.ext4
# 输出: rootfs.ext4: Linux rev 1.0 ext4 filesystem data ...

如果你需要打包成sunxi专用的格式(比如全志的boot.img里包含rootfs),可以用全志的打包工具。但我个人建议直接用ext4,然后用fastboot或者dd命令烧录到板子上。

sudo dd if=output/images/rootfs.ext4 of=/dev/sdX bs=1M status=progress
小技巧:如果你经常修改文件系统,可以试试Buildroot的make rootfs-ext4命令,它只重新打包根文件系统,不用全量编译,省时间。

4.5 验证与调试

文件系统烧进去后,上电启动。如果一切正常,你会看到内核启动日志,然后挂载根文件系统,最后进入shell。

我一般会先检查几个关键点:

  • 检查overlay文件是否存在:ls /etc/init.d/看看有没有我们的脚本
  • 检查framebuffer设备:ls /dev/fb*应该看到fb0和fb1
  • 检查显示参数:fbset -fb /dev/fb0看看分辨率对不对

如果发现fb1没有出现,别慌。先看看内核有没有注册第二个显示接口。用dmesg | grep fb看看内核日志。我曾经遇到过一个问题,内核配置里只开了单屏支持,导致fb1根本没创建。后来在设备树里加了disp节点的配置才搞定。

核心要点:Buildroot配置根文件系统,关键就三步:选对架构、加好overlay、选对文件系统格式。每一步都有坑,但踩过一次就记住了。

好了,这一章就到这里。下一章咱们聊聊如何把uboot、内核、根文件系统整合到一起,生成一个完整的烧录镜像。到时候我会分享一个我常用的打包脚本,保证一次成功。