第四章 根文件系统构建: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 | 根据需求选择 |
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
4.4 打包生成rootfs.img
配置好了,overlay也加完了,接下来就是编译打包。Buildroot会自动生成rootfs.img,但咱们得告诉它用什么格式。
在make menuconfig的Filesystem 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
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节点的配置才搞定。
好了,这一章就到这里。下一章咱们聊聊如何把uboot、内核、根文件系统整合到一起,生成一个完整的烧录镜像。到时候我会分享一个我常用的打包脚本,保证一次成功。