Buildroot根文件系统的构建(已停止支持)

注解

由于LubanCat专用镜像已停止支持,本小节内容仅做参考。

什么是Buildroot?

Buildroot是Linux平台上一个开源的嵌入式Linux系统自动构建框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。 你可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到机器上运行的Linux系统软件。

借助LubanCat-SDK,我们可以更方便的进行Buildroot根文件系统的构建和Buildroot系统镜像的制作。

LubanCat-SDK使用了Buildroot-2018.02版本的软件开发包,其包含了基于Linux系统开发⽤到的各种系统源码, 驱动,⼯具,应⽤软件包。

Buildroot 有以下⼏点优势:

  • 通过源码构建,有很⼤的灵活性;

  • ⽅便的交叉编译环境,可以进⾏快速构建;

  • ⽅便各系统组件配置及定制开发。

使⽤ Buildroot最出名的项目就是Openwrt,由它制作出的镜像可以跑在搭载16Mb SPI Flash的路由器上, 系统基本没包含多余的东西。得益于Buildroot的简单化,整个Buildroot project 可以在⼀个git仓库维护。 Buildroot使⽤kconfig和make,⼀个defconfig配置代表⼀种BSP⽀持。

提示

LubanCat-SDK对Buildroot系统仅提供有限支持,不建议非资深开发者使用。 并且部分使用的资源涉及rockchip开源资料,除LubanCat-SDK提供的内容外, 如需添加额外功能或修改配置文件,需要自行从rockchip开源仓库添加。

Buildroot-dl

如果需要编译专用镜像,会进行Recovery分区镜像的构建,此分区构建借助Buildroot来生成,会使用网络下载一些软件包源码。 但由于部分用户网络不佳,下载速度慢,下载时间长,最终导致编译失败。为此我们提供下载好的源码压缩包供用户使用。

访问百度网盘:8-SDK源码压缩包/buidlroot-dl-xxx.7z 下载最近日期的压缩包即可。

提示

此压缩包与buildroot版本匹配,发布日期不一定与最新的SDK发布日期相同,使用最新版本即可。

下载完成后我们将buidlroot-dl-xxx.7z移动到LubanCat_SDK目录下解压,解压后的文件保存在buildroot/dl目录中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 安装7z压缩工具
sudo apt install p7zip-full

# 将下载的SDK源码移动到LubanCat_SDK目录下,xxx为日期
mv buidlroot-dl-*.7z ~/LubanCat_SDK

# 进入LubanCat_SDK目录
cd ~/LubanCat_SDK

# 解压SDK压缩包
7z x buidlroot-dl-*.7z

Buildroot构建

由于LubanCat-SDK中就已经包含了编译所需的Buildroot源码和工具链,我们可以直接进行编译。

在构建Buildroot根文件系统前,我们先要根据对应的板卡选择SDK配置文件

1
2
3
4
5
# 列出所有SDK配置文件并选择
./build.sh lunch

# 直接配置LubanCat2-buildroot配置文件为默认配置文件
./build.sh BoardConfig-LubanCat2-buildroot.mk
../../_images/buildroot01.png

SDK的配置文件设置完成之后,我们就可以开始编译构建了。

1
2
3
4
5
# 一键编译完整的Buildroot系统镜像
./build.sh

# 只构建Buildroot根文件系统
./build.sh buildroot
../../_images/buildroot02.png

提示

在buildroot构建时,会下载大量的软件包源码存放在buildroot/dl目录下, 由于大部分源码服务器都在国外,所以编译时请保证网络畅通和较高的源码压缩包下载速度, 否则会导致构建时间过长或构建失败。

修改Buildroot配置文件

LubanCat-SDK自带的Buildroot仅为演示用途,配置文件和外部app,软件包等仅实现了最基本的功能, 如果要修改配置文件,有时需要自行添加额外的源码仓库,这些仓库都存储在rockchip开源git仓库中, 地址为https://github.com/Caesar-github

设置Buildroot环境变量

1
2
3
4
5
# 设置环境变量
source envsetup.sh

# 根据提示的列表选择合适的配置文件,这里以LubanCat-2板卡为例,选择66. rockchip_rk3568
Which would you like? [0]:
../../_images/buildroot03.png

自定义Buildroot配置文件

1
2
# Buildroot配置
make menuconfig

Buildroot使用kconfig进行配置,其使用方法与kernel的配置基本相同,我们可以按层级打开或关闭配置,也可以直接搜索

../../_images/buildroot04.png

当我们修改完成配置以后,多次按Esc键,退出图形配置界面,如果提示是否保存配置文件,选择Yes

