Buildroot根文件系统构建

前面咱们学习了如何使用 busybox 来构建根文件系统,可是 busybox 构建的根文件系统不其全,不少东西须要咱们自行添加,好比 lib 库文件。在咱们后面的驱动开发中不少第三方软件也须要咱们本身去移植,这些第三方软件有不少又依赖其余的库文件,致使移植过程很是的繁琐。本章咱们来学习一下另一种实用的根文件系统构建方法,那就是使用 buildroot 来构建根文件系统。linux

1 何为 buildroot ?

1.1 buildroot 简介

咱们讲解了如何使用 busybox 构建文件系统,busybox 仅仅只是帮咱们构建好了一些经常使用的命令和文件,像 lib 库、/etc 目录下的一些文件都须要咱们本身手动建立,并且 busybox 构建的根文件系统默认没有用户名和密码设置。在后续的实验中,咱们还要本身去移植一些第三方软件和库,好比 alsa、iperf、mplayer 等等。那么有没有一种傻瓜式的方法或软件,它不只包含了 busybox 的功能,并且里面还集成了各类软件,须要什么软件就选择什么软件,不须要咱们去移植。答案确定是有的,buildroot 就是这样一种工具,buildroot比 busybox 更上一层楼,buildroot 不只集成了 busybox,并且还集成了各类常见的第三方库和软件,须要什么就选择什么,就跟咱们去吃自助餐同样,想吃什么就拿什么。buildroot 极大的方便了咱们嵌入式 Linux 开发人员构建实用的根文件系统。从 busybox 开始一步一步的构建根文件系统适合学习、了解根文件系统的组成,可是不适合作产品(主要是本身构建的话会有不少不完善、没有注意到的细节)。buildroot 会帮咱们处理好各类细节地方,是咱们的根文件系统更加的合理、有效。所以你们在作产品的时候推荐你们使用 buildroot 来构建本身的根文件系统,固然了,相似 buildroot 的软件还有不少,好比 yocto。
buildroot 和 uboot、Linux Kernel 很相似,咱们须要到其官网上下载源码,而后对其进行配置,好比设置交叉编译器、设置目标 CPU 参数等,最主要的就是选择所须要的第三方库或软件。一切配置好之后就能够进行编译,编译完成了之后就会在一个文件夹里面存放好编译结果,也就是根文件系统。web

1.2 buildroot 下载

buildroot 源码确定是要从 buildroot 官网下载,官网地址为 https://buildroot.org/,打开之后的官网界面如图所示:
在这里插入图片描述
点击图中的“DOWNLOAD”按钮便可打开 buildroot 的下载界面,如所示:
在这里插入图片描述
能够看出,在写本教程的时候最新的 LTS(长期支持版)版 buildroot 为 2019.02.6,分为.gz和.bz2 两种压缩格式,这里我就使用右侧的.bz2 压缩格式的源码,选中之后下载便可。ubuntu

2 buildroot 构建根文件系统

2.1 配置 buildroot

将 buildroot 源码 buildroot-2019.02.6.tar.bz2 拷贝到 ubuntu 中,也就是咱们前面建立的 tool目录下。拷贝完成之后对其进行解压,命令以下:tar -vxjf buildroot-2019.02.6.tar.bz2解压完成之后就会获得一个名为“buildroot-2019.02.6”的目录,此目录就是咱们解压获得
的 buildroot 源码,进入到此目录中,此目录下的文件如图所示:
在这里插入图片描述
buildroot 和 uboot、Linux kernel 同样也支持图形化配置,输入以下命令便可打开图形化配置界:
make menuconfig
打开之后的图形化配置界面如图所示:
在这里插入图片描述服务器

接下来咱们就依次配置 buildroot,配置完成之后就能够进行编译了。
1 、配置 Target options
首先配置 Target options 选项,须要配置的项目和其对应的内容以下(“=”号后面是配置项要选择的内容!):网络

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.2 配置 Toolchain

此配置项用于配置交叉编译工具链,也就是交叉编译器,这里设置为咱们本身所使用的交
叉编译器便可。buildroot 实际上是能够自动下载交叉编译器的,可是都是从国外服务器下载的,
鉴于国内的网络环境,强烈推荐你们设置成本身所使用的交叉编译器。须要配置的项目和其对
应的内容以下:app

Toolchain
-> Toolchain type = External toolchain
-> Toolchain = Custom toolchain //用户本身的交叉编译器
-> Toolchain origin = Pre-installed toolchain //预装的编译器
-> Toolchain path =/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf
-> 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) //选中

Toolchain 下几个比较重要的选项须要说明一下,以下所示:
Toolchain:设置为 Custom toolchain,表示使用用户本身的交叉编译器。
Toolchain origin:设置为 Pre-installed toolchain,表示使用预装的交叉编译器。
Toolchain path:设置本身安装的交叉编译器绝对路径!buildroot 要用到。
Toolchain prefix:设置交叉编译器前缀,要根据本身实际所使用的交叉编译器来设置,比
如咱们使用的是 arm-linux-gnueabihf-gcc,所以前缀就是$(ARCH)-linux-gnueabihf,其中 ARCH
咱们前面已经设置为了 arm。ide

2.3配置 System configuration

此选项用于设置一些系统配置,好比开发板名字、欢迎语、用户名、密码等。须要配置的
项目和其对应的内容以下:svg

