前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >荔枝派Zero(全志V3S)编译rootfs

荔枝派Zero(全志V3S)编译rootfs

作者头像
Gnep@97
发布2023-08-10 09:44:24
5270
发布2023-08-10 09:44:24
举报
文章被收录于专栏:Gnep's_Technology_Blog

前言

一、rootfs是什么?

rootfs翻译过来就是根文件系统。顾名思义,它属于文件系统范畴,文件系统的作用就是用来管理、储存文件的。文件的概念对于linux来说很重要,不是有一句话叫”一切皆文件“,Linux的一切行为与操作都反映在文件上。 上文我们编译的linux源码提供的是操作系统的“灵魂”(管理和调度逻辑),但还是需要“肉身”(文件系统)来落地实现。所以,你只是编译烧录kernel,是无法正常启动的,还需要再给它搭配一个文件系统。

buildroot可用于构建小型的linux根文件系统。

大小最小可低至2M,与内核一起可以放入最小8M的spi flash中。

二、安装依赖

首先安装一些依赖,比如linux头文件:

代码语言:javascript
复制
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

代码语言:javascript
复制
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的目录结构

代码语言:javascript
复制
.
├── 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进入配置界面。

代码语言:javascript
复制
Target options  --->选择目标板架构特性。
Build options  --->配置编译选项。
Toolchain  ---> 配置交叉工具链,使用buildroot工具链还是外部提供。
System configuration  --->
Kernel  --->
Target packages  --->
Filesystem images  --->
Bootloaders  --->
Host utilities  --->
Legacy config options  --->

licheepi用的v3s cpu 参数如下

代码语言:javascript
复制
CPU
ARM Cortex A7 @ 1.2GHz
Support NEON Advanced SIMD instruction
VFPv4 Floating Point Unit

②、选择相应的参数

代码语言:javascript
复制
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 出现以下信息则交叉编译器配置成功。

代码语言:javascript
复制
线程模型:posix
gcc 版本 6.3.1 20170404 (Linaro GCC 6.3-2017.05) 

②、配置成外部工具链

代码语言:javascript
复制
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

代码语言:javascript
复制
Target packages  --->
x  Graphic libraries and applications (graphic/text)  --->
xx   [*] Qt5  ---> 

五、编译rootfs

①、注意还要安装一下依赖

代码语言:javascript
复制
sudo apt-get install g++ patch cpio python unzip rsync bc

②、在 buildroot-2017.08 目录下执行make two hours later… 报错了

代码语言:javascript
复制
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 又报错了

解决方法:

代码语言:javascript
复制
find ./ -name c-stack.c
代码语言:javascript
复制
vim ./output/build/host-m4-1.4.18/lib/c-stack.c

做如下修改:

在buildroot-2017.08目录下再继续执行make 又又报错了

解决方法: 命令行执行下面三行指令

代码语言:javascript
复制
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 卡中并插在板子上运行了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、rootfs是什么?
  • 二、安装依赖
  • 三、下载rootfs
  • 四、配置rootfs
  • 五、编译rootfs
  • 六、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档