从0开始使用QEMU模拟ARM开发环境之buildroot构建linux根文件系统

  • Post author:
  • Post category:linux



buildroot官网链接


http://buildroot.uclibc.org/


相对于其他文件系统制作工具 buildroot 避免繁杂的移植工作,通过menuconfig配置我们需要的功能,不需要的功能去掉,再执行make指令编译,buildroot就会自动从指定的服务器上下载源码包,自动编译,自动搭建成我们所需要的嵌入式根文件系统。



从0开始使用QEMU模拟ARM开发环境系列一览表


从0开始使用QEMU模拟ARM开发环境系列一览表



特别注意:



0、Kernel:内核配置、Bootloaders:硬件启动程序为可选

Kernel:内核配置、Bootloaders:硬件启动程序为可选 如果自己在其他地方编译,不要勾选



1、下载速度慢解决

如果下载较慢可以手动下载后,放到buildroot/dl/对应目录下,比如 手动下载 linux-5.4.93.tar.xz 放到 buildroot/dl/linux 下 再重新 make

在这里插入图片描述



2、Bootloaders -> U-boot -> Board defconfig 填写

Board defconfig:根据情况填写,比如填写的是

qemu_arm ,它会在 buildroot根目录的 configs 文件夹中 查找 文件

,所以需要查看configs 文件夹支持的板子 ,如果 板子没有现成的需要拷贝一份修改



3、Kernel -> Linux Kernel -> Defconfig name 填写

Defconfig name: 会在

内核源码/arch/arm/configs中查找

,所以填写需要configs 文件夹中文件支持,如果 没有现成的需要拷贝一份修改(有能力的话),比如填写的 vexpress,查找时会自动补全为vexpress_defconfig



下载并安装buildroot

下载地址

https://buildroot.org/download.html

,获取buildroot源码包,我下载的是buildroot-2020.11.2.tar.gz

将源码包复制到/opt目录下,并解压

在这里插入图片描述



什么是buildroot

Buildroot是Linux平台上一个构建嵌入式Linux系统的框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到机器上运行的Linux系统软件(包含boot、kernel、rootfs以及rootfs中的各种库和应用程序)。



buildroot 的目录结构:



buildroot 根目录:

在这里插入图片描述



output子目录

在这里插入图片描述



buildroot 配置



查看支持的开发板

查看当前buildroot中支持的开发板

make list-defconfigs

进入解压后的buildroot目录,并执行

make menuconfig

在这里插入图片描述



配置说明

这里

不是实际操作配置

,只是列举各个选项并说明(不同版本buildroot,会有差异)。实际操作见

实际配置

要构建自己的开发板,首先要创建一个基本的 buildroot配置作为开发板的基本编译系统。这里包括toolchain,kernel,bootloader,filesystem 和一个简单的 busy-box 用户空间。

执行

make menuconfig

make menuconfig

在这里插入图片描述



Target options:目标板的配置
  • Target Architecture:目标架构,根据需要选择, 比如选择 ARM(little endian),ARM小端模式
  • Target Binary Format:二进制格式,根据需要选择, 比如为 ELF
  • Target Architecture Variant:根据需要选择, 比如架构变体为 Cortex-A9,内核类型 (vexpress-ca9)
  • Target ABI:应用程序二进制接口,根据需要选择, 比如为EABI
  • Floating point strategy:浮点数的策略,根据需要选择, 比如选择为 Soft float
  • ARM instruction set:arm 汇编指令集,根据需要选择, 比如选择 ARM

其他可默认或根据需要选择



Build options:

主要是一些buildroot编译时用到的选项,比如dl的路径,下载代码包使用的路径,同时运行多个编译的上限,是否使能编译器缓冲区等等,这里按照默认就行了。



