利用buildroot构建rootfs

利用buildroot构建rootfs

buildroot是一个开源项目,类似于busybox的一种集成包,其主要功能是提供了交叉编译工具链和rootfs的制作。对于厂商提供的bsp包,很多时候rootfs会以buildroot的方式提供,所以学会使用buildroot来构建rootfs是很有必要的
构建rootfs的方法和kernel相同,为1.make xxxdefconfig 2.make menuconfig 3.make
但是并不推荐这样编译,推荐通过厂商提供的脚本来进行编译

1.环境搭建

  • buildroot 的运行要求宿主机ubuntu上安装诸多软件,一般来说,需要安装:
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install texinfo
sudo apt-get install hgsubversion
sudo apt-get install whois
sudo apt-get install autoconf
sudo apt-get install wget
sudo apt-get install patch
sudo apt-get install zlib
sudo apt-get install dos2unix
sudo apt-get install gawk 
  • 某些恶心的厂家还会提供32位的工具链,所以ubuntu64位的ubuntu需要32位库
sudo apt-get install lib32stdc++6
sudo apt-get install lib32z1 
sudo apt-get install lib32ncurses5 

2.开始编译

  • 推荐通过厂商提供的脚本来进行编译,这些脚本都会自动生成交叉编译工具链,但这不是最重要的,重要的是这些脚本中,含有很多编译时要用到的环境变量。这些脚本只是看上去望而生畏罢了,里面的逻辑还是非常清楚的,分析它们不仅可以知道整个buildroot的编译过程和机制,还有助于解决后面编译时会发生的一些问题
  • 然而有时,因为一些原因,实在无法利用厂商提供的脚本编译时,那我们只能手动编译了
    • 第一步 make xxxdefconfig,首先要确定,我们使用哪一套配置文件?进入configs文件夹内,就能看的不同的配置文件,从中选出和厂商提供的那一个即可
    • 第二步 make menuconfig,这一步可以对配置进行调整,如果没问题可以不调
    • 第三步 make,编译过程需要安装很多软件包,所以编译时需要全程联网

3.解决编译时软件包错误

源码错误

所谓源码错误,其实是指软件包和我们的编译器不匹配,源码级别编译报错

  • 这种情况常常出现在buildroot编译host系列工具时,这些工具用的是宿主机ubuntu上的gcc,而不是厂商在buildroot中提供的交叉编译器,所以极有可能发生错误。我的开发环境是ubuntu16.04,而buildroot是2011版本。。。host系列工具编译时就发生了大量错误

在buildroot中打patch

  • 第一种解决方法是,利用buildroot中的patch机制来更改源码。之所以要用patch,是因为buildroot在编译时是直接从下载目录中解压软件包的,没有我们手动改源码的机会。每个软件包的patch都放在buildroot/package/xxx
  • 具体方法是,在网上查好如何修改源码后,进入buildroot/dl复制一份软件包,解压后找到要修改的源文件,复制一份,然后修改。改完之后diff -Nur 老文件 新文件 > xxx.patch
  • 将xxx.patch放到buildroot/package/xxx中,注意xxx.patch名字中的xxx要改成具体的带版本的,比如autoconf-2.65.patch,这样2.65的软件包就会自动打这个补丁。然后patch文件的内容也要做修改,以autoconf-2.65.patch为例,要改成下面的样子
--- autoconf-2.65.orig/doc/autoconf.texi
+++ autoconf-2.65/doc/autoconf.texi
  • 上面的patch格式仅仅是buildroot2011版本的格式,具体格式可以抄其他软件包目录buildroot/package/xxx里的patch

更改软件包的版本

  • 第二种解决方法是,将软件包的版本改的新一点,以适配宿主机ubuntu中较新的gcc
  • 具体方法是,在buildroot/package/xxxx/xxxx.mk中修改XXX_VERSION的值,xxx就是软件包的名字
  • 一般来说,稍微改的新一点就可以了,当然本方法成功率也不是100%的

得不到软件包

buildroot在编译时会根据menuconfig来下载一些软件包到rootfs中,因为网络的关系,这一步极有可能出错,比如我这里qt软件包就出错了

  • 首先,编译时buildroot会把下载的软件压缩包放在dl中,然后再解压到rootfs
  • 此处buildroot在解压qt压缩包的时候报错了
gzip: xxxx/buildroot/dl/qt-everywhere-opensource-src-4.8.4.tar.gz: not in gzip format
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors
make: *** [xxxx/buildroot/output/build/qt-4.8.4/.stamp_extracted] Error 2
  • 报错信息的意思好像是这个压缩包文件格式不对,不是gz格式,可是后缀明明就是tar.gz呀?ls -l 一下看看,发现这个qt压缩包小得可怜,其他压缩包都比它大
    这里写图片描述
  • 再file qt-everywhere-opensource-src-4.8.4.tar.gz 一下看看,发现这文件下载的就有问题,虽然后缀是tar.gz,但其实是个文本文件
    这里写图片描述
  • 看来是下载遇到了错误,于是google这个版本的qt压缩包,下载后放入dl文件夹内。问题解决

下载失败错误

方法同上,手动下载并放到相应位置

无法解决的错误

此方法是终极方法,当前面的方法都不管用时,我们可以在defconfig或menuconfig中取消该软件包

4.得到footfs

编译后生成的文件夹格式的rootfs在buildroot/output/images/rootfs.tar。先创建一个文件夹作为根文件目录,我们将rootfs.tar解压到这个文件内,得到的就是一个完整的可以工作的文件夹形式的rootfs了

5.解决开机后无法进入控制台的问题

开机后由于一些问题可能会导致无法进入控制台,我们已经正确的进入了rootfs,在此只要修改rootfs内的配置文件即可解决一切问题

  • 比如udhcpc反复的进行 Starting network…分析可知系统在不停的获取ip地址,导致程序卡死。解决方案,修改/etc/network/interfaces,屏蔽dhcp功能,改为静态IP地址即可

  • 然后终于显示登录界面了,但是不知道密码。在此我们希望一上电就自动以root用户登录控制台,所以我们屏蔽登录功能即可。参照手动构建rootfs及文件功能分析,我们进入/etc/inittab中查看开机选项,发现有这么一行:
    这里写图片描述
    在此我们屏蔽/sbin/getty这个应用程序启动项,将其替换为:
    这里写图片描述
    这样一来,我们就能直接进入控制台了

你可能感兴趣的:(【Linux用户态使用】)