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
wget https://buildroot.org/downloads/buildroot-2017.08.tar.gz
tar xvf buildroot-2017.08.tar.gz
cd buildroot-2017.08/
make menuconfig
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主要配置以下一些内容
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 配置系统参数
6、Target package 用于配置一些软件包,例如QT5
Target packages --->
x Graphic libraries and applications (graphic/text) --->
xx [*] Qt5 --->
①、注意还要安装一下依赖
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 卡中并插在板子上运行了。