嵌入式系统制作神器 - Buildroot

来源:互联网 发布:战舰世界 岛风配件数据 编辑:程序博客网 时间:2024/05/03 17:59

From: Linux Hole

一件事对于我们的意义取决于你如何把这件事同其他的事情关联起来 - 雷.库兹韦尔

上一小节我们简单的知道了自己如何制作交叉工具链子,有人肯定是说? 怎么还玩这么老旧的东西,不都是厂商给的吗?那么请问厂商的是谁给的? 在此我声明一点,我不是做产品的,也不是做互联网。我就是一个’嵌入式程序员’,我觉得我应该关心这些问题。
今天呢,我们来认识一下新朋友 - buildroot; 后续我会以此为基点,慢慢的将业务也定制到我的这套环境中,为此我为此制作的嵌入式系统起了一个名字 - Hole
为什么叫Hole ? Hole 的本意是空洞,洞穴的意思。
记得之前在学习内存管理的时候,遇见了Memory Hole. 当时很懵逼,完全不知道到底是啥意思?后来随着工作不断的深入的学习,算是对内存管理有了一点心得(无关架构)。所以此次我也命名为hole。。

1、Buildroot

官网的开头是这么描述的 - Buildroot is a simple, efficient and easy-to-use tool to generate embedded Linux systems through cross-compilation;
意思是Buildroot 是一个简单的,高效且易用的,通过交叉编译工具定制嵌入式Linux 系统的工具。
其三大特点是:
- 1、Can handle everything - 包含了一切嵌入式系统的组件(交叉工具,根文件系统,内核,bootloader)
- 2、Is very easy - 非常简单,类似于kernel 的编译,支持menuconfig ,xconfig 等组建菜单
- 3、Supports hundreds of packages - 支持100多种主流包(完全满足嵌入式系统的一切要求)

这简直就是嵌入式开发者的福音,在也不需要一个个去移植相关软件包(组建非常吃力还不讨好),统一了交叉环境,大大的促进了行业发展,最重要的一点是Buildroot 当然是开源的啦,文档丰富,社区很活跃。

社区赞助厂商:[目前社区的赞助有Google, Mind,Free Electrons ]等等,

2、利用buildroot 生成最小系统用户态镜像

2.1、获取buildroot源码包

这里我使用的buildroot 是目前官网最新的2016.08-rc1版本(刚才我去看的时候已经变成rc2了,足以见得buildroot的活跃程度非常高)。
获取buildroot 源码

root@hole-2016:/home/hole/Linux_hole# wget https://buildroot.org/downloads/buildroot-2016.08-rc1.tar.gzroot@hole-2016:/home/hole/Linux_hole# tar xvf buildroot-2016.08-rc1.tar.gz

2.2、拷贝上一节生成的交叉工具链到buildroot 目录

root@hole-2016:/home/hole/Linux_hole# cd buildroot-2016.08-rc1root@hole-2016:/home/hole/Linux_hole/buildroot-2016.08-rc1# cp ../crosstool-ng-soucrce/x86_64-cross/x86_64-bin/  .

2.3、获取配置文件并且修改

上面我们介绍了buildroot 的目录,明确知道了buildroot 相关目录的说明,由于这里我是跑在x86_64 平台上,所以我使用下面这个config文件

root@hole-2016:/home/hole/Linux_hole/buildroot-2016.08-rc1# cp configs/qemu_x86_64_defconfig  .config

这里要稍作修改,因为buildroot 其实已经集成了crosstool-ng,其本身也支持生成工具链,但是由于我们已经生成,所以此处就不需要了,另外buildroot 还集成了内核,但是这个地方我们暂时不编译内核(比较简单),所以也去掉。既然如此,我们的修改就很明确了:
修改工具链配置选项以及去掉内核部分即可,这里为了不贴的满屏都是,我直接将我改过的config 放出来(链接见附录),大家可以compare 一下我改过的和qemu_x86_64_defconfig的差异,配置文件里面包含了root用户名的默认密码,我设置为了1;
BR2_TARGET_GENERIC_ROOT_PASSWD="1"

如果要用我的配置文件:

root@hole-2016:/home/hole/Linux_hole/buildroot-2016.08-rc1# cp ../buildroot_src/config_x86-hole  .config 

2.4、获取程序源码包

为了方便和节省时间,我已经将上述.config 要用到的源码包都放在了云盘(链接见附录),当然如果你的网速够快(一定是翻越长城快),那么你有两个选择:
第一个:直接make 边下载边编译
第二个:make souece 将所用包全部下载
另外一种选择就使用我给你的包:

root@hole-2016:/home/hole/Linux_hole/buildroot-2016.08-rc1# cp -rf ../buildroot_src/dl/* dl/ 

