Buildroot根文件系统构建

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

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 参数等,最主要的就是选择所需要的第三方库或软件。一切配置好以后就可以进行编译,编译完成了以后就会在一个文件夹里面存放好编译结果,也就是根文件系统。

1.2 buildroot 下载

buildroot 源码肯定是要从 buildroot 官网下载,官网地址为 https://buildroot.org/,打开以后的官网界面如图所示:
Buildroot根文件系统构建_第1张图片
点击图中的“DOWNLOAD”按钮即可打开 buildroot 的下载界面,如所示:
Buildroot根文件系统构建_第2张图片
可以看出,在写本教程的时候最新的 LTS(长期支持版)版 buildroot 为 2019.02.6,分为.gz和.bz2 两种压缩格式,这里我就使用右侧的.bz2 压缩格式的源码,选中以后下载即可。

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根文件系统构建_第3张图片

接下来我们就依次配置 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 其实是可以自动下载交叉编译器的,但是都是从国外服务器下载的,
鉴于国内的网络环境,强烈推荐大家设置成自己所使用的交叉编译器。需要配置的项目和其对
应的内容如下:

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。

2.3配置 System configuration

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

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 ---> 此配置项下的文件全部选中

如图所示:
Buildroot根文件系统构建_第4张图片

3.2使能 alsa-utils

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

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

配置好以后如图所示:
Buildroot根文件系统构建_第5张图片
等待编译完成就可以使用新的根文件系统进行测试了,将 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 配置界面,
Buildroot根文件系统构建_第6张图片
上图就是我们最熟悉的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 系统。

你可能感兴趣的:(Linux学习之路)