Toolchain:工具链选项
  • Toolchain type:Buildroot提供两种方式使用toolchain

    • external toolthain:非Buildroot提供的交叉编译器,根据需要选择
    • Buildroot toolchain:Buildroot本身编译生成的Buildroot toolchain,根据需要选择, 比如

      直接选择此项
  • custom toolchain vendor name:可以改变,可以默认
  • C library:C库选择,根据需要选择, 比如选择

    glibc
  • Kernel Headers:内核头文件,根据需要选择, 比如

    Linux 5.4.x kernel headers 根据内核版本选择
  • Glibc Options:根据需要选择, 比如勾选 Install glibc utilities (注不同buildroot版本,可能不一样)
  • Binutils Version:

    binutils版本:根据需要选择, 比如2.34
  • Additional binutils options:附加的 binutils 选择,根据需要选择, 比如

    默认不填即可
  • GCC compiler Version:GCC版本选择,

    gcc 9.x

    根据需要选择
  • Additional gcc options:附件的GCC选项,根据需要选择, 比如

    默认不填即可
  • Enable C++ support:使能C++支持,根据需要选择, 比如

    勾选
  • Enable Fortran support:使能Fortran语言支持,

    不选

    或 根据需要选择
  • Enable D language support: 使能Fortran语言支持,

    不选

    或 根据需要选择
  • Enable compiler link-time-optimization support:是否支持LTO,

    不选

    ,LTO是什么:http://blog.csdn.net/fickyou/article/details/52381776
  • Enable compiler OpenMP support:根据需要选择, 比如

    不选
  • Enable graphite support :是否支持graphite。

    Graphite

    是应用WEB应用的一套开源的编程接口。

    不选

    。具体看百度百科:https://baike.baidu.com/item/Graphite/9810474?fr=aladdin
  • Build cross gdb for the host:主机上运行gdb进行调试,根据需要选择, 比如

    不选
  • Copy gconv libraries:拷贝 gconv库,gconv库用于在不同字符集之间进行转换。根据需要选择, 比如默认

    不选
  • Enable MMU support:使能 MMU,**勾选 **或 根据需要选择
  • Target Optimizations:根据需要选择, 比如

    不选
  • Target linker options:根据需要选择, 比如

    不选
  • Register toolchain within Eclipse Buildroot plug-in:eclipse插件支持,

    不选


System configuration:系统配置
  • Root FS skeleton: 根文件系统骨架, 根据需要选择, 比如

    默认
  • System hostname:系统主机名

    根据需要自己填写
  • System banner: 系统横幅,

    根据需要自己填写
  • Passwords encoding:密码编码,

    默认

    或 根据需要选择
  • Init system:系统初始化,根据需要选择, 比如选择

    BusyBox
  • /dev management:设备文件管理,根据需要选择, 比如选择

    Dynamic using devtmpfs + mdev

    ,即使用mdev动态加载设备节点的方式
  • Path to the permission tables:设备节点的配置表设置,根据需要选择
  • support extended attributes in device tables: 支持设备表中的扩展属性,

    不选

    或 根据需要选择
  • Use symlinks to /usr for /bin, /sbin and /lib:

    不选

    或 根据需要选择
  • Enable root login with password:使用密码启用root 登录,

    默认选择

    或 根据需要选择
  • Root password:进入linux控制台终端后的密码,为空则登录时不需要密码,默认登录用户名为root。为空。根据需要设置
  • /bin/sh (busybox’ default shell):

    默认

    或 根据需要选择
  • Run a getty (login prompt) after boot:

    默认选择

    或 根据需要选择

    • TTY port:根据需要配置,比如配置为 ttyAMA0,

      但是注意 可能和uboot中需要的不一样,可以该这里或者uboot
    • Baudrate :波特率,根据需要配置,比如配置为 115200
    • TERM environment variable:

      默认

      或 根据需要选择
    • other options to pass to getty:

      默认

      或 根据需要选择
  • remount root filesystem read-write during boot:在引导期间以读写方式重新挂载根文件系统,

    默认选择

    或 根据需要选择
  • Network interface to configure through DHCP:要通过DHCP配置的网络接口,

    默认

    不选 或 根据需要选择
  • Purge unwanted locales:清除不需要的区域设置,

    默认选择

    或 根据需要选择
  • Locales to keep:要保留的区域设置,

    默认

    或 根据需要选择
  • Generate locale data:生成本地日期,

    默认

    不选 或 根据需要选择
  • Enable Native Language Support (NLS) :启用本地语言支持(NLS),

    默认

    不选 或 根据需要选择
  • Install timezone info:安装时区信息,

    默认

    不选 或 根据需要选择
  • Path to the users tables:users tables路径,

    默认

    或 根据需要选择
  • Root filesystem overlay directories:根文件系统覆盖目录,

    默认

    或 根据需要选择
  • Custom scripts to run before creating filesystem images:创建文件系统映像之前要运行的自定义脚本。

    默认

    或 根据需要选择
  • Custom scripts to run inside the fakeroot environment:在fakeroot环境中运行的自定义脚本。

    默认

    或 根据需要选择
  • Custom scripts to run after creating filesystem images:创建文件系统映像后要运行的自定义脚本。

    默认

    或 根据需要选择


