RK3506B: buildroot:出一份正规的最小 rootfs

发布时间:2026/7/11 21:10:35
RK3506B: buildroot:出一份正规的最小 rootfs RK3506B: buildroot出一份正规的最小 rootfsrk-forge 已经开源带你从零把一颗几乎没人理的 RK3506用主线 Linux7.1 主线 U-Boot 一路跑到rk3506 login:——可按序打上去的补丁库、诚实的差距报告、完整 bringup 教程都在这。欢迎观摩喜欢点个⭐仓库地址https://github.com/Awesome-Embedded-Learning-Studio/rk-forge静态网页https://awesome-embedded-learning-studio.github.io/rk-forge/rootfs 这程的第一步是把 rootfs 的内容弄出来。boot 系列后期我们靠一个手搓的静态 busybox initramfs 凑合过能拿到 shell 就行但这程要的是一份正规的、可维护的 rootfs所以上 buildroot。这章踩的全是构建侧的坑WSL 把 Windows 的 PATH 互操作进来、外部工具链的语言检查连环绊、glibc 把 RPC 挪走了。踩完你手里就有一份能烧能启的 busybox rootfs。前言为什么不再手搓boot 系列里我们先拿到 shell靠的是一个手搓的 initramfs——静态 busybox 加一个/init塞进 kernel FIT 当 ramdisk。能跑但那是为了快速验证启动链的凑合rootfs 内容全靠手维护加个工具要自己交叉编译、自己塞 overlay不可持续。rootfs 这程要的是正规流程所以上 buildroot。buildroot 会从源码给你编一整个最小 Linux 根文件系统——busybox、glibc 运行时、init 配置、FHS 目录结构一条make出齐。RK3506 是 Cortex-A7 / NEON-VFPv4工具链就用我们在 boot Ch1 钉死的那套/opt下的 Arm GNU 15.2和板上 bootRW 验过的完全一致不另起炉灶。材料buildroot 本体 我们的 BR2_EXTERNALbuildroot 本体我们用 loose 检出的上游 2026.08-devthird_party/buildroot/gitignored和 uboot/linux 的 explore 模式一样。我们的定制不直接改 buildroot而是通过一个BR2_EXTERNAL 树注入——board/aes/buildroot-external/这是 rk-forge 自有、进版本控制的里面放着configs/rk3506_aes_defconfig板级 defconfig、overlay/etc配置、init 脚本、post-build hook。调用时make BR2_EXTERNAL.../buildroot-external rk3506_aes_defconfigbuildroot 就会注册这棵外部树、读我们的 defconfig。这种本体 loose 定制走 BR2_EXTERNAL的结构不是洁癖是踩过坑才定的。当年git add -A把 buildroot 当 embedded git 仓gitlink加进去结果 clone 根本拿不到内容解法就是 buildroot 本体 gitignoreddefconfig 和 overlay 全挪进 BR2_EXTERNAL 这棵真正进版本控制的树。详细决策记在 notes/19。defconfig 的几个关键决策defconfig 里几个要紧的选择架构arm、cortex-a7、neon-vfpv4工具链用 external指向/optArm GNU 15.2不靠 buildroot 自己编一个init 走 busybox sysv init输出格式选了cpio给 initramfs 用加tar给 UBIFS staging 用。注意我们没开BR2_TARGET_ROOTFS_UBIFS——选了走 tar → 现有pack-ubifs.sh的路子先复用已经验证过的 NAND 打包管线而不是在 buildroot 里再开一条 UBIFS 直出的路。坑之一WSL 的 PATH 里带空格buildroot 当场拒跑第一个坑死得最快都没走到工具链校验。WSL 会把 Windows 的 PATH 互操作进来于是你的PATH里赫然躺着/mnt/c/Program Files/...这种带空格的条目。buildroot 的dependencies.mk:27一看 PATH 里有空格直接甩一句Your PATH contains spaces, TABs, and/or newline然后 exit 1连配置都不让你生成。这是个纯环境问题跟 buildroot、跟 defconfig 都没关系。修法是在跑 buildroot 之前把 PATH 里所有/mnt/*和含空白字符的条目剥掉再把工具链 bin 目录前置进去。具体写法见后面 canonical 调用里那一行trgrep -vE就是干这个的。坑之二外部工具链的语言检查C/Fortran/OpenMP 连环绊PATH 弄干净进到工具链校验连环坑来了。Arm GNU 工具链是全套——bin 里 g、gfortran 都有gcc 还带 OpenMP。buildroot 的check_cplusplus/check_fortran/check_openmp要求你的 defconfig 必须老老实实承认工具链实际带的每一种语言少承认一种configure 阶段就 exit 1。而且它还连着绊你补上 C下一个又卡 Fortran再下一个 OpenMP一个接一个。解法是 defconfig 里把这几项全开BR2_TOOLCHAIN_EXTERNAL_CXXy它会 selectBR2_INSTALL_LIBSTDCPP往 rootfs 装 libstdc几 MB174MiB 的 UBIFS 无所谓、BR2_TOOLCHAIN_EXTERNAL_FORTRANy、BR2_TOOLCHAIN_EXTERNAL_OPENMPy。D 语言不用管——这套工具链没 gdccheck 自动过。Fortran 和 OpenMP 只是能力声明、不装运行时C 会装 libstdc。坑之三glibc 2.42 把 RPC 挪走了语言检查过完又撞上check_glibc_rpc_feature报RPC support not available in C library, please disable BR2_TOOLCHAIN_EXTERNAL_INET_RPC。原因是 glibc 2.42 早就把 Sun RPC 从 libc 里挪走了迁去了 libtirpcsysroot 里根本没有rpc/rpc.h可BR2_TOOLCHAIN_EXTERNAL_INET_RPC对 glibc 又是默认 y所以你必须显式关掉它——defconfig 里写一行# BR2_TOOLCHAIN_EXTERNAL_INET_RPC is not set。这三个坑补完剩下的 checkkernel headers、gcc version、arm abi、MMU、SSP一路绿灯进 staging → busybox → rootfs出图。canonical 调用踩完坑定型的调用长这样cdthird_party/buildrootTC/opt/arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-linux-gnueabihfexportPATH$TC/bin:$(printf%s$PATH|tr:\n|grep-vE/mnt/|[[:space:]]|paste-sd:)makerk3506_aes_defconfig# 改了 defconfig 必须跑这个olddefconfig 不重读 defconfigmake那一长串printf | tr | grep -vE | paste就是把 PATH 里的/mnt/*和带空格的条目滤掉再前置工具链 bin——坑一的解法。下面两个易踩点要记牢一是改了configs/*.defconfig之后要跑make name_defconfig不是make olddefconfig——后者只对账现有.config、不重读 defconfig 文件这次语言标志第一次没生效就是栽在这二是别画蛇添足传Ooutputbuildroot 默认O$(CURDIR)/output已经把 build 树放进output/了、.config留 in-tree是上游设计不是 hack。成功长这样make跑完output/images/里就有了我们要的东西rootfs.cpio 8.21 MB ← 给 initramfs 用 rootfs.tar 8.76 MB ← 给 UBIFS staging 用里面的 busybox 是 ARM EABI5hard-floatld-linux-armhf.so.3动态链接/sbin/init是 busybox 的符号链接/etc/inittab|passwd|shadow齐全glibc 运行时加 libstdc 都在/libFHS 结构完整。一份正规的、能烧能启的最小 rootfs到手。这份 rootfs 烧进板子跑起来是 boot-sdl-202606181919 那轮——主线 U-Boot → ubiprog 置备 → switch_root →Welcome to rk-forge buildroot→ root 登录。不过那一轮里的 ubiprog 和持久化细节是 Ch3 的事这章你只要知道buildroot 出的这份 rootfs板上能跑进 shell。rootfs 的内容有了。但内核 handoff 到这份 rootfs、busybox init 把 shell 起起来中间还卡着两道 init 时序的暗门——一道是控制台被抢、一道是新根的/dev是空的。我们 Ch2 见。