2.5、得到最终生成的镜像文件

编译生成最终镜像

root@hole-2016:/home/hole/Linux_hole/buildroot-2016.08-rc1# make -j 48

这里的镜像其实就是一个压缩文件

root@hole-2016:/home/hole/Linux_hole/buildroot-2016.08-rc1# ls output/images/rootfs.cpio  rootfs.cpio.gz

3、编译一个内核镜像

3.1 、编译内核镜像

内核的编译不在细述,具体细节请戳全面解析Linux 内核 3.10.x 系列文章
这里我直接写步骤

root@hole-2016:/home/hole/Linux_hole# wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.28.tar.gzroot@hole-2016:/home/hole/Linux_hole# tar xvf linux-3.10.28.tar.gzroot@hole-2016:/home/hole/Linux_hole# cd linux-3.10.28root@hole-2016:/home/hole/Linux_hole/linux-3.10.28# cp arch/x86/configs/x86_64_defconfig .configroot@hole-2016:/home/hole/Linux_hole/linux-3.10.28# make menuconfigroot@hole-2016:/home/hole/Linux_hole/linux-3.10.28# make -j 48root@hole-2016:/home/hole/Linux_hole/linux-3.10.28# ls arch/x86_64/boot/ -ltotal 0lrwxrwxrwx 1 root root 22 Aug 19 07:23 bzImage -> ../../x86/boot/bzImage

到这里,x86_64 的内核镜像已经生成;

4、制作img or vmdk 虚拟机镜像文件

4.1、下载专用制作工具 - hole-builds

root@hole-2016:/home/hole/Linux_hole/build_img/hole_tools# git clone https://github.com/bjwrkj/hole-tools

此工具包已经被我开源,其核心打包功能摘录于openwrt;

4.2、安装一些依赖软件

root@hole-2016:/home/hole/Linux_hole/build_img/hole_tools# apt-get install qemu-img 

如果不想安装,我这里当然也准备好了,链接见附录
然后将其拷贝出来,导入环境变量即可。
root@hole-2016:/home/hole/Linux_hole/build_img/hole_tools# cp -arf hole-tools-bin /usr/local/
root@hole-2016:/home/hole/Linux_hole/build_img/hole_tools# export PATH=/usr/local/hole-tools-bin/bin:$PATH

4.3、开始制作

将上述步骤生成的rootfs.cpio 以及 bzImage 分别拷贝到具体目录

root@hole-2016:/home/hole/Linux_hole/build_img/hole_tools# cp ../../linux-3.10.28/arch/x86/boot/bzImage  targets/img/x86_64/root@hole-2016:/home/hole/Linux_hole/build_img/hole_tools# cp ../../buildroot-2016.08-rc1/output/images/rootfs.cpio  targets/rootfs/

然后执行

root@hole-2016:/home/hole/Linux_hole/build_img/hole_tools# makeroot@hole-2016:/home/hole/Linux_hole/build_img/hole_tools# ls *.img hole-dist.img

好了,上面看的hole-dist.img 就是我们的虚拟机硬盘文件啦。
如果想要vdi 或者 vmdk 文件,只需要在执行
root@hole-2016:/home/hole/Linux_hole/build_img/hole_tools# make vdi
或者
root@hole-2016:/home/hole/Linux_hole/build_img/hole_tools# make vmdk

5、使用virtulbox or qmenu 启动最小系统镜像文件

5.1、使用virtualbox 启动虚拟硬盘

  • a.新建一个虚拟机
  • b.将现有虚拟硬盘添加
  • c.启动虚拟机
  • d.用户名 root 密码 1

效果图:
Hole_view0
Hole_view1

6、后记

虽然目前大家都在追逐云服务器,云计算等等,很少会有人去主动的搭建这种环境。但是,对于新手而言,通过此文章你可以了解一个嵌入式系统的组成部分,以及相关内容。对于老手而言,哪怕你上了云, 你上了docker 业务环境也是要记得搭建的; 当前世界上大概有50,60亿嵌入式设备在跑,不管你是IOT,还是VR,AR,机器人等等; 支撑业务的是始终是那千千万万的库。比较讽刺的是,核心库百分之八十是社区出的。
正如我开头标语说的一样,其原文为:
假如你只用一种方式去理解某件事情,那么你并不能真正的理解这件事。这是因为假如有一个步骤发生错误,你将会被自己的思维束缚。一件事对于我们的意义取决于你如何把这件事同其他的事情关联起来 - 出自奇点临近。


附录 - 上述安装所用安装包
源码包地址:戳这儿
密码: b37a

By: Keven - Linux Hole

2 0