Kernel:内核配置

Linux Kernel 不选不编译 (如果不让 buildroot 编译 勿勾选)

  • Kernel version:内核版本,选择用户自定义,

    Custom version
  • Kernel version:填上自己所需要的版本,根据需要选择, 比如5.4.93
  • Custom kernel patches:自定义的内核补丁,

    默认

    不选 或 根据需要选择
  • Kernel configuration:内核配置,根据需要选择, 比如选择

    Using an in-tree defconfig file
  • Defconfig name:默认配置名称,根据需要填写,会在

    内核源码/arch/arm/configs中查找

    ,所以填写需要configs 文件夹中文件支持,如果 没有现成的需要拷贝一份修改(有能力的话),比如填写的 vexpress,查找时会自动补全为vexpress_defconfig
  • Additional configuration fragment files:其他配置片段文件,根据需要选择, 比如

    暂且不填写
  • Custom boot logo file path:自定义boot logo文件路径,根据需要选择, 比如

    暂且不填写
  • Kernel binary format:内核二进制文件格式,根据需要选择, 比如

    zImage
  • Kernel compression format:内核压缩格式,根据需要选择, 比如选择

    gzip
  • Build a Device Tree Blob:设备树,根据需要选择, 比如

    默认

    不选 或 根据需要选择
  • Install kernel image to /boot in target:将内核映像安装到目标中的/boot,根据需要选择, 比如

    默认

    不选
  • Needs host OpenSSL:需要主机OpenSSL,

    默认

    不选 或 根据需要选择
  • Needs host libelf:需要主机libelf,

    默认

    不选 或 根据需要选择
  • Linux Kernel Extensions:内核扩展,

    默认

    不选 或 根据需要选择
  • Linux Kernel Tools:内核工具,

    默认

    不选 或 根据需要选择


Target packages

目标应用软件,根据需要选择



Filesystem images:文件系统映像

选择 ext2/3/4 root filesystem 或 根据需要选择



Bootloaders:硬件启动程序

U-boot 不选不编译(如果不让 buildroot 编译 勿勾选)

选择为

