手把手教你用 buildroot 构建根文件系统

2021-07-07 10:12:11 浏览数 (1)

嵌入式系统三大部分:bootloader(uboot)、Linux内核、根文件系统。

制作根文件系统有三大神器:busybox、buildroot、yocto。

使用 busybox 构建文件系统,仅仅只是帮我们构建好了一些常用的命令和文件,像 lib 库、/etc 目录下的一些文件都需要自己手动创建,我们还要自己去移植一些第三方软件和库,比如 alsa、iperf、mplayer 等等。而且 busybox 构建的根文件系统默认没有用户名和密码设置。

如果想要构建完整的根文件系统,大家一般都是使用buildroot,它不仅包含了 busybox 的功能,而且里面还集成了各种软件,需要什么软件就选择什么软件,不需要我们去移植。buildroot 极大的方便了我们嵌入式 Linux 开发人员构建实用的根文件系统。

至于 yocto 构建根文件系统,过于复杂,需要时间也很久,我们一般不会选择这一种方式。

buildroot 下载

buildroot 源码肯定是要从 buildroot 官网下载,官网地址为 https://buildroot.org/。

下载后解压如图:

buildroot 和 uboot、Linux kernel 一样也支持图形化配置,输入如下命令即可打开图形化配置界:

代码语言:javascript复制
make menuconfig
1、配置 Target options
代码语言:javascript复制
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

2、配置 Toolchain

此配置项用于配置交叉编译工具链,设置为我们自己所使用的交叉编译器,必须是绝对路径。

目前,在ARM Linux的开发中,人们趋向于使用Linaro( http://www.linaro.org/ )工具链团队维护的ARM工具链,它以每月一次的 形式发布新的版本,编译好的可执行文件可从网址 http://www.linaro.org/downloads/ 下载。Linaro是ARM Linux领域中最著名最具技术成就的开源组织,其会员包括ARM、Broadcom、Samsung、TI、Qualcomm等,国内的海思、中兴、全志和中国台湾的MediaTek 也是它的会员。

一个典型的ARM Linux工具链包含arm-linux-gnueabihf-gcc(后续工具省略前缀)、strip、gcc、objdump、ld、gprof、nm、readelf、 addr2line等。前缀中的“hf”显 示该工具链是完全的硬浮点。

代码语言:javascript复制
Toolchain
  -> Toolchain type = External toolchain
  -> Toolchain = Custom toolchain //用户自己的交叉编译器
  -> Toolchain origin = Pre-installed toolchain //预装的编译器
  -> Toolchain path =   //编译器绝对路径 
  -> Toolchain prefix = $(ARCH)-linux-gnueabihf //前缀
  -> External toolchain gcc version = 4.9.x
  -> External toolchain kernel headers series = 4.1.x
  -> External toolchain C library = glibc/eglibc 
  -> [*] Toolchain has SSP support? (NEW) //选中
  -> [*] Toolchain has RPC support? (NEW) //选中
  -> [*] Toolchain has C   support? //选中
  -> [*] Enable MMU support (NEW) //选中
3、配置 System configuration

用于设置一些系统配置,比如开发板名字、欢迎语、用户名、密码等。

代码语言:javascript复制
System configuration
 -> System hostname = Jasonangel //平台名字,自行设置
 -> System banner = Welcome to xxxxx //欢迎语
 -> Init system = BusyBox //使用 busybox
 -> /dev management = Dynamic using devtmpfs   mdev //使用 mdev
 -> [*] Enable root login with password (NEW) //使能登录密码
  -> Root password = 123456 //登录密码为 123456
4、配置 Filesystem images

此选项配置我们最终制作的根文件系统为什么格式的,配置如下:

代码语言:javascript复制
-> Filesystem images
 -> [*] ext2/3/4 root filesystem //如果是 EMMC 或 SD 卡的话就用 ext3/ext4
  -> ext2/3/4 variant = ext4 //选择 ext4 格式
 -> [*] ubi image containing an ubifs root filesystem //如果使用 NAND 的话就用 ubifs
5、禁止编译 Linux 内核和 uboot

buildroot 不仅仅能构建根文件系统,也可以编译 linux 内核和 uboot。当配置 buildroot,使能 linux 内核和 uboot 以后 buildroot 就会自动下载最新的 linux 内核和 uboot 源码并编译。但是我们一般都不会使用 buildroot 下载的 linux 内核和 uboot,因为 buildroot 下载的 linux 和 uboot官方源码,里面会缺少很多驱动文件,而且最新的 linux 内核和 uboot 会对编译器版本号有要求,可能导致编译失败。因此我们需要配置 buildroot,关闭 linux 内核和 uboot 的编译,只使用buildroot 来构建根文件系统,首先是禁止 Linux 内核的编译,配置如下:

代码语言:javascript复制
-> Kernel 
 -> [ ] Linux Kernel //不要选择编译 Linux Kernel 选项!

接着禁止编译 Uboot,配置如下:

代码语言:javascript复制
-> Bootloaders 
-> [ ] U-Boot //不要选择编译 U-Boot 选项!
6、配置 Target packages

此选项用于配置要选择的第三方库或软件、比如 alsa-utils、ffmpeg、iperf、ftp、ssh等工具,可以按需选择。

配置完成以后就可以编译 buildroot 了,编译完成以后 buildroot 就会生成编译出来的根文件系统压缩包,我们可以直接使用。输入如下命令开始编译:

代码语言:javascript复制
sudo make //注意,一定要加 sudo,而且不能通过-jx 来指定多核编译!!!

buildroot 编译过程会很耗时,请耐心等待!编译完成以后就会在 buildroot-2019.02.6/output/images 下生成根文件系统,即可使用。

编译过程需要一定的额外内存,注意需要留好内存,否则会报错如下:

代码语言:javascript复制
g  : internal compiler error: Killed (program cc1plus)
Please submit a full bug report
buildroot 下的 busybox 配置

buildroot 在构建根文件系统的时候也是要用到 busybox 的,既然用到了 busybox 那么就涉及到 busybox 的配置。buildroot 会自动下载 busybox 压缩包,buildroot 下载的源码压缩包都存放在/dl 目录下,在 dl 目录下就有一个叫做“busybox”的文件夹,此目录下保存着 busybox 压缩包。

在 buildroot下打开 busybox 的配置界面输入如下命令:

代码语言:javascript复制
sudo make busybox-menuconfig

输入以后就会打开 buildroot 下的 busybox 配置界面,需要什么功能,使能即可。可以在busybox中修改文件,使其对中文支持,这一点可以百度设置。

编译完毕以后,会生成 rootfs.tar,拷贝出来以后,可以对其进行解压然后使用nfs挂载到板子上,或者直接使用SD卡烧录。编译出来的文件系统即可使用,如果需要什么命令和工具,在 make menuconfig 中使能再次编译即可。

0 人点赞