System configuration
-> System hostname  = alpha_imx6ull //平台名字,自行设置
-> System banner = Welcome to alpha i.mx6ull //欢迎语
-> Init system = BusyBox  //使用 busybox
-> /dev management  = Dynamic using devtmpfs + mdev  //使用 mdev
-> [*] Enable root login with password (NEW) //使能登陆密码
-> Root password = 123456 //登陆密码为 123456

在 System configuration 选项中能够配置平台名字,登陆密码等信息。工具

2.4配置 Filesystem images

此选项配置咱们最终制做的根文件系统为何格式的,配置以下:学习

-> 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

对于 I.MX6U 来讲此选项不用配置,由于咱们是经过 Mfgtool 工具将根文件系统烧写到开发板上的 EMMC/SD 卡中,烧写的时候须要本身对根文件系统进行打包。

2.5 配置 Target packages

此选项用于配置要选择的第三方库或软件、好比 alsa-utils、ffmpeg、iperf 等工具,可是如今咱们先不选择第三方库,防止编译不下去!先编译一下最基本的根文件系统,若是没有问题的话在从新配置选择第三方库和软件。不然一口吃太多会容易撑着的,编译出问题的时候都不知道怎么找问题。

2.6编译 buildroot

配置完成之后就能够编译 buildroot 了,编译完成之后 buildroot 就会生成编译出来的根文件系统压缩包,咱们能够直接使用。输入以下命令开始编译:
sudo make //注意,必定要加 sudo,并且不能经过-jx 来指定多核编译!!!
buildroot 编译的时候会先从网上下载所需的软件源码,有些软件源码可能下载不下来,这个时候就须要咱们自行处理,这个后面会详细的讲解。
buildroot 编译过程会很耗时,可能须要几个小时,请耐心等待!
buildroot 由于要从网上下载源码,所以可能存在有些源码没法下载或下载很慢的状况。

3 buildroot 第三方软件和库的配置

我在前面学习的时候须要自行移植一些第三方的库和软件,好比 alsa-lib、alsa-utils 等等,如今咱们不须要自行移植这些第三方软件和库了,能够直接在 buildroot 里面配置使能。好比咱们如今配置使能 alsa-lib、alsa-utils 这两个软件和库。

3.1使能 alsa-lib

输入 make menuconfig,打开 buildroot 配置界面,配置路径以下:

Target packages
-> Libraries 
-> Audio/Sound
-> -*- alsa-lib ---> 此配置项下的文件所有选中

如图所示:
在这里插入图片描述

3.2使能 alsa-utils

接下来使能 alsa-utils,路径以下:

Target packages
-> Audio and video applications
-> alsa-utils  此目录下的软件所有选中

配置好之后如图所示:
在这里插入图片描述
等待编译完成就可使用新的根文件系统进行测试了,将 buildroot/images/rootfs.tar 拷贝到
nfs 目录下的 buildroot 目录中,而后从新解压。注意,之前本身添加的文件并不会被删除掉的,
解压命令以下:

tar -vxf rootfs.tar

解压完成之后就可使用 alsa-utils 相关的软件了,好比 alsamixer,想一想咱们曾经自行移植 alsa-utils 的时候,那个过程叫一个复杂。经过 buildroot 的话直接一个配置就能够搞定所有,方便快捷,你们能够自行尝试去配置使能一些其余的第三方库和软件。

4 buildroot 下的 busybox 配置

4.1 busybox 配置

buildroot 在构建根文件系统的时候也是要用到 busybox 的,既然用到了 busybox 那么就涉
及到 busybox 的配置。buildroot 会自动下载 busybox 压缩包,buildroot 下载的源码压缩包都存
放在/dl 目录下,在 dl 目录下就有一个叫作“busybox”的文件夹,此目录下保存着 busybox 压
缩包,如图所示:
在这里插入图片描述
能够看出,buildroot 下载的 busybox 版本为 1.29.3。要想编译 busybox,必须对图中的压缩包进行解压缩,buildroot 将全部解压缩后的软件保存在/output/build 软件中,咱们能够在找到/output/build/busybox-1.29.3 这个文件夹,此文件夹就是解压后的 busybox 源码。

若是你们想要修改 busybox 源码的话就直接找到相应的文件,而后修改便可。咱们如今是要配置 buildroot 下的 busybox,所以确定要打开 busybox 的配置界面,在 buildroot下打开 busybox 的配置界面输入以下命令:

sudo make busybox-menuconfig

输入之后就会打开 buildroot 下的 busybox 配置界面,
在这里插入图片描述
上图就是咱们最熟悉的busybox配置界面了,你们想要配置什么就直接操做就好了。

4.2 编译 busybox

配置好之后就能够从新编译 buildroot 下的 busybox,进入到 buildroot 源码目录下,输入以下命令查看当前 buildroot 全部配置了的目标软件包,也就是 packages:

sudo make show-targets

结果所示:在这里插入图片描述
图中列出了当前 buildroot 中全部使能了的 packages 包,其中就包括 busybox,若是咱们想单独编译并安装 busybox 的话执行下面命令便可:

sudo make busybox

上述命令就会从新编译 busybox。编译完成之后重现编译 buildroot,主要是对其进行打包,输入以下命令:

sudo make

从新编译完成之后查看一下 output/images 目录下 rootfs.tar 的建立时间是否为刚刚编译的,若是不是的话就删除掉 rootfs.tar,而后从新执行“sudo make”从新编译一下便可。最后咱们使用新的 rootfs.tar 启动 Linux 系统。