U-boot

  • Build system:u-boot系统选择为

    Kconfig

    • legacy:若是选择2015.04之前的u-boot 选择此项
    • Kconfig:2015.04之后的 u-boot 选择此项,勾选此项
  • U-boot Version:U-boot版本,默认为 2020.10,根据需要选择, 比如选择为

    Custom version

  • U-Boot version:填写为2021.01, 注意 填之前 查看

    https://ftp.denx.de/pub/u-boot/

    中是否有对应版本,并且为 01而不是1

  • Custom U-boot patches:U-boot补丁,

    默认

    不选 或 根据需要选择

  • U-Boot configuration:U-boot配置,根据需要选择, 比如选择为:

    Using an in-tree board defconfig file

  • Board defconfig:根据情况填写,比如填写的是

    qemu_arm ,它会在 configs 文件夹中 查找 文件

    ,所以如果 板子没有现成的需要拷贝一份修改

  • Additional configuration fragment files:其他配置片段文件,

    默认

    不选 或 根据需要选择

  • U-boot needs dtc:是否需要设备树,

    默认

    不选 或 根据需要选择

  • U-Boot needs host Python:是否需要Python,

    默认

    不选 或 根据需要选择

  • U-Boot needs pylibfdt :是否需要pylibfdt ,

    默认

    不选 或 根据需要选择

  • U-Boot needs pyelftools:是否需要pyelftools,

    默认

    不选 或 根据需要选择

  • U-boot needs OpenSSL:是否需要 OpenSSL,

    默认

    不选 或 根据需要选择

  • U-Boot needs lzop:是否需要 lzop,

    默认

    不选 或 根据需要选择

  • U-boot binary format:二进制文件,选择

    .bin

  • produce a .ift signed image:

    默认

    不选 或 根据需要选择

  • Install U-boot SPL binary image:

    默认

    不选 或 根据需要选择

  • Device Tree Source file paths:

    默认

    不选 或 根据需要选择

  • Custom make options:

    默认

    不选 或 根据需要选择



Host utilities:主机应用程序


默认

或 根据需要选择



Legacy config options:传统配置选项


默认

或 根据需要选择




实际配置

configs 里面有各种厂商的开发板的配置文件,找到需要的

其他相关文章:


从0开始使用QEMU模拟ARM开发环境之编译 uboot、Linux 内核和 busybox 制作 rootfs 并仿真


从0开始使用QEMU模拟ARM开发环境之uboot通过sd卡加载uImage


从0开始使用QEMU模拟ARM开发环境之uboot通过tftp加载uImage并指定nfs挂载根文件系统

之前文章见上已经选择的是

vexpress_defconfig

所以 buildroot 同样选择

qemu_arm_vexpress_defconfig

在 buildroot 根目录下执行


sudo make qemu_arm_vexpress_defconfig


,将配置文件写入 并生成了一个

.config

的配置文件

再执行

sudo make menuconfig

在已有

.config

的基础上继续配置



设置root密码

system configuration 中,我设置的 root

在这里插入图片描述



根文件系统的格式选择

Filesystem images 中 我选择的 ext4

在这里插入图片描述



根文件系统打包格式

制作好根文件后,进行压缩生成一个根文件的压缩文件

在这里插入图片描述

其他不用改变,注意保存后退出



buildroot 编译

配置完所有内容后,配置工具将生成.config包含整个配置的 文件。该文件将由顶级Makefile读取。

要开始构建过程,只需运行:

sudo make -j6

编译过程中要联网,因为可能需要下载一些packages。编译后生成的文件夹格式的rootfs在buildroot/output/images/rootfs.tar。Buildroot输出存储在目录output/中。



根文件系统测试


从0开始使用QEMU模拟ARM开发环境之uboot通过tftp加载uImage并指定nfs挂载根文件系统

参考上面链接修改uboot,然后启动模拟器

sudo qemu-system-arm -M vexpress-a9 -m 256 -kernel u-boot -nographic -net nic,macaddr=00:16:3e:00:00:01 -net tap

如果按照上面链接操作会报如下错误

在这里插入图片描述

在制作的根文件/dev中 创建

sudo mknod ttyAMA0 c 204 64

重新启动模拟器测试

在这里插入图片描述

如果还是不行

参见

从0开始使用QEMU模拟ARM开发环境之uboot通过tftp加载uImage并指定nfs挂载根文件系统

的解决方法

希望我的文章对于大家有帮助,由于个人能力的局限性,文中可能存在一些问题,欢迎指正、补充!



版权声明:本文为leacock1991原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。