Linux + buildroot 构建根文件系统

发布时间 2023-08-24 19:17:58作者: 掌控命运

一、开发背景

  原开发板的文件系统拥有很大的冗余文件,需要裁剪文件系统或者根据需要定制文件系统

二、开发需求

  1、构造最小系统,支持基本指令,例如 cd、ls、tar 等基础指令

三、开发环境

  Linux Ubuntu 4.15.0-65-generic + buildroot-2023.02.3 + i.mx6d(cortex-A9)

  buildroot 下载:https://buildroot.org/download.html (推荐使用长支持版本)

四、配置步骤

  make menuconfig:打开图形界面配置

  需要配置的选项包括一下:

  Target options --->       目标选项--->

  Toolchain --->        工具链--->

  Build options --->          生成选项--->

  System configuration --->   系统配置--->

  Kernel --->           内核--->

  Target packages --->     目标包--->

  Filesystem images --->    文件系统映像--->

  Bootloaders --->       引导加载程序--->

  Host utilities --->       主机实用程序--->

  Legacy config options --->   旧版配置选项--->

  参考链接:https://ost.51cto.com/posts/10482

  1、Target options 

    (1)Target Architecture:选择处理器架构,涉及到文件的存储方式,选择 (ARM (little endian)) ,一般 arm 选择小端模式

    (2)Target Architecture Variant:选择内核核心,armv7a cores 架构下的 cortex-A9

    (3)Enable NEON SIMD extension support:SIMD(单指令多数据流),针对视频和音频的扩展指令集加速,这里先不使能,没有这方面需求 

        参考链接:https://blog.csdn.net/whatday/article/details/87111526

    (4)Enable VFP extension support:向量浮点运算支持,可以加速浮点运算,这里建议打开,后面才能选择 EABIhf,硬件浮点运算。

    (5)Target ABI:(ABI: Application Binary Interface)选择应用的二进制接口,由于上面打开了 VFP 支持,所以这里选择 EABIhf

         EABIhf:Embedded Application Binary Interface Hard Float,这个选项需要考虑和交叉编译工具链保持一致,我的交叉工具是 arm-linux-gnueabihf

    (6)Floating point strategy:浮点策略,VFPv3 和 VFPv3-D16中选择一个,VFPv3 提供 32 个单精度运算寄存器和 32 个双精度运算寄存器

        VFPv3 = VFPv3-D32,VFPv3-D16 即是在原来的基础上把双精度浮点运算从32个减半变成16个,减少了资源,这里先选择 VFPv3-D16,速度不够再提升

    (7)ARM instruction set:指令集,保险起见选择 arm 指令集,可以考虑 Thumb2 指令集

      arm 指令集是 32 bit 的,Thumb2 指令集兼容 16 bit 和 32 bit 指令

       (8)Target Binary Format:二进制格式,没得选,直接 ELF

     最后配置截图: 

   2、Toolchain

    编译工具链配置,这里使用自定义的编译工具链

    (1)Toolchain type:工具链类型,直接选择 External toolchain,即外部工具链,buildroot 也有交叉编译工具链,一般不用

    (2)Toolchain:选择自定义工具链,即 Custom toolchain,可以从其他平台下载,不过一般都是用本地的

    (3)Toolchain origin:工具链源,这里选择 Pre-installed toolchain,即已安装,后面提供路径即可,如果从其他平台下载,这里也有下载选项

    (4)Toolchain path:工具链路径,即交叉编译工具链路径,注意:需要按住 ctrl 键才能删除,例如:/opt/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf 

        实际可执行路径:/opt/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/,根据自己的路径填写

        快速查看工具链路径:which arm-linux-gnueabihf-gcc,关键字 which

    (5)Toolchain prefix:工具链前缀,根据自己的交叉编译工具链写,$(ARCH)-linux-gnueabihf ,源编译链:arm-linux-gnueabihf

    (6)External toolchain gcc version:工具链 gcc 版本,命令行输入 arm-linux-gnueabihf-gcc -v 查询填写

    (7)External toolchain kernel headers series:编译工具链的内核版本,这个比较麻烦,找到编译工具链源码文件 version.h

      cat /opt/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/linux/version.h  

      

       如上图,找到版本文件,将数字 263680 转换成 16 进制 = 40600,即版本号 :4.06.00

      (8)External toolchain C library:C 语言库支持库,可选 uClibc、glibc 和 musl,这里选择 glibc

      uClibc 属于微型库,功能简单,不支持内存管理;glibc 相对庞大而功能齐全;musl 相对较新,不常用

    (9)Toolchain has SSP support? (Stack Smashing Protector),即栈溢出保护,SSP是一项重要的安全措施,选择打开

    (10)Toolchain has RPC support? (Remote Procedure Call),即远程调用功能,一般结合 NFS 使用,选择打开

    (11)Toolchain has C++ support? 这个就不用多说了,直接打开

    (12)Toolchain has D support? 这里的 D 指的是 D 语言,也是编程语言的一种,不打开

    (13)Toolchain has Fortran support?  这里的 Fortran 也是编程语言的一种,不打开

    (14)Toolchain has OpenMP support? 这里的 OpenMP 是并行设计方法,不打开

    (15)Copy gdb server to the Target:把 GDB 服务器拷贝到系统中,可以远程调试软件,这里先打开(文件可能比较大),后续可以研究一下

    (16)Copy gconv libraries:用于字符编码转换,先不打开

    (17)Extra toolchain libraries to be copied to target:可以指定路径,把库拷贝到目标系统,后续可以添加相关路径

    (18)Target Optimizations:优化相关,用法未知

    (19)Target linker options:目标连接器,用法未知

    最后配置截图:

   3、Build options

    这部分基本不用改,保持默认

  4、System configuration

    (1)Root FS skeleton 根文件系统骨架,实际上只是选择配置方式,这里选择默认 default target skeleton

    (2)System hostname 系统名,还是修改一下,根据自己实际情况编写

    (3)System banner 系统启动的欢迎语,根据自己实际情况编写

    (4)/dev management 设备 U 盘的挂载方式,这里选择 Dynamic using devtmpfs + mdev

       mdev 是 eudev 的简化版,详细参考:https://blog.csdn.net/bjr2016/article/details/103220862/

    (5)Enable root login with password 默认登录账户名 root

    (6)Root password 设置密码,根据自己实际情况编写

    (7)Run a getty (login prompt) after boot 设置登录串口属性

      1)TTY port 串口号,可以定死串口号,例如 ttymxc0,保留 console,串口号由 uboot 指定

      2)Baudrate 设置波特率,可以设置,也可以又内核决定,即 keep kernel default  

    (8)其他的视情况配置

    最后配置截图:

   5、Kernel

    这里只是构建文件系统,不需要内核,取消选中

    最后配置截图: 

   6、Target packages

    这里是文件安装包打包,先不修改

  7、Filesystem images

    这里是配置镜像文件属性的,暂时不动

  8、Bootloaders

    这里可以配置 uboot 等引导程序,考虑到只构建文件系统,取消所有选项

    最后配置截图:

   9、Host utilities

    这里是主机应用相关配置,先不动

  10、Legacy config options

    这里是遗留的旧配置选项,先不动

   11、最后执行 make,目标生成文件在 ./output/images/rootfs.tar