ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

29_实验二十八_buildroot配置与编译

29_实验二十八_buildroot配置与编译 实验二十八 buildroot 配置与编译——一条 menuconfig 造完整根文件系统对应课件《第6章 构建Linux根文件系统-V2》6.3 节上Slide 58-76系列说明本系列基于华清远见 FS-MP1ASTM32MP157A开发板对应课件《第6章 构建Linux根文件系统》。busybox 方案实验二十五~二十七已经全通但课件 6.3 开门见山数了它的三宗罪只有命令、目录要手动建默认没有用户名密码要加也繁琐移植第三方软件要手动搬库、依赖自己理。buildroot 把这些全自动化menuconfig 配一遍工具链选择、目录骨架、用户体系、第三方软件包依赖一条龙生成。半导体原厂常用 yoctoST 的出厂系统就是但它编译复杂、对网络要求高教学选 buildroot。前置实验二十七NFS 拓扑与流程就绪buildroot 产物直接进同一个 NFS 目录。一、buildroot 与 busybox 是什么关系不是替代是包含buildroot 生成的根文件系统里命令部分依然用 busyboxInit system 选 BusyBox、/dev 管理选 mdev——实验二十五配置过的那套buildroot 会自己编译一份buildroot 加码的是外围自动建全套目录、自动拷工具链的库、可配置用户名密码、数千个第三方软件包ssh、iperf、alsa…勾选即装、依赖自动理清。两套方案实验后并存rfs-busybox我们自己搭的与rfsbuildroot 出的各挂一个目录bootargs 改一行切换。二、实验环境实际项目实际值操作位置Ubuntu 虚拟机磁盘要留 10 GB 以上buildroot 编译产出大板子本篇不开编译器复用实验十九的/usr/local/arm/gcc-arm-9.2-...buildroot 配成 External toolchain 引用它不自己下工具链材料buildroot-2020.02.6.tar.bz25,568,633 字节md578f84db2d830c1792508d723cd2f9a44——已复制到本章目录与实验二十五的 busybox 同在04_构建Linux根文件系统/md5 与源一致拷进虚拟机共享目录解压即可网络编译时要在线下载第三方源码包步骤 5 讲对策开工自检10 秒arm-none-linux-gnueabihf-gcc -v报出版本gcc 9.2.1步骤 3.2 要用虚拟机 NAT 网卡在线磁盘df -h剩余 10G。三、课件 ↔ 步骤对应表课件 Slide内容对应步骤58~59busybox 方案的不足、buildroot 选型第一节60buildroot 2020.02.6 下载步骤 161~63Target options 六项步骤 264配说明file 命令验证大小端步骤 265~69Toolchain 十余项含 kernel headers 换算步骤 370~71System configuration用户名/密码步骤 472Filesystem images保留默认步骤 473禁编 Kernel 与 U-Boot步骤 474Target packages 勾 kmod步骤 475~76make 编译、取 rootfs.tar步骤 5本篇动作 → 后面谁用 → 现在含糊的后果本篇动作后面哪一篇要用现在含糊的后果output/images/rootfs.tar实验二十九解压到 NFS、微调、上板编译成功却不知道交付物是哪个文件Toolchain 指向 gcc-arm-9.2实验二十九起任何在 buildroot 里加包的编译工具链配错几百个包全部编译失败kernel headers 4.20.x 换算法以后换编译器版本时重配 buildroot靠猜配错直接 build 失败“禁编 Kernel/U-Boot”——负面配置防跑偏勾了它 buildroot 下载 mainline 内核自己编——没有板级适配、编几个小时还编不对make不带-j——buildroot 的规矩多线程下下载与解压竞态报错错得没头绪四、实验步骤步骤 1拿到源码Slide 60官网 https://buildroot.org 下载 2020.02.6课程资料包里已有buildroot-2020.02.6.tar.bz2拷进虚拟机共享目录解压cd共享目录tarxf buildroot-2020.02.6.tar.bz2# 解出 buildroot-2020.02.6/cdbuildroot-2020.02.6图课件 Slide 60——buildroot 官网首页口号 “Making Embedded Linux Easy”三特点——Can handle everything工具链/根文件系统/内核与 bootloader 一条龙、Is very easy类内核 menuconfig15~30 分钟出基本系统、Supports several thousand packagesX.org、Qt 5、GStreamer 等数千软件包。步骤 2Target options——板子是什么Slide 61~64makemenuconfig图课件 Slide 61——Buildroot 2020.02.6 配置主界面Target options、Build options、Toolchain、System configuration、Kernel、Target packages、Filesystem images、Bootloaders、Host utilities、Legacy config options。操作键与内核/busybox 的 menuconfig 同款——第 5~6 章三套 menuconfig 一脉相承。先认全 menuconfig 的三类项——busybox 那次只见过第①类①勾选项[ ]/[*]光标停在那行按空格切换选中/取消实验二十五的 Build static binary 就是它。②单选项()/(X)本篇的 Target Architecture、Target ABI 这些一组里只选一个像收音机按钮——光标停在那行按回车弹出选择列表方向键移到目标行按空格它前面的括号变成(X)同组其余项自动让位不存在全选再把光标移到底部Select回车退出。看到(X) ARM (little endian)就是已选对的状态不是让你把列表里每行都选上。③字符串项行尾括号里等着填字的如 Toolchain path、Root password回车进入编辑框敲入或粘贴内容再回车确认。Location 路径怎么读- Target options - Target Architecture 主界面上方向键把光标移到Target options ---行、回车进入再在子菜单里找Target Architecture那行操作。想改配置随时再跑一次make menuconfig——上次保存的内容都在。配置过程中用Esc在各级菜单间返回即可全部配完才在最外层退出并选Yes保存中途退出选了 Yes 保存重进都在。Target options 六项全是单选项照 Location 路径表逐项进、逐项选Location 路径设成- Target options - Target ArchitectureARM (little endian)- Target options - Target Binary FormatELF- Target options - Target Architecture Variantcortex-A7- Target options - Target ABIEABIhf- Target options - Floating point strategyNEON/VFPv4- Target options - ARM instruction setARM列表都是按字母排序cortex-A7在 Variant 列表的 C 段方向键往下翻。图课件 Slide 62——Target options 的六项参数Target Architecture ARM (little endian)、Target Binary Format ELF、Target Architecture Variant cortex-A7、Target ABI EABIhf、Floating point strategy NEON/VFPv4、ARM instruction set ARM。图课件 Slide 62——Target options 菜单标题小截图。六项与我们板子一一对应课件 Slide 64 的配置说明小端ARM 默认、ELFLinux 可执行程序的格式、cortex-A7STM32MP157 的 A 核——M4 那核 Linux 不用、EABIhf NEON/VFPv4实验十九讲编译器命名时的 hard float、ARM 指令集。图课件 Slide 63——六项配置完成后的 Target options 菜单截图每项的括号里显示所选值。图课件 Slide 64——file bin/busybox验证法输出ELF 32-bit LSB executable, ARM, EABI5 ... dynamically linked, interpreter /lib/ld-linux-armhf.so.3——LSB little endian不确定大小端时拿编好的程序用 file 一看便知。顺手注意interpreter /lib/ld-linux-armhf.so.3——实验二十五拷的那个加载器正是它。别现在就敲file bin/busybox——那是课件在已经编好的系统上的认知演示bin/busybox要等 buildroot 编译完才存在在output/target/bin/里现在敲必报No such file or directory不是配置错了。而且大小端不用等它下面 grep 里的BR2_ENDIAN直接就能验。步骤 2 就地验证configuration written to .config 已写盘grep 六项的落点grep-EBR2_army|BR2_cortex_a7y|BR2_ARM_EABIHFy|BR2_ARM_FPU_NEON_VFPV4y|BR2_ARM_INSTRUCTIONS_ARMy.config# 应恰打出五行、全部以 y 结尾——五项选择各落一个符号grep-E^BR2_ARCH|^BR2_ENDIAN.config# 应见 BR2_ARCHarm 与 BR2_ENDIANLITTLE实测注意大写 LITTLE——架构与大小端在此确认ELF 是 ARM 唯一的二进制格式无独立符号可查图实测——步骤 2 就地验证两条 grep 的输出恰五行全yBR2_ARCHarm、BR2_ENDIANLITTLE。步骤 3Toolchain——用哪套编译器Slide 65~69进菜单make menuconfig回主界面 → 方向键把光标移到Toolchain ---行 →回车进入→ 从上往下按表配本步配完Esc返回主界面步骤 4 还要进 System configuration最后一起退出保存。动手前先解决表里两个不能照抄、要现场查的值——gcc 版本与kernel headers 版本第一查gcc 版本开工自检跑过这里正式入册arm-none-linux-gnueabihf-gcc-v21|tail-1# 末行gcc version 9.2.1 20191025 ... → 菜单里选 9.x图课件 Slide 68——arm-none-linux-gnueabihf-gcc -v输出末行gcc version 9.2.1 ... (arm-9.10)红框标出——对应菜单里的9.x。第二查kernel headers 版本课件 Slide 69 的五步算法值得学一遍——以后任何工具链都这么查find/usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf-nameversion.h# 会打出三条认准以 /arm-none-linux-gnueabihf/libc/usr/include/linux/version.h 结尾的那条# dvb/version.h 是 DVB 子系统的、plugin/include/version.h 是 gcc 插件自己的都不是目标cat/usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/libc/usr/include/linux/version.h|grepLINUX_VERSION_CODE# 实测打出#define LINUX_VERSION_CODE 267277图课件 Slide 69——version.h 内容#define LINUX_VERSION_CODE 267277、#define KERNEL_VERSION(a,b,c) (((a) 16) ((b) 8) (c))。图课件 Slide 69——267277十进制放大截图。图课件 Slide 69——KERNEL_VERSION宏定义放大截图。换算267277十进制→ 0x4140D十六进制→ 按 KERNEL_VERSION 宏反推从低位两位一组拆成04.14.0D→ 各组转十进制 →4.20.13→ 菜单里选4.20.x。宏的定义a16 b8 c就是这套算法的出处——版本号三段分别占 16/8/0 位。两个值到手选9.x与4.20.x现在按 Location 路径表逐项配单选的走回车→空格→Select流程字符串的回车进编辑框照抄勾选的空格Location 路径设成类型- Toolchain - Toolchain type (External toolchain)External toolchain单选- Toolchain - Toolchain (Custom toolchain)Custom toolchain单选选了 External 才冒出来- Toolchain - Toolchain originPre-installed toolchain单选- Toolchain - Toolchain path/usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf字符串实验十九装的目录绝对路径照抄- Toolchain - Toolchain prefix$(ARCH)-none-linux-gnueabihf字符串$(ARCH)原样照抄buildroot 会自己替换成arm- Toolchain - External toolchain gcc version9.x单选值来自上面第一查- Toolchain - External toolchain kernel headers series4.20.x单选值来自上面第二查- Toolchain - External toolchain C libraryglibc/eglibc单选- Toolchain - Toolchain has SSP support?[*]勾选- Toolchain - Toolchain has RPC support?[*]勾选- Toolchain - Toolchain has C support?[*]勾选- Toolchain - Enable MMU support[*]勾选注意顺序Toolchain path/prefix/gcc version/kernel headers这些子项要先把Toolchain type选成External toolchain、Toolchain选成Custom toolchain才会出现——从上往下按表配正好。图课件 Slide 65——Toolchain 配置一Toolchain type External toolchain、Toolchain Custom toolchain、Toolchain origin Pre-installed toolchain、Toolchain path /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf、Toolchain prefix $(ARCH)-none-linux-gnueabihf、External toolchain gcc version 9.x、External toolchain kernel headers series 4.20.x、External toolchain C library glibc/eglibc、[] Toolchain has SSP support?、[] Toolchain has RPC support?。图课件 Slide 65——Toolchain 配置续[] Toolchain has C support? 选中[] Enable MMU support 选中。图实测——Toolchain 子菜单按表配置中前三项单选与 path/prefix 两个字符串项红框已就位gcc version (9.x)、kernel headers (4.20.x)、C library (glibc/eglibc)SSP/SSP strong/RPC 三项已[*]红箭头。注意拍摄时Toolchain has C support?还是[ ]——它在菜单更下面十二项配全再出来Enable MMU support已[*]。为什么这么配两条关键选择的理由配完回头看为什么选 External外部工具链buildroot 也能自己下载构建一套Buildtoolchain 选项但要从网上下载、极慢我们实验十九装好的现成货直接引用。为什么必须是 ARM 官方这套课件 Slide 66~67 给了源码级证据——buildroot 的源码/toolchain/helpers.mk里check_unusable_toolchain明确拒绝两类发行版系统工具链--sysroot返回 “/” 的Ubuntu 自带 gcc 属此列与ST 官方 SDK 工具链-print-file-name返回裸libc.a、无 sysroot 的——第 3 章那句SDK 编译器麻烦在 buildroot 这里有代码背书。图课件 Slide 67——helpers.mk 的 check_unusable_toolchain 代码截图with_sysroot /时报 “Distribution toolchains are unsuitable for use by Buildroot…”系统工具链不可用libc_a_path libc.a时报 “Unable to detect the toolchain sysroot…”ST 工具链不可用。步骤 4System configuration、Filesystem images 与两禁一勾Slide 70~74)System configuration 照 Location 路径表逐项配Location 路径设成类型- System configuration - System hostnameATK-stm32mp1字符串课件值可自定如fsmp1a-buildroot- System configuration - System bannerWelcome to alientek STM32MP157字符串登录横幅可自定- System configuration - Init systemBusyBox单选- System configuration - /dev managementDynamic using devtmpfs mdev单选- System configuration - Enable root login with password[*]勾选必勾课件红字三感叹号——不勾无法登录- System configuration - Root password123字符串自定义密码与课件不同课件示例123456我们特意改成短的123——设了什么实验二十九登录板子就用什么图课件 Slide 70——System configuration 参考配置System hostname ATK-stm32mp1自定可改fsmp1a-buildroot、System banner Welcome to alientek STM32MP157自定、Init system BusyBox、/dev management Dynamic using devtmpfs mdev、[*] Enable root login with password (NEW)、Root password 123456。Init system BusyBox、/dev management ... mdev——buildroot 内部帮我们做了实验二十五/二十六的 busybox 配置与 rcS 那套Enable root login with password必须勾课件红字三感叹号——不勾无法登录密码是自定义的123跟课件的123456不一样——设了什么实验二十九登录板子就用什么。图实测——System configuration 六项完成实况hostname (ATK-stm32mp1)、banner (Welcome to alientek STM32MP157)、Init system (BusyBox)、/dev management (Dynamic using devtmpfs mdev)、[*] Enable root login with password已勾红箭头、Root password (123)——自定义密码课件示例 123456实验二十九登录就用它。Filesystem images 保持课件默认即可课件 Slide 72本阶段先出 rootfs.tar 手动微调微调好再回头勾 ext4 映像菜单里 ext2/3/4 ext4、exact size 1G 等是将来烧卡时用的——实测机上这几项本来就是勾好的状态见下面第二张图你如果手动动过也不碍事判据只有一条[*] tar the root filesystem必须在rootfs.tar 就照出图课件 Slide 72——Filesystem images 参考配置[] ext2/3/4 root filesystemeMMC/SD 用 ext4、ext2/3/4 variant ext4、exact size 1G、[] ubi image containing an ubifs root filesystemNAND 用——本阶段保留默认即可。图实测——Filesystem images 实际状态与课件 Slide 72 图一致[*] ext2/3/4 root filesystemvariant ext4、exact size 1G红框/红箭头[*] tar the root filesystem[*] ubi image containing an ubifs root filesystem。本篇真正要的是[*] tar the root filesystem——rootfs.tar实验二十九的交付物ext4/ubi 只是 buildroot 顺手多生成几个镜像文件代价是编译时间与磁盘多一点rootfs.tar 照出不冲突、不用回滚。两禁buildroot 不编内核与 U-Boot——它只会下载官方 mainline 版、没有板级适配我们第 3/5 章的成果直接拿来用图课件 Slide 73——- Kernel - [ ] Linux Kernel红字不要选择编译 Linux Kernel 选项图课件 Slide 73——- Bootloaders - [ ] U-Boot红字不要选择编译 U-Boot 选项一勾Target packages → System tools →[*] kmod——内核模块工具第 7 章驱动要用buildroot 自带的 kmod 比busybox 的 modutils 功能全实测补充2026-09-28勾上 kmod 重编后output/target里只有libkmod.so库三件59,088 字节rootfs.tar 增量的本体——没有 kmod 命令、也没有 depmodbuildroot 的 kmod 包默认只带来库。depmod这个命令要从 busybox 里出课件 Slide 81 说的depmod 需在 busybox 中使能就是它make busybox-menuconfig→ Linux Module Utilities →[*] depmod实验二十九步骤 3 实测兑现。图课件 Slide 74——- Target packages - System tools - [*] kmod使能内核模块相关命令depmod 等。配置完成退出 Save。就地验证grep-EBR2_army|BR2_cortex_a7y.config# 架构两行grep-EBR2_TOOLCHAIN_EXTERNAL_CUSTOMy|BR2_PACKAGE_KMODy.config# 工具链与 kmodgrep-EBR2_LINUX_KERNEL|BR2_TARGET_UBOOT.config# 应无输出两禁生效图实测终态——三条 grep 全部通过架构两行 工具链行 BR2_PACKAGE_KMODykmod 补勾后的复验此前首验在这个位置只有工具链一行、kmod 缺席漏勾与补救全过程记在完成标志里 两禁无输出 ✓。步骤 5make 编译取 rootfs.tarSlide 75~76make# 注意不带 -jbuildroot 自己调度并行下载是第一关编译中会从各软件官网拉源码包国外源慢是常态课件截图里 cmake 包预计 71 分钟。对策课件原方案CtrlC 终止看报错/进度里在下的那个包名手动从镜像下载后放进buildroot源码/dl/目录再make续跑——buildroot 认 dl 里已有的包。图课件 Slide 75——编译时的下载现场从 cmake.org 拉 cmake-3.8.2.tar.gz速度 2.00KB/s、预计 71 分钟红框——这不是卡死是源太慢按上述对策换手动下载进 dl 目录。编译时间以几十分钟计虚拟机 4GB 内存、单线程调度。成功后看交付物lsoutput/images/# rootfs.tar —— 本篇要取的文件ext2/ext4/ubi/ubifs 是 Filesystem images 里勾了映像# 顺带生成的实测五个都在本篇用不到放着即可rootfs.tar 是整棵根文件系统的打包不是压缩镜像是 tar 包搬进 NFScpoutput/images/rootfs.tar /home/cnu/nfsboot/cd/home/cnu/nfsbootmkdirrfs-buildroottarxf rootfs.tar-Crfs-buildrootlsrfs-buildroot# 完整目录树bin dev etc lib ... usr var与 busybox 版对照看多了什么课件把 buildroot 产物目录直接叫rfs——我们已经有 busybox 版占着rfs名字另起rfs-buildroot实验二十九的 bootargs 指向它想换回 busybox 版只需把 bootargs 的 nfsroot 路径改回去。图实测——步骤 5 全程一屏ls output/images/打出五个产物ext2/ext4/tar绿框/ubi/ubifs——映像全生成了这就是 Filesystem images 勾了 ext4 与 ubi 的直接后果cp进 NFS 目录解包后ls rfs-buildroot打出18 样——比 busybox 版13 样多出lib32、media、opt、run等buildroot 的目录骨架就是全。五、注意事项make不要加-jbuildroot 自己做任务级并行外加-j反而把下载/解压搅出竞态错误。下载卡住不是死机看屏幕上正在拉的包名与 URL手动下进dl/再续make下载 URL 都在output/build/各包目录的.stamp_downloaded附近可查。Toolchain path 填到bin 的祖父目录即包含arm-none-linux-gnueabihf/bin/的那一层/usr/local/arm/gcc-arm-9.2-...prefix 填$(ARCH)-none-linux-gnueabihf——buildroot 自动展开$(ARCH)arm。两禁必须落实勾了 Kernel/U-Boot 的 buildroot 会去下 mainline 源码自编无板级适配、必失败白烧几小时。Enable root login with password不勾的话板子上登录不进去没有可用凭据这是课件红字级别的要求。编译失败先看最后 30 行日志make 21 | tee build.log是好习惯绝大多数是下载失败——回 dl 目录对策。六、验证点一览验证点命令通过的样子在哪一步敲工具链可用arm-none-linux-gnueabihf-gcc -v末行gcc version 9.2.1开工自检架构配置grep BR2_cortex_a7y .configBR2_cortex_a7y步骤 2工具链指向grep BR2_TOOLCHAIN_EXTERNAL_CUSTOMy .config有输出path 值指到 gcc-arm-9.2 目录步骤 3kernel headersversion.h 的LINUX_VERSION_CODE换算267277 → 4.20.13 → 菜单4.20.x步骤 3两禁生效grep BR2_LINUX_KERNEL|BR2_TARGET_UBOOT .config无输出步骤 4kmod 已勾grep BR2_PACKAGE_KMOD .configBR2_PACKAGE_KMODy打出# ... is not set 没勾上步骤 4root 密码勾选grep BR2_TARGET_GENERIC_ROOT_PASSWD .config有值空密码也是 且 LOGIN 开关在步骤 4编译成功ls -l output/images/rootfs.tar文件存在实测3,450,880 字节 ≈ 3.3 MiB含 kmod首编 3,389,440 不含——最小系统就这么大别等几十 MB步骤 5产物解包ls /home/cnu/nfsboot/rfs-buildroot完整目录树bin dev etc lib proc …步骤 5不达标时的排查现象先查什么menuconfig 里找不到某项/键搜符号名如BR2_PACKAGE_KMOD看依赖与所在菜单编译一开始就报 toolchain 相关Toolchain path/prefix 拼写gcc 版本与 kernel headers 选对没步骤 3 的两处查出来报Distribution toolchains are unsuitable工具链选错成系统 gcc——按 helpers.mk 的两条判据Slide 67核对编译中停在某个包下载不是死机——记下包名手动下进dl/重新make编译报错在某个包看最后 30 行多为下载不完整——删output/build/包名与 dl 里的坏包重编磁盘满buildroot 产出 10 GB 量级df -h先看清理output/重建七、实验完成标志buildroot-2020.02.6 解压就位menuconfig 六站配置完成Target options 六项、ToolchainExternal/Custom/Pre-installed path/prefix/gcc 9.x/headers 4.20.x/glibc/SSP/RPC/C/MMU、System configurationhostname/banner/BusyBox init/mdev/root 登录自定义密码123、Filesystem images 保持课件默认实测状态与 Slide 72 一致、Kernel 与 U-Boot 双禁步骤 2~4 实测图 07/14/17/19/20.config的 grep 验证全部符合步骤 4 实测图 20kmod 首验漏勾grep见# BR2_PACKAGE_KMOD is not set回菜单按/搜 KMOD 定位补勾、重编后打出BR2_PACKAGE_KMODy步骤 4 实测勾 kmod 只带来libkmod.so库depmod 命令仍缺depmod 在实验二十九经 busybox-menuconfig 兑现make编译成功output/images/生成 rootfs.tar 等五个产物rootfs.tar 终值实测3,450,880 字节首编 3,389,440——多出的 61,440 就是补勾 kmod 的体量映像类是 Filesystem images 勾选的顺带产物步骤 5 实测图 25rootfs.tar 已解包到/home/cnu/nfsboot/rfs-buildroot目录树 18 样完整步骤 5 实测图 25八、下一步buildroot 根文件系统微调buildroot 出的根文件系统拿去就能启动但课件预备了四个见面礼Set UID 权限错误、/lib/modules 缺目录、depmod/modules.dep 报错、命令行提示符不合心意——下一篇实验二十九逐个化解并点火验收顺带把 debugfs 挂载脚本与启动时自动跑 S 开头脚本的机制一起学了。
返回列表