前言
一、rootfs是什么?
rootfs翻译过来就是根文件系统。顾名思义,它属于文件系统范畴,文件系统的作用就是用来管理、储存文件的。文件的概念对于linux来说很重要,不是有一句话叫”一切皆文件“,Linux的一切行为与操作都反映在文件上。
上文我们编译的linux源码提供的是操作系统的“灵魂”(管理和调度逻辑),但还是需要“肉身”(文件系统)来落地实现。所以,你只是编译烧录kernel,是无法正常启动的,还需要再给它搭配一个文件系统。
buildroot可用于构建小型的linux根文件系统。
大小最小可低至2M,与内核一起可以放入最小8M的spi flash中。
二、安装依赖
首先安装一些依赖,比如linux头文件:
sudo apt-get install linux-headers-$(uname -r)
sudo apt-get install libncurses5-dev
sudo apt-get install wget
sudo apt-get install gcc automake autoconf libtool make
三、下载rootfs
wget https://buildroot.org/downloads/buildroot-2017.08.tar.gz
tar xvf buildroot-2017.08.tar.gz
cd buildroot-2017.08/
make menuconfig
四、配置rootfs
1、看下buildroot的目录结构
.
├── arch: #存放CPU架构相关的配置脚本,如arm/mips/x86,这些CPU相关的配置,在制作工具链时,编译uboot和kernel时很关键.
├── board
├── boot
├── CHANGES
├── Config.in
├── Config.in.legacy
├── configs: #放置开发板的一些配置参数.
├── COPYING
├── DEVELOPERS
├── dl: #存放下载的源代码及应用软件的压缩包.
├── docs: #存放相关的参考文档.
├── fs: #放各种文件系统的源代码.
├── linux: #存放着Linux kernel的自动构建脚本.
├── Makefile
├── Makefile.legacy
├── output: #是编译出来的输出文件夹.
│ ├── build: #存放解压后的各种软件包编译完成后的现场.
│ ├── host: #存放着制作好的编译工具链,如gcc、arm-linux-gcc等工具.
│ ├── images: #存放着编译好的uboot.bin, zImage, rootfs等镜像文件,可烧写到板子里, 让linux系统跑起来.
│ ├── staging
│ └── target: #用来制作rootfs文件系统,里面放着Linux系统基本的目录结构,以及编译好的应用库和bin可执行文件. (buildroot根据用户配置把.ko .so .bin文件安装到对应的目录下去,根据用户的配置安装指定位置)
├── package:#下面放着应用软件的配置文件,每个应用软件的配置文件有Config.in和soft_name.mk。
├── README
├── support
├── system
├── toolchain
└── utils # 实用工具
一般通过make xxx_defconfig来选择一个defconfig,这个文件在configs目录下。
当configs中不存在对应的开发板时,我们就要手动从头配置一遍。
2、选中Target options以选择licheepi对应的架构
①、使用make menuconfig进入配置界面。
Target options --->选择目标板架构特性。
Build options --->配置编译选项。
Toolchain ---> 配置交叉工具链,使用buildroot工具链还是外部提供。
System configuration --->
Kernel --->
Target packages --->
Filesystem images --->
Bootloaders --->
Host utilities --->
Legacy config options --->
licheepi用的v3s cpu 参数如下
CPU
ARM Cortex A7 @ 1.2GHz
Support NEON Advanced SIMD instruction
VFPv4 Floating Point Unit
②、选择相应的参数
Target Architecture (ARM (little endian)) --->
Target Binary Format (ELF) --->
Target Architecture Variant (cortex-A7) --->
Target ABI (EABIhf) --->
Floating point strategy (VFPv4-D16) --->
ARM instruction set (ARM) --->
进入到界面后使用空格键选择对应的选项
3、 Build options主要配置以下一些内容
-
配置文件保存位置,将配置文件保存的好处是,在重新构建时,只需要调用make <xxx_defconfig>然后make,而不必重新全部配置。
示例:$(CONFIG_DIR)/configs/LicheePi_Zero_defconfig,。然后make savedefconfig保存配置文件。
-
配置下载位置,因为系统构建的时候需要从网络上抓起很多软件报的代码进行编译构建。这个一般不需要修改。
-
strip target binaries建议使能,这样会使文件尺寸变小。
-
对于其他的选项基本可以不做修改。
4、Toolchain 配置交叉工具链
①、因为之前开发uboot和内核都用到了自己下载的工具链,所以这里也配置成外部工具链。
荔枝派Zero(全志V3S)编译Uboot及配置 一文中已讲解如何安装交叉编译器,这里不再做解释
执行 arm-linux-gnueabihf-gcc -v 出现以下信息则交叉编译器配置成功。
线程模型:posix
gcc 版本 6.3.1 20170404 (Linaro GCC 6.3-2017.05)
②、配置成外部工具链
Toolchain type (External toolchain) --->
x ( ) Buildroot toolchain
x (X) External toolchain
5、System configuration 配置系统参数
- System hostname:根据需要定义一个字符串,是控制台前面的提示符xxx@vsi,这里改为 (licheepi) System hostname
- Init system:这里选择busybox,轻量级使用非常广泛。可选的有systemV,systemd.
- Root password配置登录密码。
6、Target package
用于配置一些软件包,例如QT5
Target packages --->
x Graphic libraries and applications (graphic/text) --->
xx [*] Qt5 --->
五、编译rootfs
①、注意还要安装一下依赖
sudo apt-get install g++ patch cpio python unzip rsync bc
②、在 buildroot-2017.08 目录下执行make
two hours later…
报错了
libfakeroot.c: In function ‘chown’:
libfakeroot.c:99:40: error: ‘_STAT_VER’ undeclared (first use in this function)
99 | #define INT_NEXT_STAT(a,b) NEXT_STAT64(_STAT_VER,a,b)
原因:由于fakeroot别人修复了一个bug,把_STATA_VER删掉了,重新打上最新的补丁即可。
解决方法:
从我的百度网盘里面自取
链接:https://pan.baidu.com/s/1HYoj8E7ht0elF8QKzzZRSw
提取码:tal3
或者访问这个链接
解压进入后将package/fakeroot/下所有文件替换到原buildroot-2017.08/package/fakeroot
替换之后目录下的文件:
在buildroot-2017.08目录下继续执行make
又报错了
解决方法:
find ./ -name c-stack.c
vim ./output/build/host-m4-1.4.18/lib/c-stack.c
做如下修改:
在buildroot-2017.08目录下再继续执行make
又又报错了
解决方法:
命令行执行下面三行指令
cd output/build/host-m4-1.4.18/
sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c
echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h
在buildroot-2017.08目录下再继续执行make
终于成功了,编译完成后会在 output/images 下生成 rootfs.tar,
六、总结
整整搞了一下午加一个晚上,终于把 rootfs 编译成功了,其中遇到了很多坑,多半是由于版本不兼容的原因,但方法总比困难多,下篇文章我们就可以将之前编译的 uboot、linux 以及本文编译的 rootfs 烧录到 sd 卡中并插在板子上运行了。
我的qq:2442391036,欢迎交流!