../../_images/buildroot05.png

修改完成配置文件以后,我们还要用新生成的配置文件覆盖原有的配置文件。不覆盖的话,在编译时会自动使用原有的文件,我们的修改就不会生效了。

1
2
# Buildroot配置
make savedefconfig
../../_images/buildroot06.png

下一步我们开始编译,可以使用make命令来进行编译,也可以使用SDK的构建脚本来进行编译。

1
2
3
4
5
# 使用make命令进行编译
make

# 使用SDK的构建脚本来进行编译
./build.sh buildroot

添加额外的软件包源码仓库

以softap模块为例,这是一个用于自动开启wifi热点的可执行文件。

首先我们修改配置文件,在配置文件中搜索softap并选中配置。

../../_images/buildroot07.png

接着保存配置文件并覆盖原有的配置文件,我们可以通过git来查看配置文件的变化

../../_images/buildroot08.png

可以看到,在配置文件rockchip_rk3568_defconfig中新增了一行 +BR2_PACKAGE_SOFTAP=y,说明配置文件被成功覆盖了。

然后我们使用make命令进行编译,如果我们的SDK不包含这个模块的源码,则会报错,我们就需要自行添加源码仓库。

../../_images/buildroot09.png

根据报错信息可知,softap模块的本地仓库地址为external/softapDemo,我们查看external目录下的内容, 发现并没有softapDemo这个目录,此时就需要手动添加模块源码了

我们查看.repo/manifests/rk356x_linux/rk356x_linux_dev_bk.xml这个文件,里面记录了所有的源码仓库信息, 找到softapDemo这一项。

1
<!-- <project remote="rk-github" dest-branch="master" name="softapDemo" path="external/softapDemo" revision="4c7d1bd3d28df276d263f49324b022b44b3a1c85" upstream="master"/> -->
  • remote:远程总仓库地址,”rk-github”=https://github.com/Caesar-github

  • dest-branch:使用的分支

  • name:远程仓库中的git仓库名称,完整的地址为remote+name=https://github.com/Caesar-github/softapDemo

  • path:本地路径,存放在SDK的external/softapDemo目录下

  • revision:指定本地编译时使用的版本git commit id

将上文中的这一行去掉 <!– –> 复制并插入到.repo/manifests/rk356x_linux/rk356x_linux_dev.xml末尾的</manifest>之前的一行

1
<project remote="rk-github" dest-branch="master" name="softapDemo" path="external/softapDemo" revision="4c7d1bd3d28df276d263f49324b022b44b3a1c85" upstream="master"/>

重新使用repo来同步所有仓库。

1
.repo/repo/repo sync -c
../../_images/buildroot10.png

使用repo同步,有时会遇到同步失败的情况,我们也可以直接使用git去拉取远端仓库, 这样虽然无法用repo命令来直接管理git仓库,但是我们可以用git来单独管理,对于编译是没有影响的。

根据上文中我们对rk356x_linux_dev.xml文件中内容的分析,我们可知softap模块存放的路径是external/softapDemo, 远程仓库地址https://github.com/Caesar-github/softapDemo,分支为master, 使用的提交版本是4c7d1bd3d28df276d263f49324b022b44b3a1c85。

我们可以使用如下命令直接使用git拉取。

1
2
3
4
5
6
7
8
# 拉取源码的master分支存放到external/softapDemo目录下
git clone --branch=master https://github.com/Caesar-github/softapDemo external/softapDemo

# 进入external/softapDemo目录下
cd external/softapDemo/

# 检出到指定提交
git checkout 4c7d1bd3d28df276d263f49324b022b44b3a1c85
../../_images/buildroot11.png

同步完成后查看源码仓库是否同步成功

../../_images/buildroot12.png

我们单独编译softap模块看能否成功

1
make softap
../../_images/buildroot13.png ../../_images/buildroot14.png

如果我们对模块源码做出了修改,可以使用以下命令对单独模块重新编译。

1
2
3
4
5
6
7
# 重新编译
make softap-rebuild

# 删除构建过程中的输出文件
make softap-dirclean
# 等同于以下命令
rm -rf /buildroot/output/rockchip_芯⽚型号/build/softap

除了使用make命令进行单独模块的编译外,还可以使用SDK构建脚本完整构建Buildroot根文件系统

1
./build.sh buildroot
../../_images/buildroot15.png

构建完成的Buildroot根文件系统镜像保存在buildroot/output/rockchip_rk3568/images下

更多关于Buildroot的构建技巧,可以参考Rockchip官方文档:https://github.com/Caesar-github/docs